0

0

拖放API使用详解_实现可排序列表的完整方案

狼影

狼影

发布时间:2025-12-02 08:55:40

|

814人浏览过

|

来源于php中文网

原创

首先通过HTML5拖放API实现可排序列表,需掌握dragstart、dragover、drop和dragend四个核心事件;接着在HTML中构建带draggable属性的列表项,并绑定唯一data-id;然后在JavaScript中,于dragstart设置拖动数据并添加视觉反馈类,dragover阻止默认行为以允许放置,drop时获取源和目标元素,根据索引交换位置完成排序,最后在dragend移除样式类。

拖放api使用详解_实现可排序列表的完整方案

拖放功能在现代网页应用中非常实用,尤其是在实现可排序列表时。通过原生的 HTML5 拖放 API(Drag and Drop API),我们可以不依赖第三方库完成这一交互。下面详细介绍如何使用拖放 API 实现一个可排序的列表。

理解拖放 API 的核心事件

拖放操作由一系列事件驱动,掌握这些事件是实现功能的基础:

  • dragstart:拖动开始时触发,用于设置被拖数据和视觉反馈。
  • dragover:元素被拖动到有效目标上方时持续触发,必须阻止默认行为才能允许放置。
  • drop:在目标区域释放被拖元素时触发,用于处理放置逻辑。
  • dragend:拖动结束(无论是否成功)时触发,可用于清理状态。

这些事件需要绑定到具体的 DOM 元素上。列表项应设置 draggable="true" 才能被拖动。

构建可排序列表的 HTML 结构

一个基本的可排序无序列表结构如下:


  • 项目 1
  • 项目 2
  • 项目 3

每个

  • 设置 draggable="true" 并添加唯一标识(如 data-id),便于后续数据管理。

    JavaScript 实现拖放排序逻辑

    通过监听关键事件来控制拖放行为:

    dragstart 中标记当前拖动项:

    
    item.addEventListener('dragstart', function (e) {
      e.dataTransfer.setData('text/plain', e.target.dataset.id);
      e.target.classList.add('dragging');
    });
    

    这里将项目的 ID 存入 dataTransfer,并添加 dragging 类用于样式反馈(如半透明)。

    bee餐饮点餐外卖小程序
    bee餐饮点餐外卖小程序

    bee餐饮点餐外卖小程序是针对餐饮行业推出的一套完整的餐饮解决方案,实现了用户在线点餐下单、外卖、叫号排队、支付、配送等功能,完美的使餐饮行业更高效便捷!功能演示:1、桌号管理登录后台,左侧菜单 “桌号管理”,添加并管理你的桌号信息,添加以后在列表你将可以看到 ID 和 密钥,这两个数据用来生成桌子的二维码2、生成桌子二维码例如上面的ID为 308,密钥为 d3PiIY,那么现在去左侧菜单微信设置

    下载

    dragover 中阻止默认行为以启用放置:

    
    item.addEventListener('dragover', function (e) {
      e.preventDefault();
    });
    

    drop 阶段执行排序交换:

    
    item.addEventListener('drop', function (e) {
      e.preventDefault();
      const targetId = e.target.dataset.id;
      const draggedId = e.dataTransfer.getData('text/plain');
    
      if (targetId !== draggedId) {
        const list = document.getElementById('sortable-list');
        const draggedEl = list.querySelector(`[data-id="${draggedId}"]`);
        const targetEl = list.querySelector(`[data-id="${targetId}"]`);
    
        // 判断插入位置
        const targetIndex = Array.from(list.children).indexOf(targetEl);
        const draggedIndex = Array.from(list.children).indexOf(draggedEl);
    
        if (draggedIndex < targetIndex) {
          list.insertBefore(draggedEl, targetEl.nextSibling);
        } else {
          list.insertBefore(draggedEl, targetEl);
        }
      }
    });
    

    这段逻辑通过比较索引决定插入方向,确保顺序正确。

    dragend 中清除样式:

    
    item.addEventListener('dragend', function () {
      this.classList.remove('dragging');
    });
    

    添加视觉反馈与用户体验优化

    良好的视觉提示能显著提升可用性。例如使用 CSS 定义拖动中的样式:

    
    .draggable-item.dragging {
      opacity: 0.4;
      background: #b3d7ff;
    }
    

    还可以在 dragover 时为接收项添加高亮边框,直观指示可放置位置。

    为避免重复绑定,建议使用事件委托方式将事件绑定到父容器上,并通过 e.target 判断具体元素。

    基本上就这些。通过合理组合拖放事件、DOM 操作和样式反馈,就能实现一个流畅的可排序列表,无需引入额外框架。
  • 相关专题

    更多
    js获取数组长度的方法
    js获取数组长度的方法

    在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

    556

    2023.06.20

    js刷新当前页面
    js刷新当前页面

    js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

    374

    2023.07.04

    js四舍五入
    js四舍五入

    js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

    733

    2023.07.04

    js删除节点的方法
    js删除节点的方法

    js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

    477

    2023.09.01

    JavaScript转义字符
    JavaScript转义字符

    JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

    414

    2023.09.04

    js生成随机数的方法
    js生成随机数的方法

    js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

    991

    2023.09.04

    如何启用JavaScript
    如何启用JavaScript

    JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

    658

    2023.09.12

    Js中Symbol类详解
    Js中Symbol类详解

    javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

    553

    2023.09.20

    PHP WebSocket 实时通信开发
    PHP WebSocket 实时通信开发

    本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

    8

    2026.01.19

    热门下载

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

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    Sass 教程
    Sass 教程

    共14课时 | 0.8万人学习

    Bootstrap 5教程
    Bootstrap 5教程

    共46课时 | 2.9万人学习

    CSS教程
    CSS教程

    共754课时 | 20.8万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号