原生js实现一个元素拖拽的原理与思路

今天早上看到一个前端面试的题目《利用原生js实现元素拖拽》,突然就想到了当初学到offset clent scroll这位置三大家做的一个案例“实现拖拽盒子”
于是今天就又拿出来写了一下,并且记录成博客,一方面加深记忆,另一方面也再熟悉熟悉原生js(个人很喜欢很喜欢原生js)
首先,做一个项目之前(不管项目大小)都应当先罗列一下业务逻辑和思路,简而言之就是工作大纲:

  1. 完成页面DOM构建,并将必备样式准备完毕
  2. 鼠标在盒子上按下,并移动时应当让盒子跟随鼠标的移动而移动
  3. 鼠标松开时取消鼠标按下及其后续事件
接下来我们一步一步的执行:
css部分:
* { margin: 0; padding: 0; }.box { position: relative; /* 定位用绝对absolute也可以 */ width: 500px; height: 300px; background-color: #5f5f5f; }

html部分:

js部分:
const box = document.getElementById('box') box.onmousedown = function (e) { // 处理IE浏览器事件兼容性问题 e = e || e.event // 获取鼠标按下时此时鼠标位于box中的偏移位置startX和startY let startX = e.offsetX, startY = e.offsetY // 在box上监听鼠标移动的事件 this.onmousemove = function (e) { // 处理IE浏览器事件兼容性问题 e = e || e.event // 计算box的left和top属性(box必须通过定位脱离文档流) // 此时box的水平偏移位置就是:this.offsetLeft // 此时鼠标在盒子中的水平偏移位置是:e.offsetX // 鼠标按下瞬间获取到的鼠标偏移位置是:startX // 记得最后一定要加上单位,不然不会发生偏移 this.style.left = this.offsetLeft + (e.offsetX - startX) + 'px' this.style.top = this.offsetTop + (e.offsetY - startY) + 'px' } } // 在盒子上鼠标左键抬起时监听的事件,将事件赋值为null与removeEventListener一样 box.onmouseup = function () { this.onmousemove = null }

【原生js实现一个元素拖拽的原理与思路】其实鼠标拖拽一个元素在页面上移动的原理就是:
鼠标发生移动时,让盒子也移动相同的距离(X轴和Y轴),也就是说鼠标与盒子某一个点是相对静止的,等价代换之后我们就可以知道,其实就是盒子的left和top值 = 鼠标移动的距离 + 盒子原本的偏移距离鼠标移动的距离 = 当前(实时)鼠标在盒子中的offsetX - 鼠标最初点击那一瞬间的offsetX(上文中我将其存入了变量startX中)

    推荐阅读