如何实现js拖拽效果及原理解析


Posted in Javascript onMay 08, 2020

元素拖拽分成3个步骤:按下鼠标,移动鼠标,松开鼠标。

拖拽原理:按下拖拽元素后开始监听文档中鼠标移动事件,然后再监听鼠标松开事件;鼠标移动时,元素div要随着鼠标一起移动,需要计算元素div位移的距离(移动的距离=鼠标离可视窗口的位置 ? 鼠标在div中相对于左上角的位置)。然后松开鼠标时,删除移动事件和松开事件,元素完成拖拽。

一开始先监听鼠标按下事件mousedown,事件触发执行mouseHandler函数;

div.addEventListener("mousedown",mouseHandler);

进入mouseHandler函数后,进行if else if 的判断,如果是按下事件,就监听鼠标移动和松开事件,这里要用document文档来作为监听对象,如果使用元素div监听时,如果鼠标在移动过程超出了div元素,就无法拖拽元素;

进入移动事件,就把鼠标移动的距离(鼠标离可视窗口的位置 ? 鼠标在div中相对于左上角的位置)赋值给元素的left和top,元素就可以随着鼠标移动;

最后进入松开鼠标事件,删除了移动和送开鼠标事件,元素就会停在鼠标松开的位置

关键:元素显示位置=鼠标离可视窗口的位置 ? 鼠标相对于在div元素左上角的位置

js代码带注释

var div=document.querySelector("div");
    var offsetX,offsetY;//定义全局变量用于接收鼠标坐标的变量
    div.addEventListener("mousedown",mouseHandler);
    function mouseHandler(e){  //事件的执行函数自带参数e
      if(e.type==="mousedown"){  //e.type是执行事件的类型
        offsetX=e.offsetX;    
        offsetY=e.offsetY;   
        document.addEventListener("mousemove",mouseHandler) 
        document.addEventListener("mouseup",mouseHandler)  //如果有鼠标移动或松开事件的发生再次执行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);  //删除鼠标移动和鼠标松开事件
      }
    }

效果如图:

如何实现js拖拽效果及原理解析

注意:div元素要设置定位才可以进行移动。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript MD4
Dec 20 Javascript
jquery 设置元素相对于另一个元素的top值(实例代码)
Nov 06 Javascript
JavaScript中的Truthy和Falsy介绍
Jan 01 Javascript
JS实现超过长度限制后自动跳转下一款文本框的方法
Feb 23 Javascript
Js与Jq 获取页面元素值的方法和差异对比
Apr 30 Javascript
使用AngularJS创建单页应用的编程指引
Jun 19 Javascript
JavaScript实现输入框(密码框)出现提示语
Jan 12 Javascript
jQuery toggle 代替方法
Mar 22 Javascript
JS判断iframe是否加载完成的方法
Aug 03 Javascript
canvas实现粒子时钟效果
Feb 06 Javascript
微信小程序点击生成朋友圈分享图(遇到的坑)
Jun 17 Javascript
VUE中V-IF条件判断改变元素的样式操作
Aug 09 Javascript
JS图片预加载三种实现方法解析
May 08 #Javascript
JavaScript ES6 Class类实现原理详解
May 08 #Javascript
JavaScript cookie原理及使用实例
May 08 #Javascript
JavaScript中的各种宽高属性的实现
May 08 #Javascript
element-ui 实现响应式导航栏的示例代码
May 08 #Javascript
JS控制下拉列表左右选择实例代码
May 08 #Javascript
VSCode搭建React Native环境
May 07 #Javascript
You might like
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
PHP用PDO如何封装简单易用的DB类详解
2017/07/30 PHP
Laravel框架Request、Response及Session操作示例
2019/05/06 PHP
在Windows上安装Node.js模块的方法
2011/09/25 Javascript
JavaScript插入动态样式实现代码
2012/02/22 Javascript
JS匀速运动演示示例代码
2013/11/26 Javascript
.NET微信公众号开发之创建自定义菜单
2015/07/16 Javascript
JavaScript中Boolean对象的属性解析
2015/10/21 Javascript
jQGrid Table操作列中点击【操作】按钮弹出按钮层的实现代码
2016/12/05 Javascript
jQuery中的siblings()是什么意思(推荐)
2016/12/29 Javascript
Vue实例中生命周期created和mounted的区别详解
2017/08/25 Javascript
10行原生JS实现文字无缝滚动(超简单)
2018/01/02 Javascript
vue进行图片的预加载watch用法实例讲解
2018/02/07 Javascript
利用SpringMVC过滤器解决vue跨域请求的问题
2018/02/10 Javascript
JavaScript Canvas实现验证码
2020/08/02 Javascript
JavaScript Dom实现轮播图原理和实例
2021/02/19 Javascript
python获取图片颜色信息的方法
2015/03/18 Python
python结合shell查询google关键词排名的实现代码
2016/02/27 Python
python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)
2019/06/27 Python
pygame实现俄罗斯方块游戏(基础篇3)
2019/10/29 Python
tensorflow 查看梯度方式
2020/02/04 Python
Python通过kerberos安全认证操作kafka方式
2020/06/06 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
Python requests上传文件实现步骤
2020/09/15 Python
Python识别验证码的实现示例
2020/09/30 Python
摩托车和ATV零件、配件和服装的首选在线零售商:MotoSport
2017/12/22 全球购物
真正的英国宝藏:Mappin & Webb
2019/05/05 全球购物
环境工程与管理大学毕业生求职信
2013/10/02 职场文书
教师申诉制度
2014/01/29 职场文书
《我的伯父鲁迅先生》教学反思
2014/02/12 职场文书
幸福中国演讲稿
2014/09/12 职场文书
县委常委班子对照检查材料思想汇报
2014/09/28 职场文书
小学教师求职信范文
2015/03/20 职场文书
mysql的MVCC多版本并发控制的实现
2021/04/14 MySQL
基于Python的EasyGUI学习实践
2021/05/07 Python
教你部署vue项目到docker
2022/04/05 Vue.js