如何实现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 相关文章推荐
用jquery统计子菜单的条数示例代码
Oct 18 Javascript
简单实用的反馈表单无刷新提交带验证
Nov 15 Javascript
JavaScript SweetAlert插件实现超酷消息警告框
Jan 28 Javascript
jQuery实现无限往下滚动效果代码
Apr 16 Javascript
jQuery数据检索中根据关键字快速定位GridView指定行的实现方法
Jun 08 Javascript
JS转换HTML转义符的方法
Aug 24 Javascript
vue实现todolist单页面应用
Apr 11 Javascript
Vue.2.0.5实现Class 与 Style 绑定的实例
Jun 20 Javascript
JS分页的实现(同步与异步)
Sep 16 Javascript
javascript 中模板方法单例的实现方法
Oct 17 Javascript
Vue2.0 实现页面缓存和不缓存的方式
Nov 12 Javascript
如何在 Vue 表单中处理图片
Jan 26 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简单实现加减乘除计算器
2014/01/06 PHP
YII实现分页的方法
2014/07/09 PHP
PHP实现远程下载文件到本地
2015/05/17 PHP
PHP抽象类与接口的区别详解
2019/03/21 PHP
一步一步制作jquery插件Tabs实现过程
2010/07/06 Javascript
ExtJS自定义主题(theme)样式详解
2013/11/18 Javascript
简化版手机端照片预览组件
2015/04/13 Javascript
jQuery版本升级踩坑大全
2016/01/12 Javascript
js获取元素的外链样式的简单实现方法
2016/06/06 Javascript
如何在JS中实现相互转换XML和JSON
2016/07/19 Javascript
Javascript动画效果(1)
2016/10/11 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
2016/11/01 Javascript
浅谈Angular的$q, defer, promise
2016/12/20 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
ui-router中使用ocLazyLoad和resolve的具体方法
2017/10/18 Javascript
Javascript 编码约定(编码规范)
2018/03/11 Javascript
讲解vue-router之什么是编程式路由
2018/05/28 Javascript
layer.open 按钮的点击事件关闭方法
2018/08/17 Javascript
CryptoJS中AES实现前后端通用加解密技术
2018/12/18 Javascript
Python中的pprint折腾记
2015/01/21 Python
多版本Python共存的配置方法
2017/05/22 Python
python多线程与多进程及其区别详解
2019/08/08 Python
python 求10个数的平均数实例
2019/12/16 Python
python深copy和浅copy区别对比解析
2019/12/26 Python
使用Python发现隐藏的wifi
2020/03/04 Python
python和js交互调用的方法
2020/06/23 Python
Python读取pdf表格写入excel的方法
2021/01/22 Python
环境工程求职简历的自我评价范文
2013/10/24 职场文书
七一表彰活动方案
2014/01/18 职场文书
三查三看党性分析材料
2014/02/18 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
大学生党员学习焦裕禄精神思想汇报
2014/09/10 职场文书
迎国庆横幅标语
2014/10/08 职场文书
自主招生自荐信格式范文
2015/03/25 职场文书
酒店财务总监岗位职责
2015/04/03 职场文书
2016年万圣节活动总结
2016/04/05 职场文书