HTML5元素拖拽原理实现
拖拽功能常见于一些模板生成网站,比如 H5 制作网站,我以前都没有注意这一方面,因为功能需要,特地去了解了一下元素拖拽 API。
两种效果:
常见的拖拽有两种效果,一种是拖拽到某个区域后放开自动补位,一种是拖动到任意位置。两种效果实现原理是不一样的。
第一种效果原理:
先看看用到的 drag 事件的API:
dataTransfer
:The data that underlies a drag-and-drop operation, known as the drag data store. Protected mode.(机器翻译:作为拖放操作的基础的数据,称为拖放数据存储区.保护模式)【参考】。target
:被拖动元素下方的元素,常作为放置区域元素。
实现原理其实是将被拖拽的元素插入到放置区域元素的节点下,需要用到appendChild
。
因为放置区域可能不止一个,所以用drag
事件的target
方法获取放置区域元素。
而同样的被拖拽的元素可能也不止一个,所以用drag
事件的dataTransfer
方法传递该元素的 id 或者指向唯一节点元素的值。
注意: 在放置到区域的时候(ondrop
)和元素拖拽结束的时候(ondragover
)要阻止放置区域元素的默认事件,方法是preventDefault()
。
第二种效果原理:
涉及到的 drag 事件API:
screenX
:鼠标相对于屏幕的 X 坐标screenY
:鼠标相对于屏幕的 Y 坐标clientX
:鼠标指针相对于 DOM 的 Y 坐标clientY
:鼠标指针相对于 DOM 的 Y 坐标
实现原理其实也很简单,即记录拖拽过程中的坐标差值,将元素的本身位置坐标加上这个差值。
实现只横向移动,例如滑块验证,只需记录 X 坐标,同理也可以实现竖向滑动。