拖拽元素

最简单的方式拖拽,实现就是,给div 添加一个鼠标按下的事件onmousedown,在onmousedown 事件中在添加文档的鼠标移动事件onmousemove,并且在onmousemove事件中设置div

的属性  前提 div元素必须是position:absulote 绝度定位 ,之后在给div添加onmouseup事件,在此事件中把 document的onmousemove事件设置为null。

这种方法不现实,如果是10个div拖拽呢?

      var div=document.querySelector("div");
        div.onmousedown=function(e){
        //当我们鼠标按下的时候,获取鼠标离div 左边和上边的距离
        var x=e.offsetX;
        var y=e.offsetY;
document.onmousemove
=function(e){ div.style.position="absolute";
          //减去x和y 就是当我们点击鼠标拖拽的时候,不减去总会在元素的左上角,减去点击哪里拖拽就在哪里拖拽 div.style.left
=e.clientX-x+"px"; div.style.top=e.clientY-y+"px"; } div.onmouseup=function(e){
          //当鼠标按键松开时,移除document的鼠标移动事件 document.onmousemove
=null; } }

第二种方法,封装成方式,可以多个拖拽元素调用,尽量不要在函数中出现全局变量

<!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>
        div{
             50px;
            height: 50px;
            background-color: red;
            position: absolute;
        }
    </style>
</head>
<body>
    <div></div>


    <script>
        var div=document.querySelector("div");
        var x=0;
        var y=0;
        //这里也可以不用定义 我们使用对象添加属性的方式
        div.addEventListener("mousedown",mouseDownHandler);

        function mouseDownHandler(e){
            x=e.offsetX;
            y=e.offsetY;
            //this.x=e.offsetX;
            //this.y=e.offsetY;
            //替换div
            document.elem=this;
            document.addEventListener("mousemove",mouseMoveHandler);
            this.addEventListener("mouseup",mouseUpHandler);
        }

        function mouseMoveHandler(e){
            //这里就的this是document,因为鼠标移动事件是给document的添加的
            //div.style.left=e.clientX-this.x+"px";
            //div.style.left=e.clientX-this.y+"px";

            //这里还是div  后续封装的话也是一个缺点
            div.style.left=e.clientX-x+"px";
            div.style.top=e.clientY-y+"px";
            //以上代码就可以改成this.eleme.style.left=e.client-this.x+“px”;

        }

        function mouseUpHandler(e){
            document.removeEventListener("mousemove",mouseMoveHandler);
        }
    </script>
</body>
</html>

拖拽多个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>
        div{
             50px;
            height: 50px;
            background-color: red;
            position: absolute;
        }
    </style>
</head>
<body>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>


    <script>
        var div=document.querySelectorAll("div");
        for(var i=0;i<div.length;i++){
            div[i].addEventListener("mousedown",mouseDownHandler);
        }
        function mouseDownHandler(e){
            //阻止默认行为
            e.preventDefault();
            document.x=e.offsetX;
            document.y=e.offsetY;
            document.elem=this;
            document.addEventListener("mousemove",mouseMoveHandler);
            this.addEventListener("mouseup",mouseUpHandler);
        }

        function mouseMoveHandler(e){
            this.elem.style.left=e.clientX-this.x+"px";
            this.elem.style.top=e.clientY-this.x+"px";
        }

        function mouseUpHandler(e){
            document.removeEventListener("mousemove",mouseMoveHandler);
        }
    </script>
</body>
</html>

 拖拽元素完善

<!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>
        div{
            background-color: red;
             50px;
            height: 50px;
            position: absolute;
        }
    </style>
</head>
<body>
    <div></div>


    <script>
        //获取div
        var div=document.querySelector("div");
        //添加事件
        div.addEventListener("mousedown",mouseHandler);
        //事件回调函数
        function mouseHandler(e){
            //多重判断e.type e.type就是事件的名称,如果是点击事件就是click
            switch(e.type){
                //如果是鼠标按下事件
                case "mousedown":
                    //阻止默认行为
                    e.preventDefault();
                    //给document添加鼠标移动事件,并且调用自身  why?  以为你会判断e.type
                    document.addEventListener("mousemove",mouseHandler);
                    //前期学事件的loop的时候,我们都没明白  之间的执行原理,先执行普通的语句,如果是异步 会放到队列中
                    this.addEventListener("mouseup",mouseHandler);
                    //给div添加一个x的属性,并赋值鼠标点击的位置
                    this.x=e.offsetX;
                    this.y=e.offsetY;
                    //给文档添加一个属性并把div赋值给文档
                    document.elem=this;
                break;
                //鼠标移动事件
                case "mousemove":
                    //设置div的left=当前鼠标在文档的x坐标减去鼠标离div的x距离
                    document.elem.style.left=e.clientX-document.elem.x+"px";
                    document.elem.style.top=e.clientY-document.elem.y+"px";
                break;
                //鼠标释放事件
                case "mouseup":
                    //移除文档移动事件
                    document.removeEventListener("mousemove",mouseHandler);
                    break;

            }
        }
    </script>
</body>
</html>

  

原文地址:https://www.cnblogs.com/xiaowie/p/13722357.html