爱客仕-前端团队博客园

js实现拖拽效果

js实现拖拽效果

写在前面

​ 鼠标拖拽效果常见于用户自定义展示页面,比如qq空间,x宝店铺装修等,操作灵动,所见即所得;或者是一个简单modal移动效果,填写时候可以拖动,方便用户查看原网页的内容。正好周末抽时间可以实现下,动手做做笔记,方便日后翻阅。

简单拖动

星星之火可以燎原,我们先从最简单的需求最起。

主要分为三个步骤:

  1. 鼠标按下,获取鼠标点击时在div中的相对位置。
  2. 鼠标移动,元素的位置 = 就是鼠标的位置 - 刚才的差值。
  3. 鼠标放开,给鼠标移动和鼠标放开赋值null,除非再次点击,否则不会有任何移动效果。

映射成代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
dragCircle.onmousedown = function(){
...//鼠标按下
dragCircle.onmousemove = function(){
...//鼠标移动
};
dragCircle.onmouseup = function(){
...//鼠标抬起
};
};

效果如下:

其实这里会存在一个问题,当你大力超距离拖往窗口外部的时候,咱们的元素仿佛飞到了外太空。。没了!所以,这里要加上一个范围限制。

拖拽范围限制

实现思路:

  1. 设置一个统一管理left,right,top,bottom范围的变量range
  2. 根据范围元素的位置,计算range各项值
  3. 当移动元素left和top超出range范围限制的时候,设置为range对应的阈值

源码和效果如下:

磁性吸入效果

在用户进行拖拽标签或者模块的时候,进行合理的摆放位置引导可以极大增强用户体验。

这里的代码思路相对简单,判断需要引导的位置,位置参数存入一个变量对象,然后计算拖拽元素的和引导位置的距离,小于某个阈值可以直接定位。

源码和效果如下:

列表拖拽排序

列表拖拽排序应该是项目中最常用的拖拽使用场景了,直观便捷是其一大亮点。

实现思路:

  1. 列表元素每个都绑定拖拽事件
  2. 鼠标按下的时候,创建一个空白节点,在原节点位置上占位
  3. 原节点绑定拖拽样式(absolute等)
  4. 文档绑定鼠标移动事件,根据当前拖拽到的位置计算其重新排序后的位置
  5. 将空白节点插入到该位置
  6. 鼠标放开的时候,将被拖拽的元素插入到空白节点的位置
  7. 删除空白节点
  8. 移除事件绑定,清除相关

效果和源码如下: