新闻中心

J*aScript实现拖拽排序功能_j*ascript交互效果

2025-10-29
浏览次数:
返回列表
答案:使用原生J*aScript通过监听dragstart、dragover和drop事件实现拖拽排序,结合HTML draggable属性与CSS样式提升交互体验。具体步骤包括:在dragstart中标记拖动元素并添加dragging类;dragover中阻止默认行为并计算插入位置;drop中移除样式类并完成排序。通过getDragAfterElement函数根据鼠标位置确定插入点,确保元素可插入到目标位置前。setTimeout用于延迟添加dragging类,避免样式失效问题。该方案无需第三方库,兼容现代浏览器,结构清晰且易于扩展,适用于任务列表、图库等场景的排序需求。

javascript实现拖拽排序功能_javascript交互效果

拖拽排序是一种常见的交互功能,广泛应用于任务列表、图库排序、仪表盘布局等场景。使用 J*aScript 可以轻松实现这一效果,无需依赖第三方库。下面介绍如何用原生 J*aScript 实现一个简单的拖拽排序功能。

1. 基本 HTML 结构

我们从一个有序或无序列表开始,每个列表项都是可拖动的元素:

<ul id="sortable-list">
  <li class="draggable" draggable="true">项目 1</li>
  <li class="draggable" draggable="true">项目 2</li>
  <li class="draggable" draggable="true">项目 3</li>
</ul>

2. 样式优化体验

添加一些基本样式,提升拖拽时的视觉反馈:

.draggable {
  padding: 10px;
  margin: 5px 0;
  background: #f0f0f0;
  border: 1px solid #ddd;
  cursor: move;
}
<p>.draggable.dragging {
opacity: 0.5;
background: #bbdefb;
}</p>

3. J*aScript 实现拖拽逻辑

核心是监听拖拽事件:dragstart、dragover、drop。通过这些事件控制元素位置。

步骤说明:

万相营造 万相营造

阿里妈妈推出的AI电商营销工具

万相营造 168 查看详情 万相营造
  • 在 dragstart 中标记当前拖动的元素,并添加 dragging 类
  • 在 dragover 中阻止默认行为,使目标区域可放置
  • 在 drop 中将拖动的元素插入到当前鼠标位置所在的元素之前

完整 J*aScript 代码:

document.addEventListener('DOMContentLoaded', () => {
  const list = document.getElementById('sortable-list');
  let draggedItem = null;
<p>// 开始拖动
list.addEventListener('dragstart', (e) => {
draggedItem = e.target;
setTimeout(() => {
draggedItem.classList.add('dragging');
}, 0);
});</p><p>// 拖动过程中
list.addEventListener('dragover', (e) => {
e.preventDefault(); // 必须阻止,否则 drop 不会触发
const afterElement = getDragAfterElement(list, e.clientY);
const currentDragging = document.querySelector('.dragging');</p><pre class='brush:php;toolbar:false;'>if (afterElement == null) {
  list.appendChild(currentDragging);
} else {
  list.insertBefore(currentDragging, afterElement);
}

});

// 结束拖动 list.addEventListener('drop', (e) => { e.preventDefault(); if (draggedItem) { draggedItem.classList.remove('dragging'); draggedItem = null; } });

// 辅助函数:判断鼠标在哪个元素之后 function getDragAfterElement(container, mouseY) { const draggableElements = [...container.querySelectorAll('.draggable:not(.dragging)')];

return draggableElements.reduce((closest, child) => {
  const box = child.getBoundingClientRect();
  const offset = mouseY - box.top - box.height / 2;

  if (offset < 0 && offset > closest.offset) {
    return { offset: offset, element: child };
  } else {
    return closest;
  }
}, { offset: Number.NEGATIVE_INFINITY }).element;

} });

4. 关键点说明

为什么用 setTimeout 包裹 addClass?
因为 dragstart 触发时,DOM 还未进入拖拽状态,立即添加类可能导致样式不生效。延迟到下一个事件循环可确保视图更新。

dragover 必须 preventDefault()
否则浏览器认为该区域不可放置,drop 事件不会触发。

getDragAfterElement 的作用
它根据鼠标垂直位置,判断应将当前元素插在哪个兄弟元素之前,实现“插入到中间”的效果。

基本上就这些。这个方案兼容现代浏览器,结构清晰,易于扩展。你可以将其封装成函数或类,用于多个列表。实际项目中还可结合数据模型同步排序状态,比如更新数组顺序并持久化。不复杂但容易忽略细节。

以上就是J*aScript实现拖拽排序功能_j*ascript交互效果的详细内容,更多请关注其它相关文章!


# 和田地短视频推广营销  # 自定义  # 第三方  # 都是  # 容器内  # 这一  # 是一种  # 三乡木业网站建设  # 丽水定制网站建设价格  # 复选框  # 法库市场网站建设公司  # 江西seo服务推荐机构  # 郑州营销型网站竞价推广  # 佛山营销推广是什么  # 建设网站总体计划书  # 黄石网站优化费用  # 数字营销推广报告  # css  # 鼠标  # 拖动  # 拖拽  # re  # 为什么  # 拖拽排序  # css样式  # ai  # ssl  # app  # 浏览器  # go  # html  # java  # javascript 


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


相关推荐: 漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道  Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询  红果短剧网页版官网入口 官方最新网址发布  解决移动端滚动问题的overflow属性应用指南  漫蛙漫画官方主页入口 漫蛙MANWA网页直达访问链接  Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法  css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间  Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践  Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐  python3时间如何用calendar输出?  steam官方网页快速访问 steam账号注册全流程  整合Supabase认证与Django模型:跨模式迁移的解决方案  必由学官方平台入口 必由学在线课堂登录地址  浏览器打开即用 美图秀秀网页版入口  NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰  包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址  在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析  XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法  夸克浏览器图书入口 夸克手机浏览器阅读入口  CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠  ACG动漫视频网入口 ACG动漫*免费正版观看地址  蛙漫官方正版入口 蛙漫网页在线全集免费观看  顺丰快件物流信息 官方网站查询入口  Tabulator表格中精确实现日期时间排序的指南  Web Components中自定义开关组件状态同步的常见陷阱与解决方案  J*aScript 字符串标签转换:使用正则表达式高效替换  在WordPress中通过REST API获取BasicAuth保护的远程文章  在Pyomo中实现基于变量的条件约束:Big-M方法详解  不同用户不同价格! 索尼开启账户个性化定价测试  蛙漫2台版漫画地址 Manwa2正版网页版链接  html5 app怎么运行环境_配html5 app运行环境【教程】  SteamMachine定价或为699美元 大家想入手吗?  随机参数递归函数的基准调用次数与时间复杂度探究  实现全屏滚动与导航点:专业教程  qq游戏手机版下载安装_qq游戏移动端入口  c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解  Win11怎么查看电脑配置_Win11硬件配置检测工具使用  夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案  QQ官网正版登录链接 QQ在线登录入口最新  漫蛙2在线漫画入口 漫蛙正版漫画网页版直达  单射、满射与双射的关系 一文理清所有逻辑  自定义Bag-of-Words实现:处理带负号的词汇权重  夸克AO3官网入口_AO3镜像网站2025推荐  如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构  极速漫画官方主页网址 极速漫画漫画在线浏览官网链接  支付宝如何设置安全保护_支付宝安全设置的全面教程  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量  Kafka Streams中基于消息头条件过滤消息的实现指南  b站怎么删除评论_b站评论管理与删除操作 

搜索