Interactive demo
三个循序渐进的案例:基础拖放、列表排序、文件拖拽上传。
右下方日志面板实时显示触发的事件,便于理解 dragstart → dragover → drop 事件流。
把左侧标签拖到右侧容器。关键点:dragstart 中设置 effectAllowed 与 setData;
dragover 必须 preventDefault() 才能成为放置目标。
上下拖动以重排。核心是用 getBoundingClientRect() 计算光标相对每个兄弟元素的位置,
配合 :not(.dragging) 排除自身,在 dragover 中实时 insertBefore。
把任意文件拖入下方虚线区域,或点击选择。演示 DataTransfer.files 的读取与展示
(不会上传到服务器,仅本地显示)。