Drag and Drop
(拖放)?简单来讲,HTML5 提供了 Drag and Drop
API,容许用户用鼠标选中一个可拖动元素,移动鼠标拖放到一个可放置到元素的过程。css
我相信每一个人都或多或少接触过拖放,好比浏览器多标签页之间的可拖放排序、手机中的App能够随便拖放排序等等,Drag and Drop
已经给咱们提供了更便捷、更灵活的网络应用体验。html
DnD
规范定义了基于事件的拖放机制和附加标记,以标记网页上几乎全部 draggable
的元素类型,一个典型的 drag
操做是这样开始的:用户用鼠标选中一个可拖动的(draggable)元素,移动鼠标到一个可放置的(droppable)元素,而后释放鼠标。 在操做期间,会触发一些事件类型,有一些事件类型可能会被屡次触发(好比drag 和 dragover 事件类型)。vue
总结起来很简单:html5
Drag Source(What to drag) => Drop Target(Where to drop)
react
全部的拖拽事件都对应一个 global event handler
,Dnd API 一个有8个事件,能够分为绑定在 Drag Source 上3个、绑定在 Drag Target 上5个git
Event | Description |
---|---|
dragstart | 当用户开始拖动一个元素或选中的文本时触发。 |
drag | 当拖动元素或选中的文本时触发。 |
dragend | 当拖拽操做结束时触发 (好比松开鼠标按键或敲“Esc”键)。 |
Event | Description |
---|---|
dragenter | 当拖动元素或选中的文本到一个可释放目标时触发。 |
dragover | 当元素或选中的文本被拖到一个可释放目标上时触发(每100毫秒触发一次)。 |
dragexit | 当元素变得再也不是拖动操做的选中目标时触发。 |
dragleave | 当拖动元素或选中的文本离开一个可释放目标时触发。 |
drop | 当元素或选中的文本在可释放目标上被释放时触发。 |
drag
和 dragover
)。使用时注意防抖或节流dragover
事件中使用 event.preventDefault()
阻止默认事件行为时,才能正确触发 drop
事件event.preventDefault()
阻止默认事件行为,以防止打开一个新的标签HTML拖拽的数据接口有三个 DataTransfer
、DataTransferItem
和 DataTransferItemList
。github
在进行拖放操做时,DataTransfer
对象用来保存,经过拖放动做,拖动到浏览器的数据。它能够保存一项或多项数据、一种或者多种数据类型。web
属性 | 类型 | 描述 |
---|---|---|
dropEffect | String | 获取 / 设置实际的放置效果,它应该始终设置成 effectAllowed 的可能值之一,copy 、move 、link 、none |
effectAllowed | String | 用来指定拖动时被容许的效果。 |
Files | FileList | 保存一个被存储数据的类型列表做为第一项,顺序与被添加数据的顺序一致。若是没有添加数据将返回一个空列表。 |
types | DOMStringList | 包含一个在数据传输上全部可用的本地文件列表。若是拖动操做不涉及拖动文件,此属性是一个空列表。 |
void clearData([in String type])
String getData(in String type)
void setData(in String type, in String data)
void setDragImage(in nsIDOMElement image, in long x, in long y)
MIME
(Multipurpose Internet Mail Exchange)来指定数据传输类型,例如:text/plain
想象一下咱们想开发一个使用HTML5 DnD API来实现的丰富可交互式的应用。结果由于浏览器不支持,是否是很糟糕。对咱们是否须要使用降级方案仍是有很重要的参考意义的。浏览器
下面有两种经常使用的方法来帮助咱们来检测。网络
Modernizr 是一个出色的可用于检测用户浏览器是否支持 HTML5
和 CSS3
功能的库。
if (Modernizr.draganddrop) {
// Browser supports HTML5 DnD.
} else {
// Fallback to a library solution.
}
复制代码
实现拖拽元素只须要在dom标签上加入 draggable="true"
<div id="drag-source" draggable="true"></div>
复制代码
user-select
可拖拽元素,建议使用 user-select
,避免用户在拖拽时选取到内部元素。
[draggable="true"] {
/* To prevent user selecting inside the drag source */
user-select: none;
-moz-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
}
复制代码
cursor
可拖拽元素,建议使用 cursor
,设定可拖拽元素的鼠标游标,提高交互。
[draggable="true"] {
cursor: move;
}
复制代码
Vue 中使用 dnd 能够直接绑定 event
到组件上。
下面栗子包含的内容:
Mozilla HTML_Drag_and_Drop_API
Working with HTML5 Drag-and-Drop