实现简单的拖拽功能

212 阅读1分钟

思路

我们会根据点击事件里,鼠标坐标变化的前后来计算移动的距离,继而推出元素相对于视口顶部的距离与视口左边的距离,继而设置这个相对距离以达到拖拽的效果。

即计算拖拽完后元素相对于视口的垂直和水平距离。

先准备一个方块

image.png

  • 给方块增加宽度和高度,设置position: fixed 让方块脱离文档流,相对于浏览器视口定位
  • 顺便去掉body的内外边距,让方块贴着视口

image.png

image.png

实现拖拽的逻辑

准备记录鼠标初始位置,以及移动距离的全局变量

image.png

获取页面中的方块

image.png

给方块添加 mousedown 的事件监听器

image.png

编写 mousedown(鼠标按下) 触发的逻辑

  • 鼠标按下视为开始一次拖拽,记录鼠标按下时,鼠标的位置,触发鼠标移动的监听 image.png

编写 mousemove(鼠标移动) 触发的逻辑

  • 记录鼠标移动后,移动前后的垂直和水平距离,
  • 若一次拖拽还未结束,需要更新初始鼠标的位置,为鼠标继续移动做准备,方便计算再一次移动后,移动前后的垂直和水平距离
  • 然后修改方块的相对于视口顶部距离,即设置box样式的top,再修改方块相对于视口左边的距离,即设置box样式的left

image.png

  • 设置的是红色部分的距离 top和left在这里的

image.png

再编写 mouseup(鼠标松开) 的逻辑

即鼠标松开 视为 结束这一次拖拽 image.png

image.png

最终成品

image.png

效果

方块可以移动到这个页面的任何地方 image.png

image.png