如何实现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实现上传图片并预览的效果实现代码
Apr 11 Javascript
使用js操作cookie的一点小收获分享
Sep 03 Javascript
JS保存和删除cookie操作 判断cookie是否存在
Nov 13 Javascript
兼容主流浏览器的JS复制内容到剪贴板
Dec 12 Javascript
node.js中的fs.fsyncSync方法使用说明
Dec 15 Javascript
再JavaScript的jQuery库中编写动画效果的指南
Aug 13 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
Aug 23 Javascript
js实现自动轮换选项卡
Jan 13 Javascript
Vue过滤器的用法和自定义过滤器使用
Feb 08 Javascript
vue router仿天猫底部导航栏功能
Oct 18 Javascript
JS实现字符串翻转的方法分析
Aug 31 Javascript
Jquery实现无缝向上循环滚动列表的特效
Feb 13 jQuery
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
php 分页函数multi() discuz
2009/06/21 PHP
PHP实现股票趋势图和柱形图
2015/02/07 PHP
PHP记录搜索引擎蜘蛛访问网站足迹的方法
2015/04/15 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
thinkphp分页集成实例
2017/07/24 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
2019/04/11 PHP
javascript采用数组实现tab菜单切换效果
2012/12/12 Javascript
ECMAScript5中的对象存取器属性:getter和setter介绍
2014/12/08 Javascript
javascript实现限制上传文件大小
2015/02/06 Javascript
jQuery中的ajax async同步和异步详解
2015/09/29 Javascript
jquery 手势密码插件
2017/03/17 Javascript
angularJs利用$scope处理升降序的方法
2018/10/08 Javascript
PHP实现基于Redis的MessageQueue队列封装操作示例
2019/02/02 Javascript
vue2.0中set添加属性后视图不能更新的解决办法
2019/02/22 Javascript
详解Nuxt.js 实战集锦
2019/11/19 Javascript
在react中使用vue的状态管理的方法示例
2020/05/02 Javascript
Python遍历zip文件输出名称时出现乱码问题的解决方法
2015/04/08 Python
Python IDE PyCharm的基本快捷键和配置简介
2015/11/04 Python
详解Python中open()函数指定文件打开方式的用法
2016/06/04 Python
python读取视频流提取视频帧的两种方法
2020/10/22 Python
Python实现统计英文文章词频的方法分析
2019/01/28 Python
ipython和python区别详解
2019/06/26 Python
python算法题 链表反转详解
2019/07/02 Python
Python DES加密实现原理及实例解析
2020/07/17 Python
如何用Python绘制3D柱形图
2020/09/16 Python
英国现代绅士品牌:Hackett
2017/12/17 全球购物
加热夹克:RAVEAN
2018/10/19 全球购物
TCP/IP模型的分界线
2012/12/01 面试题
如何在C# winform中异步调用web services
2015/09/21 面试题
医学专业本科毕业生自我鉴定
2013/12/28 职场文书
文明餐桌行动实施方案
2014/02/19 职场文书
化工专业自荐书
2014/06/16 职场文书
未受刑事制裁公证证明
2014/09/20 职场文书
2016年员工年度考核评语
2015/12/02 职场文书
干货:如何写好观后感 !
2019/05/21 职场文书
用Python将GIF动图分解成多张静态图片
2021/06/11 Python