如何实现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 相关文章推荐
使用prototype.js进行异步操作
Feb 07 Javascript
一个CSS+jQuery实现的放大缩小动画效果
Feb 19 Javascript
JS实现简洁、全兼容的拖动层实例
May 13 Javascript
js+html5实现可在手机上玩的拼图游戏
Jul 17 Javascript
JS正则表达式比较常见用法
Jan 26 Javascript
详解vue-cli脚手架build目录中的dev-server.js配置文件
Nov 24 Javascript
vue2.0 better-scroll 实现移动端滑动的示例代码
Jan 25 Javascript
JavaScript创建对象的四种常用模式实例分析
Jan 11 Javascript
vue-cli3 karma单元测试的实现
Jan 18 Javascript
微信小程序本地存储实现每日签到、连续签到功能
Oct 09 Javascript
微信小程序实现侧边栏分类
Oct 21 Javascript
uniapp微信小程序:key失效的解决方法
Jan 20 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
将兴奋、喜悦和坎加斯带到戴安娜:亚马逊公主
2020/03/03 欧美动漫
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
2012/05/07 PHP
php实现保存submit内容之后禁止刷新
2014/03/19 PHP
ThinkPHP使用心得分享-上传类UploadFile的使用
2014/05/15 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
2016/02/15 PHP
thinkphp3.2实现跨控制器调用其他模块的方法
2017/03/14 PHP
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
nodejs中实现阻塞实例
2015/03/24 NodeJs
JS获取图片lowsrc属性的方法
2015/04/01 Javascript
javascript笛卡尔积算法实现方法
2015/04/08 Javascript
JS选项卡动态替换banner图片路径的方法
2015/05/11 Javascript
Javascript实现可旋转的圆圈实例代码
2015/08/04 Javascript
js实现简易的单数字随机抽奖(0-9)
2020/03/19 Javascript
理解js对象继承的N种模式
2016/01/25 Javascript
分享jQuery网页元素拖拽插件
2020/12/01 Javascript
nodejs获取微信小程序带参数二维码实现代码
2017/04/12 NodeJs
详解Vue路由开启keep-alive时的注意点
2017/06/20 Javascript
JavaScript实现图片无缝滚动效果
2017/07/07 Javascript
layui问题之模拟select点击事件的实例讲解
2018/08/15 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
Vue中的情侣属性$dispatch和$broadcast详解
2019/03/07 Javascript
layui实现数据分页功能
2019/07/27 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
2020/04/10 Javascript
关于Node.js中频繁修改代码重启服务器的问题
2020/10/15 Javascript
vue图片裁剪插件vue-cropper使用方法详解
2020/12/16 Vue.js
Python中实现字符串类型与字典类型相互转换的方法
2014/08/18 Python
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
2015/03/06 Python
python中的全局变量用法分析
2015/06/09 Python
Python实现购物车程序
2018/04/16 Python
Django高并发负载均衡实现原理详解
2020/04/04 Python
美国在线购买内衣网站:HerRoom
2020/02/22 全球购物
中文师范生自荐信
2014/01/30 职场文书
《小鹰学飞》教学反思
2014/04/23 职场文书
医院志愿者活动总结
2015/05/06 职场文书
红色影片观后感
2015/06/18 职场文书
JavaScript实现复选框全选功能
2021/04/11 Javascript