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

拖拽排序是一种常见的交互功能,广泛应用于任务列表、图库排序、仪表盘布局等场景。使用 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站评论管理与删除操作


2025-10-29
浏览次数:次
返回列表
0 && offset > closest.offset) {
return { offset: offset, element: child };
} else {
return closest;
}
}, { offset: Number.NEGATIVE_INFINITY }).element;