JavaScript鼠标拖动

 下面先看一个有bug的版本,就是鼠标移动太快后方块会跟不上鼠标的移动,然后鼠标就离开了方块区域,而事件都是绑定在方块(div)上的,所以当鼠标离开方块后方块就停了下来,当鼠标(无论是否松开鼠标左键)回到方块区域方块又会跟着鼠标移动。

出现这种问题的原因是:系统监听鼠标移动的频次小于鼠标移动的频次。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>鼠标拖动</title>
</head>
<body>
    <div style="width:100px;height:100px;background-color:red;position:absolute;left:0;top:0;"></div>
    <script type="text/javascript">
        var div=document.getElementsByTagName('div')[0];
        var disX,//鼠标与方块左上角顶点的差值
            disY;
       div.onmousedown=function(e){
           disX=e.pageX-parseInt(div.style.left);
           disY=e.pageY-parseInt(div.style.top);
          div.onmousemove=function(e){
               var event=e||window.event;//兼容
               div.style.left=e.pageX-disX+"px";//减去差值
               div.style.top=e.pageY-disY+"px";
           }
           div.onmouseup=function(){
              div.onmousemove=null;
           }
       }
    </script>
</body>
</html>

解决的方案就是不把onmousemove绑定在方块上,而是绑定在document上,鼠标怎么移动也不可能移出document,而onmousedown依旧绑定在div上。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>鼠标拖动</title>
</head>
<body>
    <div style="width:100px;height:100px;background-color:red;position:absolute;left:0;top:0;"></div>
    <script type="text/javascript">
        var div=document.getElementsByTagName('div')[0];
        var disX,//鼠标与方块左上角顶点的差值
            disY;
       div.onmousedown=function(e){
           disX=e.pageX-parseInt(div.style.left);
           disY=e.pageY-parseInt(div.style.top);
          document.onmousemove=function(e){//div->document
               var event=e||window.event;//兼容
               div.style.left=e.pageX-disX+"px";//减去差值
               div.style.top=e.pageY-disY+"px";
           }
           document.onmouseup=function(){//div->document
              document.onmousemove=null;  //div->document
           }
       }
    </script>
</body>
</html>

以上代码来自视频https://ke.qq.com/webcourse/index.html#cid=231577&term_id=100273169&taid=1731610554894489&vid=d1419v9ipcp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值