如何实现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控制表格隔行变色
Jun 26 Javascript
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
Feb 07 Javascript
JsDom 编程小结
Aug 09 Javascript
JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题
Sep 28 Javascript
jquery进行数组遍历如何跳出当前的each循环
Jun 05 Javascript
搞定immutable.js详细说明
May 02 Javascript
AngularJS入门教程之过滤器用法示例
Nov 02 Javascript
BootStrap栅格系统、表单样式与按钮样式源码解析
Jan 20 Javascript
jQuery选择器之子元素过滤选择器
Sep 28 jQuery
ajax与jsonp的区别及用法
Oct 16 Javascript
详解JSON和JSONP劫持以及解决方法
Mar 08 Javascript
vue3使用vue-router的完整步骤记录
Jun 20 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
分享常见的几种页面静态化的方法
2015/01/08 PHP
Zend Framework实现将session存储在memcache中的方法
2016/03/22 PHP
PHP yii实现model添加默认值的方法(两种方法)
2016/11/10 PHP
PHP进程通信基础之信号
2017/02/19 PHP
PHP实现找出链表中环的入口节点
2018/01/16 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
javascript 简单抽屉效果的实现代码
2010/03/09 Javascript
JS input文本框禁用右键和复制粘贴功能的代码
2010/04/15 Javascript
深入理解JavaScript系列(48):对象创建模式(下篇)
2015/03/04 Javascript
JavaScript编写简单的计算器
2015/11/25 Javascript
jquery密码强度校验
2015/12/02 Javascript
vue组件生命周期详解
2017/11/07 Javascript
详解react-router 4.0 下服务器如何配合BrowserRouter
2017/12/29 Javascript
利用Dectorator分模块存储Vuex状态的实现
2019/02/05 Javascript
es6中reduce的基本使用方法
2019/09/10 Javascript
JS几个常用的函数和对象定义与用法示例
2020/01/15 Javascript
JavaScript onclick事件使用方法详解
2020/05/15 Javascript
[42:24]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第三场 11.27
2020/12/01 DOTA
[06:07]DOTA2-DPC中国联赛 正赛 Ehome vs VG 选手采访
2021/03/11 DOTA
python写xml文件的操作实例
2014/10/05 Python
Python实现一个简单的MySQL类
2015/01/07 Python
利用anaconda保证64位和32位的python共存
2021/03/09 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
Python中的wordcloud库安装问题及解决方法
2020/05/27 Python
详解Python 循环嵌套
2020/07/09 Python
英国复古皮包品牌:Beara Beara
2018/07/18 全球购物
Herschel Supply Co.美国:背包、手提袋及配件
2020/11/24 全球购物
日本最大的彩色隐形眼镜销售网站:CharmColor
2020/09/09 全球购物
幼儿园园长自我鉴定
2013/10/22 职场文书
应届生会计求职信
2013/11/11 职场文书
违反学校规定检讨书
2014/01/18 职场文书
小学生感恩父母演讲稿
2014/08/28 职场文书
党校学习心得体会范文
2014/09/09 职场文书
虎兄虎弟观后感
2015/06/12 职场文书
安装配置mysql及Navicat prenium的详细流程
2021/06/10 MySQL
Netflix《海贼王》真人版剧集多张片场照曝光
2022/04/04 日漫