HTML5 拖放

拖放(Drag and Drop)是 HTML5 标准的一部分:按住鼠标把某个元素拖到另一位置再松手。网页里的拖拽上传文件、拖动卡片排序,靠的都是这套 API。

拖放的基本概念

一次拖放涉及两方:

  • 拖拽源:被拖动的一方,元素要设置 draggable="true" 才允许被拖。
  • 放置目标:接收拖来元素的一方,通常是某个容器区域。 拖动过程中要传递的数据,放在事件对象的 dataTransfer 里携带。

拖放相关事件

事件触发时机通常绑定在
dragstart开始拖动时拖拽源
dragend拖动结束时拖拽源
dragenter拖进目标区域时放置目标
dragover在目标区域上移动时放置目标
dragleave拖离目标区域时放置目标
drop松手放下时放置目标

完整示例:把一个方块拖进方框

HTML 负责结构和样式,脚本负责三段事件逻辑:

<style>
#box { width:200px; height:200px; border:2px dashed #999; }
#drag { width:80px; height:80px; background:#FF6600;
        color:#fff; text-align:center; line-height:80px; }
</style>
<div id="box"></div>
<div id="drag" draggable="true">拖我</div>

<script>
var drag = document.getElementById("drag");
var box = document.getElementById("box");
drag.addEventListener("dragstart", function (e) {
    e.dataTransfer.setData("text/plain", "来自方块的数据");
});
box.addEventListener("dragover", function (e) {
    e.preventDefault();   // 关键:阻止默认行为,drop 才会触发
});
box.addEventListener("drop", function (e) {
    e.preventDefault();
    box.appendChild(drag);            // 把方块移进方框
});
</script>

在浏览器中显示为:一个橙色方块,把它拖到虚线方框上松手,方块就会被移进框内。

易错点

  • dragover 事件里不调用 e.preventDefault(),drop 事件永远不会触发——这是新手最常见的坑。
  • dataTransfer.setData 必须在 dragstart 事件里调用(Firefox 尤其严格)。
  • 图片默认就能拖,而普通元素必须显式加 draggable="true"。
  • 若要支持把系统文件拖进页面(如拖文件上传),用 dataTransfer.files 读取文件列表。

小结:HTML5 拖放由 draggable 属性加 dragstart、dragover、drop 等事件组成;只要记住"dragover 里必须 preventDefault"这条铁律,拖放功能就能顺利跑通。

笔记加载中…