JavaScript demo练习之拖拽div

一、功能概述

使标签为div的方块随鼠标拖动而移动,松开停下。

二、实现步骤

  1. 为div绑定onmousedown和onmousemove事件。
  2. 获取div原始位置。
  3. 获取鼠标坐标。
  4. 更新div位置。
  5. 为div绑定onmouseup事件。

三、代码实现

var div = document.querySelector("div");
div.onmousedown = function (e1) {
    if (e1.which == 1) {
        let dx = e1.clientX - div.offsetLeft;
        let dy = e1.clientY - div.offsetTop;
        document.onmousemove = function (e2) {
            div.style.left = e2.clientX - dx + "px";
            div.style.top = e2.clientY - dy + "px";
        }
        document.onmouseup = function () {
            document.onmousemove = null;
            document.onmouseup=null;
        }
    }
}

四、问题总结

1. 为document而不是div绑定onmousemove和onmouseup事件。

若给div绑定onmousemove事件,当鼠标快速移动导致划出div区域时,div不再随鼠标移动,因为此时的onmouseup发生在div之外。
同理若给div绑定onmouseup事件,若div还有兄弟节点,且其兄弟节点的z-index更大,那么当鼠标拖拽到兄弟节点区域再松开时,div仍然跟随鼠标移动。这也是因为onmouseup事件不是发生在div区域内,且因为是兄弟节点,无法冒泡。
既然给document绑定了onmouseup,那么就要在使用之后及时销毁它,否则在页面的其他地方点击鼠标时还是会触发函数,即这里的onmouseup是一次性的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值