js实现拖拽

举报
猫先生c 发表于 2022/11/19 10:11:35 2022/11/19
【摘要】 mousedown、mousemove、mouseup监听这三个事件。offsetLeft:返回元素与有定位的父类的上左边距,如果父类都没有定位,那么返回相对于页面的上左边距。scrollTop:滚动条滚动过的高度。要对移动对象使用绝对定位,脱离文档流,相对定位不会脱离文档流,还会占据空间,除非使用z-index元素的位置x = 鼠标现在的位置x-(鼠标之前的位置x-元素的左偏移量)移动和鼠...

mousedown、mousemove、mouseup监听这三个事件。

  • offsetLeft:返回元素与有定位的父类的上左边距,如果父类都没有定位,那么返回相对于页面的上左边距。
  • scrollTop:滚动条滚动过的高度。
  • 要对移动对象使用绝对定位,脱离文档流,相对定位不会脱离文档流,还会占据空间,除非使用z-index
  • 元素的位置x = 鼠标现在的位置x-(鼠标之前的位置x-元素的左偏移量)
  • 移动和鼠标松开后是对document的绑定,移动过程中是监听移动的行为,用window.mousemove

图片示意

代码实现

<style>
    img {
        position: relative;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
    }
</style>
<body style="margin: 0;">
    <img id='dv' src="https://picsum.photos/200/300" />
</body>
<script>
    //获取元素
    var dv = document.getElementById('dv');
    var x = 0, y = 0, l = 0, t = 0;
    var isDown = false;
    //鼠标按下事件
    dv.onmousedown = function (e) {
        //获取x坐标和y坐标,浏览器左上角可视区域
        x = e.clientX;
        y = e.clientY;
        //获取左部和顶部的偏移量,根据盒子的中心来计算
        l = dv.offsetLeft;
        t = dv.offsetTop;
        //开关打开
        isDown = true;
        //设置样式  
        dv.style.cursor = 'move';
        console.log({ x })
        console.log({ y })
        console.log({ l })
        console.log({ t })
    }
    //鼠标移动
    window.onmousemove = function (e) {
        e.preventDefault()
        if (isDown == false) {
            return;
        }
        //获取x和y
        var nx = e.clientX;
        var ny = e.clientY;
        //计算移动后的左偏移量和顶部的偏移量
        var nl = nx - (x - l);
        var nt = ny - (y - t);

        dv.style.left = nl + 'px';
        dv.style.top = nt + 'px';
    }
    //鼠标抬起事件
    dv.onmouseup = function () {
        //开关关闭
        isDown = false;
        dv.style.cursor = 'default';
    }
</script>
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。