如何实现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 相关文章推荐
js 新浪的一个图片播放图片轮换效果代码
Jul 15 Javascript
js中关于new Object时传参的一些细节分析
Mar 13 Javascript
JS判断数组中是否有重复值得三种实用方法
Aug 16 Javascript
javascript中clone对象详解
Dec 03 Javascript
coffeescript使用的方式汇总
Aug 05 Javascript
AngularJS中watch监听用法分析
Nov 04 Javascript
JavaScript的事件机制详解
Jan 17 Javascript
thinkjs之页面跳转同步异步操作
Feb 05 Javascript
jQuery复合事件结合toggle()方法的用法示例
Jun 10 jQuery
Vue开发Html5微信公众号的步骤
Apr 11 Javascript
vue项目首屏加载时间优化实战
Apr 23 Javascript
vue如何使用模拟的json数据查看效果
Mar 31 Vue.js
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格式化工具Beautify PHP小小BUG
2008/04/24 PHP
PHP中__FILE__、dirname与basename用法实例分析
2014/12/01 PHP
PHP使用curl制作简易百度搜索
2016/11/03 PHP
面向对象的javascript(笔记)
2009/10/06 Javascript
js中回调函数的学习笔记
2014/07/31 Javascript
浅谈JavaScript数据类型及转换
2015/02/28 Javascript
谈谈Jquery ajax中success和complete有哪些不同点
2015/11/20 Javascript
Node.js实现JS文件合并小工具
2016/02/02 Javascript
js实现内容显示并使用json传输数据
2016/03/16 Javascript
jQuery EasyUI提交表单验证
2016/07/19 Javascript
标准的js无缝滚动效果
2016/08/30 Javascript
微信小程序 swiper组件详解及实例代码
2016/10/25 Javascript
js编写的treeview使用方法
2016/11/11 Javascript
jQuery+ajax实现动态添加表格tr td功能示例
2018/04/23 jQuery
webpack公共组件引用路径简化小技巧
2018/06/15 Javascript
vue-cli2.0转3.0之项目搭建的详细步骤
2018/12/11 Javascript
基于iview-admin实现动态路由的示例代码
2019/10/02 Javascript
小程序实现长按保存图片的方法
2019/12/31 Javascript
vue+render+jsx实现可编辑动态多级表头table的实例代码
2020/04/01 Javascript
[01:09:19]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第二场 2月28日
2021/03/11 DOTA
python Crypto模块的安装与使用方法
2017/12/21 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
详解程序意外中断自动重启shell脚本(以Python为例)
2019/07/26 Python
python获取Linux发行版名称
2019/08/30 Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
2019/10/11 Python
python实现输出一个序列的所有子序列示例
2019/11/18 Python
如何基于python操作json文件获取内容
2019/12/24 Python
VSCode中autopep8无法运行问题解决方案(提示Error: Command failed,usage)
2021/03/02 Python
CSS3 calc()会计算属性详解
2018/02/27 HTML / CSS
商得四方公司面试题(gid+)
2014/04/30 面试题
小学岗位竞聘方案
2014/01/22 职场文书
《小熊住山洞》教学反思
2014/02/21 职场文书
离婚答辩状范文
2015/05/22 职场文书
java后台调用接口及处理跨域问题的解决
2022/03/24 Java/Android
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电
Django中celery的使用项目实例
2022/07/07 Python