如何在HTML中利用draggable属性和JS拖拽API制作待办事项清单

星强君_4588

星强君_4588

2026-08-09

852人浏览

原创

draggable="true"仅声明可拖动,需JS监听dragstart/dragover/drop等事件并调用dataTransfer.setData()、preventDefault()及insertBefore()才能实现列表重排;移动端原生不支持,应改用专用库。

如何在html中利用draggable属性和js拖拽api制作待办事项清单

draggable="true" 只是起点,不加 JS 无法真正拖动

设置 draggable="true" 只是告诉浏览器“这个元素允许被拖”,它本身不会触发任何 DOM 移动或排序逻辑。如果你只写了

  • 买牛奶
  • 而没监听 dragstart、dragover、drop 等事件,拖拽会失败或直接打开新页面(尤其拖图片/链接时)。必须配合 JS 才能实现待办项重排。

    常见错误现象:
    - 拖动时鼠标变成禁止符号(?)
    - 松手后列表没变化,甚至整个页面刷新
    - 拖到空白处时提示“此操作不被允许”

    • 必须在 dragstart 中调用 e.dataTransfer.setData(),哪怕只是设个空字符串(如 e.dataTransfer.setData('text/plain', '')),否则 Chrome/Firefox 会拒绝后续 drop
    • dragover 事件默认被阻止,需显式调用 e.preventDefault() 才能触发 drop
    • 不要给
        或
          设 draggable="true",它不是容器拖拽,而是列表项拖拽

        用 dataTransfer.getData() 和 insertBefore 实现插入位置精准控制

        靠 drop 事件的 e.target 很难判断该插到哪个位置——它可能是你拖进去的

      • 自身,也可能是父
          ,还可能是文字节点。正确做法是:在 dragover 阶段就计算光标相对于目标
        • 的 Y 坐标,标记“插入上方”或“插入下方”,再在 drop 时用 insertBefore() 执行。

          示例关键逻辑:

          let dropTarget = null;
          list.addEventListener('dragover', e => {
            e.preventDefault();
            const rect = e.target.getBoundingClientRect();
            const offset = e.clientY - rect.top;
            // 靠近顶部 → 插入到 target 前面;靠近底部 → 插入到 target 后面
            dropTarget = offset  {
            e.preventDefault();
            const dragged = document.querySelector('[data-dragging]');
            if (dropTarget && dropTarget !== dragged) {
              list.insertBefore(dragged, dropTarget);
            }
          });
          • data-dragging 是你在 dragstart 中临时加的自定义属性(如 el.dataset.dragging = 'true'),用于快速定位被拖元素
          • 避免用 appendChild(),它只能加到末尾;用 insertBefore() 才能维持拖拽时的视觉顺序
          • 注意 dropTarget 可能为 null(比如拖到空区域),需兜底处理(例如追加到末尾)

          移动端拖拽基本不可用,别指望 touch + draggable 一起工作

          原生 draggable + drag* 事件在 iOS Safari 和多数安卓 WebView 中默认禁用或行为异常(比如不触发 dragstart)。这不是代码写错,是浏览器策略限制。试图用 touchstart + touchmove 模拟 drag 事件链,兼容性差且滚动冲突严重。

          htmlppt.skill
          htmlppt.skill

          把任意文章或文档内容转换成精美的全屏翻页 HTML 演示文件(幻灯片风格)。当用户发来一篇文章、文档链接、Markdown 内容、或粘贴的文本,并且希望生成演示用的 HTML 时触发。支持任意内容来源:iWiki 链接、KM 链接、本地文件路径、直接粘贴的文本。生成的 HTML 文件保存到本地工作区,并通过企微直接发送给用户。触发词示例:帮我把这篇文章做成PPT、转成演示文档、生成HTML幻灯片、做个演示、转成可以演示的格式、article to deck、make a slide。

          下载
          • 真实项目中,移动端建议改用 sortablejs 或 react-sortable-hoc 这类专为触摸优化的库
          • 如果坚持手写,必须监听 touchstart 并手动触发 dragstart(但部分 iOS 版本仍会静默失败)
          • 不要在 dragstart 里读取 event.touches —— 它为空,drag* 事件和 touch 事件是两套互不通信的机制

          localStorage 持久化拖拽后顺序时,别序列化整个 DOM

          很多人拖完直接把 list.innerHTML 存进 localStorage,这会导致:HTML 被转义、事件监听器丢失、自定义属性(如 data-id)混乱、下次加载时所有 draggable="true" 元素失去 JS 绑定。

          • 只存结构化数据:每个待办项应有唯一 id 和 order 字段,拖拽后更新数组顺序并存入 localStorage
          • 渲染时用 JS 重建 DOM,而不是 innerHTML = ...,确保 addEventListener 重新绑定
          • 示例存储格式:JSON.stringify([{id: 'task-1', text: '买牛奶', order: 0}, {id: 'task-2', text: '倒垃圾', order: 1}])

          拖拽逻辑本身不复杂,但跨浏览器行为差异、移动端支持缺失、状态持久化方式选择,才是实际落地时最常卡住的地方。

          大量免费API接口:立即使用
          涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

        • 相关专题

          更多
          html版权符号
          html版权符号

          html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

          2023.06.14

          7035

          7

          html在线编辑器
          html在线编辑器

          html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

          2023.06.21

          3892

          4

          html网页制作
          html网页制作

          html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

          2023.07.31

          3550

          5

          html空格
          html空格

          html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

          2023.08.01

          3579

          5

          html是什么
          html是什么

          HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

          2023.08.11

          5139

          6

          html字体大小怎么设置
          html字体大小怎么设置

          在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

          2023.08.11

          3521

          3

          html转txt
          html转txt

          html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

          2023.08.31

          3329

          3

          html文本框代码怎么写
          html文本框代码怎么写

          html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

          2023.09.01

          2888

          6

          HTML嵌入CSS样式的方法
          HTML嵌入CSS样式的方法

          HTML嵌入CSS样式的方法有内联样式、内部样式表和外部样式表。本专题为大家提供CSS样式相关的文章、下载、课程内容,供大家免费下载体验。

          2023.09.20

          3028

          5

          热门下载

          更多
          网站特效
          /
          网站源码
          /
          网站素材
          /
          前端模板

          精品课程

          更多
          相关推荐
          /
          热门推荐
          /
          最新课程
          GDB 17.2 官方文档集合
          GDB 17.2 官方文档集合

          共0课时 | 0人学习

          Bootstrap 入门安装配置
          Bootstrap 入门安装配置

          共0课时 | 0人学习

          38+ PhpStorm 提示和技巧
          38+ PhpStorm 提示和技巧

          共1课时 | 234人学习