如何实现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开发技术大全 第4章 直接量与字符集
Jul 03 Javascript
extjs实现选择多表自定义查询功能 前台部分(ext源码)
Dec 20 Javascript
javascript正则表达式中的replace方法详解
Apr 20 Javascript
详解javascript实现瀑布流绝对式布局
Jan 29 Javascript
js判断出两个字符串最大子串的函数实现方法
Nov 01 Javascript
mui框架移动开发初体验详解
Oct 11 Javascript
微信小程序画布圆形进度条显示效果
Nov 17 Javascript
vue实现设置载入动画和初始化页面动画效果
Oct 28 Javascript
微信小程序用canvas画图并分享
Mar 09 Javascript
简单了解前端渐进式框架VUE
Jul 20 Javascript
浅谈vue 多个变量同时赋相同值互相影响
Aug 05 Javascript
详解Java中String JSONObject JSONArray List转换
Nov 13 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地址引用(php地址引用的效率问题)
2012/03/23 PHP
PHP Curl多线程原理实例详解
2013/11/06 PHP
php教程之魔术方法的使用示例(php魔术函数)
2014/02/12 PHP
PHP删除数组中空值的方法介绍
2014/04/14 PHP
ThinkPHP使用心得分享-分页类Page的用法
2014/05/15 PHP
ThinkPHP3.2.3数据库设置新特性
2015/03/05 PHP
javascript的原生方法获取数组中的最大(最小)值
2012/12/19 Javascript
Web Inspector:关于在 Sublime Text 中调试Js的介绍
2013/04/18 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
2013/06/27 Javascript
$.each遍历对象、数组的属性值并进行处理
2014/07/18 Javascript
javascript里使用php代码实例
2014/12/13 Javascript
javascript自定义滚动条实现代码
2020/04/20 Javascript
jquery操作select元素和option的实例代码
2016/02/03 Javascript
老生常谈javascript变量的命名规范和注释
2016/09/29 Javascript
JavaScript获取短信验证码(周期性)
2016/12/29 Javascript
解读vue生成的文件目录结构及说明
2017/11/27 Javascript
vue实现登录后页面跳转到之前页面
2018/01/07 Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
2018/08/12 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
layui 实现加载动画以及非真实加载进度的方法
2019/09/23 Javascript
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
JavaScript实现表单验证功能
2020/12/09 Javascript
[01:48]帕吉至宝加入游戏,遗迹战场现“千劫神屠”
2018/04/07 DOTA
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
python实现多线程采集的2个代码例子
2014/07/07 Python
用Python实现一个简单的多线程TCP服务器的教程
2015/05/05 Python
python的一些加密方法及python 加密模块
2019/07/11 Python
python实现查找所有程序的安装信息
2020/02/18 Python
numpy中生成随机数的几种常用函数(小结)
2020/08/18 Python
canvas学习笔记之2d画布基础的实现
2019/02/21 HTML / CSS
德国珠宝和手表在线商店:VALMANO
2019/03/24 全球购物
武汉瑞得软件笔试题
2015/10/27 面试题
银行员工辞职信范文
2014/01/20 职场文书
爱国主义影片观后感
2015/06/18 职场文书
爱护环境建议书
2015/09/14 职场文书
高中信息技术教学反思
2016/02/16 职场文书