JavaScript拖拽原理及兼容性问题

前言:第一次写博客,心理有点小激动,如果有什么错误或者不懂的地方欢迎留言^-^

1.原理

前提:元素已经定位.
拖拽过程:
第一步:按住鼠标左键点击目标(以下均用oDiv说明).
第二步:拖拽oDiv.
第三步:释放鼠标左键.
思路:
通过获取最初的鼠标点击的位置,得到鼠标到oDiv边框的距离(如:disX),再用拖拽后的鼠标位置减去到边框的距离即可得到拖拽后的top,left.(如:oDiv.style.left=ev.clientX-distance.disX+’px’;)

这里写图片描述

<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <style type="text/css">
    body{margin: 0;padding: 0;}
    #oDiv{width: 100px;height: 100px;position: absolute;background-color:#a6e22e;left: 50px;top:50px;border-radius: 50%;}
    </style>
    <script type="text/javascript">
    window.onload=function (){
        var oDiv=document.getElementById('oDiv');

        oDiv.onmousedown=function (onEvent,obj){
            obj=this;
            var ev=onEvent||event;
            var distance={};
            distance.disX=ev.clientX-obj.offsetLeft;//到左边框的距离
            distance.disY=ev.clientY-obj.offsetTop;//到上边框的距离


            document.onmousemove=function (onEvent){
                var ev=onEvent||event;
                obj.style.left=ev.clientX-distance.disX+'px';
                obj.style.top=ev.clientY-distance.disY+'px';
            }

            document.onmouseup=function (){
                document.onmouseup=document.onmousemove=null;
            }

        }
    }
    </script>
</head>
<body>
    <div id="oDiv">
    </div>
</body>
</html>

2.浏览器兼容性问题

如果选择文字时拖拽会出下以下情况,文字也一起拖拽了,用户体验不好.

火狐下的截图

具体情况依据浏览器而定,图片太多就不一一截图了.

3.解决方法

产生原因:当有文字被选中时鼠标按下拖拽会触发浏览器默认拖拽文字效果.
具体措施:
在标准浏览器下:阻止onmousedown的默认行为,在onmousedown最后加上一句return false;
火狐下截图
以上方法对非标准浏览器没有用(如IE7):
不支持CSS3所以是方的
非标准下解决方案:利用全局捕获,使得oDiv捕获所有的事件,从而消去浏览器的默认行为,不过最后要记得删除全局捕获(部分浏览器不支持)
这里写图片描述

具体代码

<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <style type="text/css">
    body{margin: 0;padding: 0;}
    #oDiv{width: 100px;height: 100px;position: absolute;background-color:#a6e22e;border-radius: 50%;}
    </style>
    <script type="text/javascript">
    window.onload=function (){
        var oDiv=document.getElementById('oDiv');

        oDiv.onmousedown=function (onEvent,obj){
            obj=this;
            var ev=onEvent||event;
            var distance={};
            distance.disX=ev.clientX-obj.offsetLeft;//到左边框的距离
            distance.disY=ev.clientY-obj.offsetTop;//到上边框的距离

            if(obj.setCapture)
                obj.setCapture();

            document.onmousemove=function (onEvent){
                var ev=onEvent||event;
                obj.style.left=ev.clientX-distance.disX+'px';
                obj.style.top=ev.clientY-distance.disY+'px';
            }

            document.onmouseup=function (){
                document.onmouseup=document.onmousemove=null;
                if(obj.setCapture)
                    obj.releaseCapture();
            }
            return false;
        }
    }
    </script>
</head>
<body>
    这是一段文字
    <div id="oDiv">
    </div>
</body>
</html>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值