HTML5拖放必须设draggable="true"并实现dragstart等事件;默认仅img、a可拖;需阻止dragover默认行为才能触发drop;HTML4无原生支持,依赖鼠标事件模拟。

HTML5 拖放功能必须设置 draggable="true"
HTML5 的拖放不是默认开启的。哪怕元素视觉上可拖, 必须显式声明: 拖放是多阶段协作过程,漏掉任一环节都可能失败: 注意: 立即学习“前端免费学习笔记(深入)”; HTML4 没有 这些方案不能触发原生 即使代码逻辑正确,也可能因以下细节失败: 最稳妥做法:在目标容器自身监听 、 这类非表单/链接元素默认 draggable 值为 false,拖不动。
draggable 是布尔属性,设为 "true"(字符串)或直接写 draggable 都生效 和 默认可拖,但若需自定义拖拽行为(如拖文本、阻止默认图片下载),仍要监听事件并调用 event.preventDefault()
draggable="true" 不够——必须实现至少一个拖放事件(如 dragstart),否则 Chrome/Firefox 会静默禁用拖拽关键事件链:从
dragstart 到 drop
dragstart:在被拖元素上触发,用于设置拖拽数据(event.dataTransfer.setData())和视觉反馈(如修改 opacity)dragover:在目标区域上持续触发,**必须阻止默认行为**,否则 drop 事件不会触发:target.addEventListener('dragover', e => e.preventDefault());drop:用户松手时触发,读取数据:e.dataTransfer.getData('text/plain')dragend:无论是否成功放置都会触发,适合清理状态dragenter 和 dragleave 可用于高亮目标区,但不参与数据传递。HTML4 完全不支持原生拖放 API
draggable 属性,也没有 dataTransfer 对象或 drag* 事件。所谓“HTML4 能拖拽”,实际是靠以下方式模拟:
mousedown/mousemove/mouseup)手动计算位置 + 绝对定位移动元素.draggable() 等库封装(底层仍是 mouse 事件)drop 文件上传,也不能响应外部拖入的 URL 或文本。常见失效原因:样式、嵌套与事件捕获
height 或 min-height,导致 dragover 无处触发(空 pointer-events: none,拦截了所有鼠标事件,包括拖放dragover 监听绑在了子元素上——松手时实际落在父容器空白处,drop 不触发event.stopPropagation() 在中间层,阻断了 dragenter 向父级冒泡,导致父级高亮失效dragover 和 drop,并确保它有可交互的尺寸和层级。










