# Drag 拖拽基础

# 介绍

拖(Drag)和放(Drop)是 HTML5 标准的组成部分

# draggable 属性

现代浏览器中,不难发现,图片标签(<img />)是可以被长按拖拽,但如果需要自定义的 DOM 节点可以被拖拽需要配置以告诉浏览器提供对元素(Element / Tag)支持拖拽的能力。而元素是否允许被拖放且可响应 API 操作依赖于 draggable 全局标签属性

draggable 是一个布尔值类型的标签属性:

  • true:元素可被拖拽
  • false:元素不可被拖拽
//p元素可被拖拽
<p draggable="true">132-0803-3621</p>

# Drag & Drop 事件

HTML 的 drag & drop 使用了“DOM Event”和从“Mouse Event”继承而来的“drag event”

一个典型的拖拽操作: 用户选中一个可拖拽的(draggable)元素,并将其拖拽(鼠标按住不放)至一个可放置的(droppable)元素上,然后松开鼠标。在拖动元素期间,一些与拖放相关的事件会被触发,像 dragdragover 类型的事件会被频繁触发

事件类型 事件处理器 触发时机 绑定元素
dragstart ondragstart 当开始拖动一个元素时 拖拽
drag ondrag ondrag 拖拽
dragend ondragend 当拖动的元素被释放(🖱️ 松开、按键盘 ESC)时 拖拽
dragenter ondragenter 当拖动元素到一个可释放目标元素时 放置
dragexit ondragexit 当元素变得不再是拖动操作的选中目标时 放置
dragleave ondragleave 当拖动元素离开一个可释放目标元素 放置
dragover ondragover 当元素被拖到一个可释放目标元素上时(100 ms/次) 放置
drop ondrop 当拖动元素在可释放目标元素上释放时 放置

各个事件的时机可以用下面这个图简单表示:

drag-001

注意: dragOver 事件的默认行为是:“Reset the current drag operation to "none"”。也就是说,如果不阻止放置元素的 dragOver 事件,则放置元素不会响应“拖动元素”的“放置行为”

// 让绑定该事件的元素支持放置
function handleDragOver(e) {
  // 阻止默认的重置行为
  // 即可成为拖拽元素的放置区
  e.preventDefault();
}

在上述的事件类型中,不难发现,放置元素和拖动元素分别绑定了自己的事件,可如何将拖拽元素和放置元素建立联系以及传递数据。

这就涉及到 DataTransfer 对象:

DataTransfer 对象用于保存拖动并放下(drag and drop)过程中的数据。它可以保存一项或多项数据,这些数据项可以是一种或者多种数据类型

关于DataTransfer对象的详细介绍,请参考:DataTransfer

陕ICP备20004732号-3