前置知识: HTML5

拖拽API

00:00
1 min Intermediate 2026/6/14

drag/drop

1. 拖拽 API 概述

HTML5 原生拖拽 API 允许用户通过拖拽操作页面内或页面移动元素和数据。

1.1 事件

事件触发时机用途
dragstart开始拖拽设置拖拽数据
drag拖拽过程中持续触发更新状态
dragend拖拽结束清理状态
dragenter拖拽进入目标亮放置区域
dragover拖拽在目标上方必须 preventDefault
dragleave拖拽离开目标取消高亮
drop目标释放处理放置逻辑

2. 基本实现

<div id="draggable" draggable="true">拖拽我</div>
<div id="dropzone">放置区域</div>
const draggable = document.getElementById('draggable');
const dropzone = document.getElementById('dropzone');

draggable.addEventListener('dragstart', (e) => {
  e.dataTransfer.setData('text/plain', e.target.id);
  e.dataTransfer.effectAllowed = 'move';
});

dropzone.addEventListener('dragover', (e) => {
  e.preventDefault(); // 必须!否则无法触发 drop
});

dropzone.addEventListener('drop', (e) => {
  e.preventDefault();
  const id = e.dataTransfer.getData('text/plain');
  dropzone.appendChild(document.getElementById(id));
});

3. DataTransfer 对象

e.dataTransfer.setData('text/plain', '文本数据');
e.dataTransfer.setData('application/json', JSON.stringify({ id: 1 }));
e.dataTransfer.effectAllowed = 'move';
e.dataTransfer.dropEffect = 'copy';

// 自定义拖拽图像
const img = new Image();
img.src = 'drag-icon.png';
e.dataTransfer.setDragImage(img, 0, 0);

4. 文件拖拽

dropzone.addEventListener('drop', (e) => {
  e.preventDefault();
  const files = e.dataTransfer.files;
  for (const file of files) {
    console.log(`文件名: ${file.name}, 大小: ${file.size} bytes`);
  }
});

知识检测

学习进度

-- 已学文档
--% 知识覆盖率

学习推荐

专注模式