趋向完美的“拖拽”。

 var div=document.getElementById("div1");
        div.onmousedown=function(e1){//在div上点击时执行
            //console.log(e1.clientX,e1.clientY,e1.offsetX,e1.offsetY);
            document.onmousemove=function(e2){//在文档上移动事件
                console.log(e2);
                div.style.left=e2.clientX-e1.offsetX+"px";
                //鼠标在移动中距离页面右上角的宽高   --减去
                // 在div上点击时鼠标离目标元素即div右上角的距离
                div.style.top=e2.clientY-e1.offsetY+"px";

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

            }
        } 

第二种

 var div=document.getElementById("div1");
         var x,y;
         div.addEventListener("mousedown",click);
         function click(e) {
             x=e.offsetX;
             y=e.offsetY;
             document.addEventListener("mousemove",mouseMove);
             document.addEventListener("mouseup",mouseUp);

         }
         function mouseMove(e) {
             div.style.left=e.clientX-x+"px";
             div.style.top=e.clientY-y+"px";
         }
         function mouseUp(e) {
             document.removeEventListener("mouseMove",mouseMove);
             document.removeEventListener("mouseMove",mouseUp);
         }

第三种
多个div,不设置全局变量

var div=document.querySelectorAll(".div1");
        for (let i = 0; i < div.length; i++) {
            
            div[i].addEventListener("mousedown",mouseHandler)
            
        }
        function mouseHandler(e) {
            //this是DIV的
            document.elem=this;
            document.x=e.offsetX;//给document添加x属性;
            document.y=e.offsetY;//给document添加y属性;
            document.addEventListener("mousemove",mouseMove);
            document.addEventListener("mouseup",mouseUp);
        }
        function mouseMove(e) {
            //this是document,document是对象,已经设置了x,y,elem
            this.elem.style.left=e.clientX-this.x+"px";
            this.elem.style.top=e.clientY-this.y+"px";

        }
        function mouseUp(e) {
            console.log(this);
            document.removeEventListener("mousemove",mouseMove);
            document.removeEventListener("mouseup",mouseUp);
        } 

第四种
当拖拽元素有父元素时

var div = document.querySelectorAll(".div1");
        for (let i = 0; i < div.length; i++) {
            div[i].addEventListener("mousedown", mouseHandler)
        }

        function mouseHandler(e) {
            switch (e.type) {
                case "mousedown":
                    e.preventDefault();
                    document.elem=this;
                    document.x=e.offsetX;
                    document.y=e.offsetY;
                    document.addEventListener("mousemove",mouseHandler);
                    document.addEventListener("mouseup",mouseHandler);
                    break;
                case "mousemove":
                    var rect=this.elem.parentElement.getBoundingClientRect();//获取父元素的位置,比如宽高
                    this.elem.style.left=e.clientX-rect.x-this.x+"px";
                    console.log(rect,this.elem.offsetWidth);
                    this.elem.style.top=e.clientY-rect.y-this.y+"px";
                    if (this.elem.offsetLeft<0)  this.elem.style.left="0px";
                    if (this.elem.offsetTop<0)  this.elem.style.top="0px";
                    //offsetLeft offsetTop,等同于定位的left和top,如果没有定位,向上寻找到定位的父容器位置
                    //从左上角的位置(从父容器的padding开始)开始算,如果没找到就相对页面定位
                    if (this.elem.offsetLeft>rect.width-this.elem.offsetWidth)  this.elem.style.left=rect.width-this.elem.offsetWidth+"px";
                    // offsetWidth=width+padding+border
                    if (this.elem.offsetTop>rect.height-this.elem.offsetHeight)  this.elem.style.top=rect.width-this.elem.offsetWidth+"px";


                    break;
                case "mouseup":
                   this.removeEventListener("mousemove",mouseHandler);
                   this.removeEventListener("mouseup",mouseHandler);


                    break;
            }
        }

html

<div class="divs">
        <div class="div0">
            <div class="div1"></div>
            <div class="div1"></div>
            <div class="div1"></div>
            <div class="div1"></div>
            <div class="div1"></div>
            <div class="div1"></div>
        </div>
    </div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值