如何实现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 事件处理示例分享
Dec 31 Javascript
深入理解JavaScript程序中内存泄漏
Mar 17 Javascript
搞定immutable.js详细说明
May 02 Javascript
AngularJS中的表单简单入门
Jul 28 Javascript
javascript将中国数字格式转换成欧式数字格式的简单实例
Aug 02 Javascript
jQuery中 bind的用法简单介绍
Feb 13 Javascript
node+vue实现用户注册和头像上传的实例代码
Jul 20 Javascript
10行原生JS实现文字无缝滚动(超简单)
Jan 02 Javascript
js中数组对象去重的两种方法
Jan 18 Javascript
ES6 迭代器与可迭代对象的实现
Feb 11 Javascript
微信小程序事件 bindtap bindinput代码实例
Aug 26 Javascript
threejs太阳光与阴影效果实例代码
Apr 05 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
Javascript开发包大全整理
2006/12/22 Javascript
关于Aptana Studio生成自动备份文件的解决办法
2009/12/23 Javascript
基于jquery的表头固定的若干方法
2011/01/27 Javascript
jQuery下的动画处理总结
2013/10/10 Javascript
jQuery的deferred对象详解
2014/11/12 Javascript
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
2015/01/01 NodeJs
javascript入门之string对象【新手必看】
2016/11/22 Javascript
关于vue.js过渡css类名的理解(推荐)
2017/04/10 Javascript
AngularJS的脏检查深入分析
2017/04/22 Javascript
详解vue-cli构建项目反向代理配置
2017/09/07 Javascript
vue滚动轴插件better-scroll使用详解
2017/10/17 Javascript
JS实现移动端整屏滑动的实例代码
2017/11/10 Javascript
浅谈SpringMVC中post checkbox 多选框value的值(隐藏域方式)
2018/01/08 Javascript
详解JavaScript中操作符和表达式
2018/09/12 Javascript
jQuery 操作 HTML 元素和属性的方法
2018/11/12 jQuery
微信小程序Flex布局用法深入浅出分析
2019/04/25 Javascript
Node.js 深度调试方法解析
2020/07/28 Javascript
[02:41]《西雅图我们来了》2015国际邀请赛出征全记录
2015/07/23 DOTA
python解析json实例方法
2013/11/19 Python
Python正则表达式匹配中文用法示例
2017/01/17 Python
python基于物品协同过滤算法实现代码
2018/05/31 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
2018/07/19 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
2019/03/26 Python
总结Python图形用户界面和游戏开发知识点
2019/05/22 Python
opencv实现简单人脸识别
2021/02/19 Python
Python求解正态分布置信区间教程
2019/11/20 Python
基于Python+QT的gui程序开发实现
2020/07/03 Python
python 基于UDP协议套接字通信的实现
2021/01/22 Python
把富文本的回车转为br标签
2019/08/09 HTML / CSS
使用html5 canvas创建太空游戏的示例
2014/05/08 HTML / CSS
店长助理岗位职责
2013/12/13 职场文书
致跳远运动员广播稿
2014/02/11 职场文书
婚前协议书怎么写
2014/04/15 职场文书
计划生育汇报材料
2014/12/26 职场文书
CocosCreator入门教程之网络通信
2021/04/16 Javascript
python基础之匿名函数详解
2021/04/21 Python