新闻中心

JS如何实现拖放排序_J*aScript拖放排序功能实现与交互逻辑教程

2025-11-16
浏览次数:
返回列表
首先通过设置draggable="true"并监听dragstart事件实现元素拖拽,接着在dragover中阻止默认行为并计算插入位置以实现实时排序,最后通过drop和dragend完成放置与样式清理,结合getDragAfterElement方法精确确定目标位置,从而实现原生JS列表拖放排序功能。

js如何实现拖放排序_javascript拖放排序功能实现与交互逻辑教程

拖放排序在现代网页开发中非常常见,比如任务管理看板、图库排序、列表重排等场景。J*aScript 提供了原生的拖放 API(Drag and Drop API),结合 HTML5 的 draggable 属性,可以轻松实现元素的拖拽与排序。下面详细介绍如何用原生 JS 实现一个简单的列表拖放排序功能。

启用元素拖拽

要让一个元素可拖动,首先需要设置其 draggable="true" 属性。对于列表项(如 li 元素),可以这样写:

<li draggable="true">项目 1</li>

然后监听 dragstart 事件,用于标识拖拽开始,并通过 dataTransfer.setData() 存储被拖动元素的信息(例如 ID 或文本)。

示例代码:

document.querySelectorAll('li').forEach(item => {
  item.addEventListener('dragstart', function(e) {
    e.dataTransfer.setData('text/plain', this.textContent);
    this.classList.add('dragging');
  });
});

定义放置区域与交互反馈

为了让其他元素能接收被拖动的内容,必须阻止默认的拖放行为(浏览器默认不允许放置)。这需要监听目标容器的 dragoverdrop 事件。

关键点:在 dragover 中调用 e.preventDefault() 才能触发 drop 事件。

同时,可通过监听 dragenterdragle*e 来添加视觉反馈,比如高亮可放置区域。

ChatCut ChatCut

AI视频剪辑工具

ChatCut 1086 查看详情 ChatCut

示例:

const container = document.getElementById('list-container');
<p>container.addEventListener('dragover', function(e) {
e.preventDefault(); // 必须阻止默认行为才能 drop
const dragging = document.querySelector('.dragging');
const afterElement = getDragAfterElement(container, e.clientY);
if (afterElement == null) {
container.appendChild(dragging);
} else {
container.insertBefore(dragging, afterElement);
}
});</p><p>function getDragAfterElement(container, y) {
const draggableElements = [...container.querySelectorAll('li:not(.dragging)')];
return draggableElements.reduce((closest, child) => {
const box = child.getBoundingClientRect();
const offset = y - box.top - box.height / 2;
if (offset < 0 && offset > closest.offset) {
return { offset, element: child };
} else {
return closest;
}
}, { offset: Number.NEGATIVE_INFINITY }).element;
}

完成拖放并更新顺序

drop 事件中,可以获取传输的数据并插入到目标位置。不过上面的例子已在 dragover 阶段完成 DOM 移动,因此 drop 只需补全逻辑即可。

建议在 dragend 事件中清理样式:

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

此时整个列表的 DOM 结构已经按新顺序排列。如果需要获取最新排序数据(如提交到服务器),遍历当前所有 li 的内容即可:

function getCurrentOrder() {
  return Array.from(document.querySelectorAll('#list-container li')).map(li => li.textContent);
}

优化体验与注意事项

实际项目中还需考虑以下细节:

  • 使用唯一标识(如 data-id)代替 textContent 传递数据,避免内容重复时出错
  • 移动端不支持 drag 事件,需引入 touch 事件模拟或使用第三方库(如 SortableJS)
  • 添加过渡动画提升用户体验
  • 避免频繁操作 DOM,可在 drop 后统一更新状态

基本上就这些。掌握 dragstart、dragover、drop 和 dragend 四个核心事件,就能构建出基础但实用的拖放排序功能。不复杂但容易忽略的是阻止默认行为和正确计算插入位置。

以上就是JS如何实现拖放排序_J*aScript拖放排序功能实现与交互逻辑教程的详细内容,更多请关注其它相关文章!


# 大庆抖音关键词搜索排名  # 多个  # 数据处理  # 图中  # 中非  # 移除  # 视频播放  # 常用的seo  # 企业在线品牌营销推广  # 如何实现  # 好的营销推广代理加盟  # 百度推广seo  # 东丽区网络营销推广优化  # 个人项目推广网站怎么做  # 东莞网站建设中的热点  # 莱芜智能垃圾箱网站建设  # 张掖国外网站推广  # js语法教程  # 拖拽  # 拖动  # 拖放  # re  # 排列  # ai  # ssl  # app  # 浏览器  # html5  # go  # js  # html  # java  # javascript 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 电脑屏幕颜色不舒服怎么办_Windows夜间模式与色彩校准教程【护眼技巧】  在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验  钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法  解决 Express.js 中 PUT 请求密码修改失败的路由配置指南  构建轻量级网站内部消息系统:Formspree 集成指南  CSS子选择器:如何区分并样式化嵌套列表的子层级  QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口  生成rdflib自定义SPARQL函数:参数匹配与实践指南  抖音网页版企业服务中心登录入口_抖音网页版企业登录平台  Win11文件资源管理器卡顿怎么修 Win11重置资源管理器进程优化响应速度【修复方法】  微博网页版主页入口 微博官方网站免登录访问  yy漫画网页版官方入口_yy漫画官网登录页面链接  如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit  HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全  Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】  vivo云服务网页版登录 怎么登录vivo云服务网页版  将HTML动态表格多行数据保存到Google Sheet的教程  BetterDiscord插件中安全更新用户简介的实践指南  mc.js游戏直达 mc.js网页免下载版本秒进地址  J*aScript对象创建方式_J*aScript设计模式应用  Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明  小米14应用无法联网原因分析_小米14网络权限修复  如何在低配置电脑上搭建轻量级J*a环境_占用更小的环境选择技巧  outlook中文官网入口地址 outlook官方中文版直达首页链接  抖音怎么赚钱_抖音创作者变现方法与途径指南  126邮箱账号注册 电脑版登录入口  Go语言中高效处理x-www-form-urlencoded表单数据  不同用户不同价格! 索尼开启账户个性化定价测试  Node.js CSV 数据处理:基于字段值条件过滤整条记录的策略  在Go开发中优雅管理ListenAndServe进程:GoSublime集成方案  解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException  Eclipse怎么运行工程_Eclipse工程运行配置说明  拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧  一加手机拍照效果不好怎么办 一加哈苏影像调校与专业模式使用教程【高手篇】  Win11如何开启讲述人功能 Win11屏幕阅读器(讲述人)开启与关闭【教程】  AO3访问入口汇总 AO3网页版同人作品一键直达  邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策  c++中为什么推荐使用using替代typedef_c++现代化类型别名  12306选座如何查看座位示意图_12306座位示意图解读与使用  网易大神怎么保存别人动态的图片_网易大神动态图片保存方法  sublime怎么设置启动时打开的窗口_sublime会话管理与热退出  怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】  单12V-2&#215;6实现为RTX 5090供电750W!甚至都没敢跑分  QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口  UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】  批改网学生版PC登录 批改网官网登录系统入口  如何使用纯J*aScript判断Input元素是否在特定类容器内  随机参数递归函数的基准调用次数与时间复杂度探究  处理嵌套交互式控件:前端可访问性指南  快速CSGO开箱网站指南 CSGO开箱平台推荐 

搜索