js拖拽效果的原理及实现

作者:翊希 时间:2024-04-10 10:43:29 

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

拖拽的流程动作

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,不然内容会脱离

来源:https://blog.csdn.net/qq_44957616/article/details/105347921

标签:js,拖拽
0
投稿

猜你喜欢

  • Pycharm远程调试和MySQL数据库授权问题

    2024-01-14 10:56:00
  • Python自动登录126邮箱的方法

    2022-11-19 05:01:17
  • Pytorch自动求导函数详解流程以及与TensorFlow搭建网络的对比

    2023-07-08 18:44:37
  • Pycharm之快速定位到某行快捷键的方法

    2022-06-20 14:07:53
  • python使用paramiko实现ssh的功能详解

    2023-03-29 04:10:34
  • 给你一面国旗 教你用python画中国国旗

    2023-06-25 15:10:36
  • 解析mysql 缓存如何使用内存

    2024-01-19 05:21:32
  • Python实现处理管道的方法

    2022-05-17 22:58:29
  • javascript计算星座属相(十二生肖属相)示例代码

    2024-05-02 17:24:11
  • PHP 使用redis简单示例分享

    2024-05-05 09:18:16
  • vue使用Google Recaptcha验证的实现示例

    2024-05-13 09:08:25
  • python字符串string的内置方法实例详解

    2022-06-14 01:10:23
  • python 实现的车牌识别项目

    2023-09-02 07:27:48
  • Python中json.dumps()函数的使用解析

    2022-11-04 19:41:09
  • 如何理解PHP程序执行的过程原理

    2023-10-08 14:45:10
  • 利用Python绘制好看的玫瑰花图

    2022-01-05 00:14:56
  • hmac模块生成加入了密钥的消息摘要详解

    2023-05-17 09:26:46
  • python代码检查工具pylint 让你的python更规范

    2021-07-03 12:06:38
  • 记一次成功的sql注入入侵检测附带sql性能优化

    2011-09-30 11:29:39
  • 排序与检索

    2008-05-18 13:09:00
  • asp之家 网络编程 m.aspxhome.com