JS-拖拽实现

利用事件绑定,来实现拖拽。效果类似于电脑桌面上的快捷方式位置移动

  • 鼠标按下
  • 鼠标移动
  • 鼠标松开
    重点在于鼠标的移动过程中,如何使鼠标点击div的位置在移动过程中,一直与div保持相对固定,不会出现鼠标跳点到div左上角的情况
    方式有2种:①控制鼠标②控制div
    显然只能控制div,因为鼠标的移动是用户通过外部硬件来进行控制的

解决坐标问题
解决坐标问题
代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #box1{
            height: 100px;
            width: 100px;
            position: absolute;
            background-color: green;
        }
        #box2{
            top: 200px;
            height: 100px;
            width: 100px;
            position: absolute;
            background-color: hotpink;
            overflow: auto;
        }
    </style>
    <script>
        window.onload=function(){
            //获取box1的对象
            var box1 = document.getElementById("box1");

            box1.onmousedown=function(event){
                 //为box1提供事件捕获
                box1.setCapture&&box1.setCapture()
                //鼠标按下,并触发事件
                event = event||window.event
                //div的偏移量:鼠标.clientx - 元素.offleft  鼠标.clienty - 元素.offTop
                var le = event.clientX - box1.offsetLeft;
                var lt = event.clientY - box1.offsetTop;
                //鼠标移动,添加触发响应事件
                document.onmousemove=function(event){
                    //触发响应事件兼容
                    event = event||window.event; 
                    //获取鼠标坐标
                    var top = event.clientY - lt;
                    var left = event.clientX - le;
                    //修改box1的位置
                    box1.style.top = top+"px";
                    box1.style.left = left+"px";

                };
                document.onmouseup=function(){
                    //取消onmousemove事件
                    document.onmousemove=null;
                    //取消onmouseup事件
                    document.onmouseup = null;
                    //鼠标松开,取消捕获
                    box1.releaseCapture&&box1.releaseCapture()
                };
                /*当我们拖拽一个网页的内容时,浏览器会默认去搜索引擎中的搜索内容
                此时会导致拖拽异常,这是浏览器的默认行为,如果不希望发生使用return false来取消
                但对IE8不起作用
                */
                return false;
            };

        };
    </script>
</head>
<body>
    <div id="box1"></div>
    <div id="box2"></div>
</body>
</html>
  • 要使box2也实现拖拽,只需将代码封装为一个函数,函数的参数为obj即可