如何实现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中的apply()方法和call()方法使用介绍
Jul 25 Javascript
浅析return false的正确使用
Nov 04 Javascript
JavaScript常用的弹出广告及背投广告实现方法
Feb 06 Javascript
JavaScript事件处理的方式(三种)
Apr 26 Javascript
在Mac OS上安装使用Node.js的项目自动化构建工具Gulp
Jun 18 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
Mar 11 Javascript
Vue 2.X的状态管理vuex记录详解
Mar 23 Javascript
Vue项目webpack打包部署到Tomcat刷新报404错误问题的解决方案
May 15 Javascript
在Vant的基础上实现添加表单验证框架的方法示例
Dec 05 Javascript
vue 集成 vis-network 实现网络拓扑图的方法
Aug 07 Javascript
vue的路由映射问题及解决方案
Oct 14 Javascript
js实现点击上传图片并设为模糊背景
Aug 02 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
PHP高级OOP技术演示
2009/08/27 PHP
php程序的国际化实现方法(利用gettext)
2011/08/14 PHP
PHP实现的增强性mhash函数
2015/05/27 PHP
Apache服务器下防止图片盗链的办法
2015/07/06 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
2018/08/15 PHP
jQuery Validation插件remote验证方式的Bug解决
2010/07/01 Javascript
jquery中获取元素的几种方式小结
2011/07/05 Javascript
UI Events 用户界面事件
2012/06/27 Javascript
基于jquery实现的省市区级联无ajax
2013/09/24 Javascript
含有CKEditor的表单如何提交
2014/01/09 Javascript
javascript实现单击和双击并存的方法
2014/12/13 Javascript
director.js实现前端路由使用实例
2015/02/03 Javascript
js正则表达式验证邮件地址
2015/11/12 Javascript
jquery验证邮箱格式是否正确实例讲解
2015/11/16 Javascript
Easyui使用Dialog行内按钮布局的实例
2017/07/27 Javascript
VueJs 搭建Axios接口请求工具
2017/11/20 Javascript
基于Vue组件化的日期联动选择器功能的实现代码
2018/11/30 Javascript
jquery实现上传图片功能
2020/06/29 jQuery
Python创建模块及模块导入的方法
2015/05/27 Python
Python搭建HTTP服务器和FTP服务器
2017/03/09 Python
Python 基础之字符串string详解及实例
2017/04/01 Python
pandas 将list切分后存入DataFrame中的实例
2018/07/03 Python
零基础使用Python读写处理Excel表格的方法
2019/05/02 Python
解决.ui文件生成的.py文件运行不出现界面的方法
2019/06/19 Python
python爬虫模拟浏览器访问-User-Agent过程解析
2019/12/28 Python
在Pytorch中计算自己模型的FLOPs方式
2019/12/30 Python
使用pytorch和torchtext进行文本分类的实例
2020/01/08 Python
Python修改DBF文件指定列
2020/12/19 Python
美国家庭鞋店:Shoe Sensation
2019/09/27 全球购物
网络公司美工设计工作个人的自我评价
2013/11/03 职场文书
国贸专业的职业规划书
2014/03/15 职场文书
辩论赛主持词
2014/03/18 职场文书
2014年教育工作总结
2014/11/26 职场文书
幼儿园小班工作总结2015
2015/04/25 职场文书
spring项目中切面及AOP的使用方法
2021/06/26 Java/Android
Linux中文件的基本属性介绍
2022/06/01 Servers