讲师中心 微信公众号
AI工具推荐 视频效率加速

怎样制作一个拖拽排序插件_JavaScript拖拽排序插件开发实战教程

陌丽君_7627

陌丽君_7627

发布时间:2025-11-17 16:37:00

|

1077人浏览过

|

来源于php中文网

原创

答案:实现拖拽排序插件需监听mousedown、mousemove、mouseup事件,动态创建占位元素并调整DOM顺序。通过绝对定位脱离文档流,结合CSS提升交互体验,最后封装为可复用的Sortable类,支持灵活调用与扩展。

怎样制作一个拖拽排序插件_javascript拖拽排序插件开发实战教程

想做一个实用的拖拽排序插件?核心在于监听鼠标事件、动态调整元素位置、并保持界面流畅。下面一步步带你从零实现一个轻量级 JavaScript 拖拽排序插件,适用于列表项或网格布局。

1. 确定基本结构和功能需求

拖拽排序插件通常用于重新排列 DOM 元素顺序,比如任务列表、图库排序等。我们需要支持以下功能:

  • 可拖动的列表项
  • 实时显示插入位置(占位提示)
  • 松开后更新实际 DOM 顺序
  • 兼容常见浏览器,不依赖第三方库

HTML 结构示例:

<ul id="sortable-list">
  <li class="item">Item 1</li>
  <li class="item">Item 2</li>
  <li class="item">Item 3</li>
</ul>

2. 监听鼠标事件实现拖拽逻辑

通过 mousedown、mousemove 和 mouseup 三个事件控制拖拽流程。

立即学习“Java免费学习笔记(深入)”;

关键步骤:

Java Api Extractor
Java Api Extractor

从 Java 项目中提取 Controller 层接口定义为 JSON 数据。

下载
  • mousedown:选中目标元素,记录初始位置,绑定 move 和 up 事件
  • mousemove:计算位移,找到当前应插入的位置,更新视觉反馈
  • mouseup:将拖动元素插入到目标位置,解绑事件

JavaScript 核心代码片段:

function initSortable(list) {
  let draggedItem = null;
<p>list.addEventListener('mousedown', function(e) {
const item = e.target.closest('.item');
if (!item) return;</p><pre class='brush:php;toolbar:false;'>draggedItem = item;
item.style.opacity = '0.8';
item.style.cursor = 'grabbing';
item.style.position = 'absolute';
item.style.zIndex = '1000';

const rect = item.getBoundingClientRect();
const offsetX = e.clientX - rect.left;
const offsetY = e.clientY - rect.top;

// 临时占位元素
const placeholder = document.createElement('li');
placeholder.classList.add('placeholder');
item.parentNode.insertBefore(placeholder, item);

function moveHandler(e) {
  item.style.left = (e.clientX - offsetX) + 'px';
  item.style.top = (e.clientY - offsetY) + 'px';

  // 找到当前 hover 的项
  const hoverItem = document.elementFromPoint(e.clientX, e.clientY)?.closest('.item');
  if (hoverItem && hoverItem !== placeholder && hoverItem !== draggedItem) {
    const refNode = e.clientY > hoverItem.getBoundingClientRect().top + hoverItem.offsetHeight / 2 ?
                    hoverItem.nextSibling : hoverItem;
    placeholder.parentNode.insertBefore(placeholder, refNode);
  }
}

function upHandler() {
  document.removeEventListener('mousemove', moveHandler);
  document.removeEventListener('mouseup', upHandler);

  if (draggedItem) {
    draggedItem.style.opacity = '';
    draggedItem.style.position = '';
    draggedItem.style.left = '';
    draggedItem.style.top = '';
    draggedItem.style.cursor = '';

    // 将原元素插入到占位符位置
    placeholder.parentNode.insertBefore(draggedItem, placeholder);
    placeholder.remove();
    draggedItem = null;
  }
}

document.addEventListener('mousemove', moveHandler);
document.addEventListener('mouseup', upHandler);

}); }

3. 添加样式优化用户体验

良好的视觉反馈能显著提升使用体验。加入 CSS 支持半透明拖动、占位条等效果。

.item {
  padding: 10px;
  margin: 5px 0;
  background: #f0f0f0;
  border: 1px solid #ddd;
  cursor: grab;
  user-select: none;
}
<p>.item:hover {
background: #e0e0e0;
}</p><p>.placeholder {
margin: 5px 0;
border: 2px dashed #007cba;
height: 10px;
}</p>

注意:拖动时将元素设为 absolute 定位可脱离文档流,避免页面抖动。

4. 封装成可复用插件

将功能封装为构造函数或模块,支持传入选项,便于调用。

class Sortable {
  constructor(el, options = {}) {
    this.list = typeof el === 'string' ? document.querySelector(el) : el;
    this.init();
  }
<p>init() {
initSortable(this.list); // 使用上面定义的函数
}</p><p>destroy() {
// 清理事件监听等
}
}</p><p>// 使用方式
new Sortable('#sortable-list');</p>

你还可以扩展选项,如指定选择器、回调函数(onSortEnd)、禁用某些项等。

基本上就这些。一个基础但完整的拖拽排序插件已经成型,你可以根据需要增加触摸支持(touch events)、动画过渡、嵌套排序等功能。关键是理解事件驱动和 DOM 位置操作的配合。

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

6541

2024.08.14

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

0

2026.11.03

Docker Desktop镜像构建教程
Docker Desktop镜像构建教程

想使用Docker Desktop将本地项目构建成Docker镜像?本专题围绕镜像构建的实际操作展开,介绍Dockerfile编写、构建命令使用、镜像标签设置和构建日志查看等内容,同时整理镜像无法生成、依赖安装失败及构建缓存异常等问题的排查思路。

0

2026.11.03

Docker Desktop容器创建指南
Docker Desktop容器创建指南

本专题聚焦Docker Desktop容器创建与运行配置,介绍通过本地镜像或远程镜像创建容器的方法,以及容器启动、终端访问、日志查看和基础管理等操作。针对端口冲突、参数配置不当、容器无法启动等情况,也整理了相应的排查方向。

0

2026.11.03

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

0

2026.11.03

Tailwind CSS 响应式布局怎么写
Tailwind CSS 响应式布局怎么写

Tailwind CSS 响应式布局通常从移动端样式写起,再用 sm、md、lg 等前缀调整不同屏幕宽度下的网格、间距和导航。本专题整理断点配置、Grid 与 Flex 自适应布局及常见溢出问题,帮助你逐步完成多设备适配。

0

2026.11.03

Tailwind CSS 常用类名怎么记
Tailwind CSS 常用类名怎么记

Tailwind CSS 类名很多,先按布局、间距、文字、颜色和状态分组记忆,再通过官方文档检索具体写法。本专题结合类名排序、动态拼接失效、自定义实用类等问题,帮助你建立常用类名的速查方法。

0

2026.11.03

码上飞入口地址合集
码上飞入口地址合集

本专题汇总了码上飞(CodeFlying)的官方入口地址合集,涵盖官网主站及网页版在线使用入口,支持注册登录后直接在线体验零代码AI应用生成。同时整理了APP端下载渠道与小程序入口,助你快速访问平台,通过自然语言描述需求即可生成应用、小程序或网站。

0

2026.11.03

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

20

2026.11.02

热门下载

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

精品课程

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

共14课时 | 1.6万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn