js实现快速拖拽(定时器版本)

一、原理

onmousemove实时获取鼠标坐标,定时器刷新dom元素坐标。能较快实现拖拽。
注意:在较大幅度晃动鼠标时仍然会失效,元素尺寸越小拖拽效果越差(即元素拖拽速度越慢)。

二、代码

<html>
<div id="test" style="position:fixed;left:100px;top:100px;background-color:black;width:100px;height:100px;"></div>
<script>
  var dom=document.getElementById('test');
  var initX,initY,//初始坐标,鼠标相对元素的坐标
  timer,//定时器
  refreshRate=250;//刷新率250
  var mx,my;//当前鼠标坐标
  dom.onmousedown = function (event) {
          var p=getElPosition(dom);//获取dom初始坐标
          initX=event.clientX-p.x;
          initY=event.clientY-p.y;
          //console.log(initX,initY,event.clientX,event.clientY);
          timer=setInterval(function(){
            checkMove(event)
          },1000/refreshRate);
      }
      dom.onmousemove=function(event){//刷新鼠标当前坐标
          mx=event.clientX;
          my=event.clientY;
      }
      dom.onmouseup = function () {//移除定时器
              clearInterval(timer);
          }
      dom.onmouseout = function () {//移除定时器
              clearInterval(timer);
          }
      var checkMove = function (event) {//刷新元素显示
        // 移动事件
        // mx// 当前鼠标距离屏幕X的距离
        //my // 当前鼠标距离屏幕Y的距离

        // 获取页面宽高
        var bodyW = document.documentElement.clientWidth;
        var bodyH = document.documentElement.clientHeight;
        // 获取盒子宽高
        var boxH = dom.offsetHeight;
        var boxW = dom.offsetWidth;
        //可移动距离
        var avX = -initX + mx, avY = -initY + my;
        //console.log(bodyH,bodyW)
        console.log(666,event.clientX,event.clientY)
        if (avX < 0) avX = 0;
        if (avY < 0) avY = 0;
        if (boxW - initX + mx > bodyW) avX = bodyW - boxW;
        if (boxH - initY + my > bodyH) avY = bodyH - boxH;
        //修改元素坐标
        dom.style.left = avX + 'px';
        dom.style.top = avY + 'px';
        //console.log(avX,avY,mx,my)
    };
    var getElPosition = function(el){//获取元素绝对坐标,el为元素
    var t = el.offsetTop,
        l = el.offsetLeft;
    while( el = el.offsetParent){
        t += el.offsetTop;
        l += el.offsetLeft;
    }
    return {
        x : l ,
        y : t
    };
};
  </script>
</html>

总结

比只使用事件机制提高了一些,元素越大效果越好。

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue可以使用Konva.js库来实现多边形的拖拽效果。以下是一个简单的实现示例: 1. 首先,我们需要在Vue项目中引入Konva.js库。可以通过npm安装或直接引入CDN链接。 2. 在Vue组件中,我们可以通过使用Konva的Stage和Layer组件来创建画布和图层。 3. 在data中定义多边形的坐标和其他相关属性。例如,我们可以定义一个数组polygons,每个元素包含多边形的id、坐标和颜色信息。 4. 在mounted钩子函数中,初始化Konva实例并为每个多边形创建Konva的Shape对象,并将其添加到Layer中。 5. 实现拖拽功能,可以使用Konva的dragBoundFunc属性来限制拖拽的范围。我们可以通过添加事件处理程序来监听拖拽事件,并更新多边形的坐标。 6. 将Layer添加到Stage中,并在template中将Stage渲染到页面上。 下面是一个简单示例组件的代码: ``` <template> <div> <div ref="stageContainer"></div> </div> </template> <script> import Konva from 'konva' export default { data() { return { polygons: [ { id: 1, points: [100, 100, 200, 100, 150, 200], color: 'blue' }, { id: 2, points: [300, 100, 400, 100, 350, 200], color: 'red' }, ], }; }, mounted() { const stage = new Konva.Stage({ container: this.$refs.stageContainer, width: 500, height: 300 }); const layer = new Konva.Layer(); stage.add(layer); this.polygons.forEach(polygon => { const shape = new Konva.Line({ points: polygon.points, fill: polygon.color, draggable: true, dragBoundFunc: function (pos) { const stageWidth = stage.width(); const stageHeight = stage.height(); const shapeWidth = this.width(); const shapeHeight = this.height(); const x = pos.x < 0 ? 0 : pos.x; const y = pos.y < 0 ? 0 : pos.y; return { x: x > stageWidth - shapeWidth ? stageWidth - shapeWidth : x, y: y > stageHeight - shapeHeight ? stageHeight - shapeHeight : y }; } }); layer.add(shape); shape.on('dragmove', () => { polygon.points = shape.points(); }); }); }, }; </script> ``` 以上示例演示了如何使用Vue和Konva.js实现多边形的拖拽效果。请注意,这只是一个简单的示例,并且可以根据具体需求进行适当的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值