文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

js拖拽效果的原理及实现

2024-04-02 19:55

关注

拖拽功能主要是用在让用户做一些自定义的动作,比如拖动排序,弹出框拖动移动等等

拖拽的流程动作

1、鼠标按下 会触发onmousedown事件

2、鼠标移动 会触发onmousemove事件

3、鼠标松开 会触发onmouseup事件

拖拽原理

1.鼠标按下+鼠标移动 = 拖拽-------事件 onmousedown + onmousemove

2.鼠标松开 = 无拖拽--------停止拖拽 onmouseup

3.鼠标偏移 = 拖拽距离

当点击dom的时候,记录当前鼠标的坐标值,也就是x、y值,以及被拖拽的dom的top、left值,而且还要在鼠标按下的回调函数里添加鼠标移动的事件:


document.addEventListener(“mousemove”, moving, false)

和添加鼠标抬起的事件


document.addEventListener(“mouseup”,function() {
document.removeEventListener(“mousemove”, moving, false);
}, false);

这个抬起的事件是为了解除鼠标移动的监听,因为只有在鼠标按下才可以拖拽,抬起就停止不会移动了。

当鼠标按下鼠标移动的时候,记录移动中的x、y值,那么这个被拖拽的dom的top和left值就是:
top=鼠标按下时记录的dom的top值+(移动中的y值 - 鼠标按下时的y值)
left=鼠标按下时记录的dom的left值+(移动中的x值 - 鼠标按下时的x值);


//极简单版
   var div=document.querySelector("div");
    // 按下时开始监听在文档中鼠标移动的事件
    // 开始监听鼠标松开键的事件
    // 只有按下时才准备拖拽
    div.onmousedown=function(e1){
        // 当鼠标在文档移动时,不能再div上移动,因为鼠标可能离开div,造成无法拖拽
        div.onmousemove=function(e){
            // 当鼠标移动时,将当前鼠标相对视口的坐标赋值给元素的left和top
            // 因为我们需要在按下的位置拖拽,因此我们还需要获取按下键鼠标相对div的左上角位置
            // 使用当前鼠标位置减去这个相对元素的左上角位置,保证鼠标所按位置拖拽
            div.style.left=e.clientX-e1.offsetX+"px";
            div.style.top=e.clientY-e1.offsetY+"px";
        }
        // 当释放鼠标键时,删除鼠标移动事件和删除鼠标释放事件
        div.onmouseup=function(){
            document.onmousemove=null;
            document.onmouseup=null;
        }
    }

//简单版
    var div=document.querySelector("div");
    var offsetX,offsetY;
    div.addEventListener("mousedown",mouseDownHandler);

    function mouseDownHandler(e){
        offsetX=e.offsetX
        offsetY=e.offsetY
        document.addEventListener("mousemove",mousemoveHandler)
        document.addEventListener("mouseup",mouseupHandler)
    }

    function mousemoveHandler(e){
        div.style.left=e.clientX-offsetX+"px"
        div.style.top=e.clientY-offsetY+"px"
    }

    function mouseupHandler(e){
        document.removeEventListener("mousemove",mousemoveHandler)
        document.removeEventListener("mouseup",mouseupHandler)
    }

// 简单升级版
    var div=document.querySelector("div");
    var offsetX,offsetY;
    div.addEventListener("mousedown",mouseHandler);

    function mouseHandler(e){
        if(e.type==="mousedown"){
            offsetX=e.offsetX;
            offsetY=e.offsetY;
            document.addEventListener("mousemove",mouseHandler)
            document.addEventListener("mouseup",mouseHandler)
        }else if(e.type==="mousemove"){
            div.style.left=e.clientX-offsetX+"px"
            div.style.top=e.clientY-offsetY+"px"
        }else if(e.type==="mouseup"){
            document.removeEventListener("mousemove",mouseHandler)
            document.removeEventListener("mouseup",mouseHandler)
        }
}

a、被拖拽的元素的样式要设置成绝对或相对位置才有效果。
b、拖拽加到document,不然内容会脱离

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯