如何实现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 03 Javascript
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
Jul 17 Javascript
JS+css 图片自动缩放自适应大小
Aug 08 Javascript
不使用ajax实现无刷新提交表单
Dec 21 Javascript
js中unicode转码方法详解
Oct 09 Javascript
jQuery+CSS3+Html5实现弹出层效果实例代码(附源码下载)
May 16 Javascript
Bootstrap导航条鼠标悬停下拉菜单
Jan 04 Javascript
JavaScript操作文件_动力节点Java学院整理
Jun 30 Javascript
在Koa.js中实现文件上传的接口功能
Oct 08 Javascript
javascript设计模式 ? 模板方法模式原理与用法实例分析
Apr 23 Javascript
利用PHP实现递归删除链表元素的方法示例
Oct 23 Javascript
原生JS实现飞机大战小游戏
Jun 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
php实现用于验证所有类型的信用卡类
2015/03/24 PHP
php通过前序遍历树实现无需递归的无限极分类
2015/07/10 PHP
PHP小偷程序的设计与实现方法详解
2016/10/15 PHP
CI框架附属类用法分析
2018/12/26 PHP
javascript对象的property和prototype是这样一种关系
2007/03/24 Javascript
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
2009/12/28 Javascript
javascript 节点排序 2
2011/01/31 Javascript
JavaScript将XML转成JSON的方法
2015/03/12 Javascript
jQuery实现模拟marquee标签效果
2015/07/14 Javascript
学习Angularjs分页指令
2016/07/01 Javascript
javascript cookie用法基础教程(概念,设置,读取及删除)
2016/09/20 Javascript
jQuery实现的模拟弹出窗口功能示例
2016/11/24 Javascript
利用node.js搭建简单web服务器的方法教程
2017/02/20 Javascript
js 获取今天以及过去日期
2017/04/11 Javascript
jQuery zTree 异步加载添加子节点重复问题
2017/11/29 jQuery
Vue.js组件间的循环引用方法示例
2017/12/27 Javascript
浅析Angular19 自定义表单控件
2018/01/31 Javascript
详解Vue2.0组件的继承与扩展
2018/11/23 Javascript
Javascript作用域和作用域链原理解析
2020/03/03 Javascript
[00:32]2018DOTA2亚洲邀请赛EG出场
2018/04/03 DOTA
Python中的自省(反射)详解
2015/06/02 Python
TensorFlow实现简单卷积神经网络
2018/05/24 Python
利用python打开摄像头及颜色检测方法
2018/08/03 Python
Python实现iOS自动化打包详解步骤
2018/10/03 Python
Python实现的爬取小说爬虫功能示例
2019/03/30 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
2019/10/30 Python
Python:type、object、class与内置类型实例
2019/12/25 Python
瑞士网球商店:Tennis-Point
2020/03/12 全球购物
财务管理个人自荐书范文
2013/11/24 职场文书
上班离岗检讨书
2014/09/10 职场文书
机关作风建设工作总结
2014/10/23 职场文书
鸦片战争观后感
2015/06/09 职场文书
男方家长婚礼答谢词
2015/09/29 职场文书
2016大学先进团支部事迹材料
2016/03/01 职场文书
css3带你实现3D转换效果
2022/02/24 HTML / CSS
Mysql 8.x 创建用户以及授予权限的操作记录
2022/04/18 MySQL