首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js表格自由拖拽排序特效代码

要实现JavaScript表格的自由拖拽排序特效,可以使用HTML5的拖放API(Drag and Drop API)。以下是一个简单的示例代码,展示了如何实现这一功能:

HTML部分

代码语言:txt
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Table Drag and Drop Sorting</title>
    <style>
        table {
            width: 100%;
            border-collapse: collapse;
        }
        th, td {
            border: 1px solid #ddd;
            padding: 8px;
            text-align: left;
        }
        th {
            background-color: #f2f2f2;
        }
        .dragging {
            opacity: 0.5;
        }
    </style>
</head>
<body>
    <table id="sortableTable">
        <thead>
            <tr>
                <th>Index</th>
                <th>Name</th>
            </tr>
        </thead>
        <tbody>
            <tr draggable="true" data-index="0">
                <td>1</td>
                <td>Item 1</td>
            </tr>
            <tr draggable="true" data-index="1">
                <td>2</td>
                <td>Item 2</td>
            </tr>
            <tr draggable="true" data-index="2">
                <td>3</td>
                <td>Item 3</td>
            </tr>
            <!-- Add more rows as needed -->
        </tbody>
    </table>

    <script src="script.js"></script>
</body>
</html>

JavaScript部分(script.js)

代码语言:txt
复制
document.addEventListener('DOMContentLoaded', () => {
    const table = document.getElementById('sortableTable');
    const rows = Array.from(table.querySelectorAll('tbody tr'));

    rows.forEach(row => {
        row.addEventListener('dragstart', dragStart);
        row.addEventListener('dragover', dragOver);
        row.addEventListener('drop', drop);
        row.addEventListener('dragend', dragEnd);
    });

    let draggedRow = null;

    function dragStart(e) {
        draggedRow = this;
        e.dataTransfer.effectAllowed = 'move';
        e.dataTransfer.setData('text/html', this.outerHTML);
        this.classList.add('dragging');
    }

    function dragOver(e) {
        e.preventDefault();
        e.dataTransfer.dropEffect = 'move';
        return false;
    }

    function drop(e) {
        e.stopPropagation();
        if (e.target.tagName === 'TD') {
            const targetRow = e.target.parentElement;
            const dragIndex = draggedRow.dataset.index;
            const dropIndex = targetRow.dataset.index;

            // Swap the rows in the DOM
            if (dragIndex !== dropIndex) {
                const temp = rows[dragIndex].outerHTML;
                rows[dragIndex].outerHTML = rows[dropIndex].outerHTML;
                rows[dropIndex].outerHTML = temp;
            }
        }
        return false;
    }

    function dragEnd() {
        this.classList.remove('dragging');
        draggedRow = null;
    }
});

基础概念

  1. 拖放API:HTML5提供了一套拖放API,允许开发者实现元素的拖拽和放置功能。
  2. 事件监听:通过监听dragstartdragoverdropdragend等事件,可以控制拖拽过程中的行为。

优势

  • 用户体验:用户可以直接通过鼠标操作来重新排序表格内容,提升交互体验。
  • 灵活性:适用于各种需要动态排序的场景,如任务管理、数据列表等。

应用场景

  • 任务管理工具:允许用户根据优先级或截止日期重新排列任务。
  • 数据报告:用户可以根据需要对数据进行排序和分析。
  • 产品目录:在线商店中,用户可以自定义产品的显示顺序。

可能遇到的问题及解决方法

  1. 拖拽过程中元素位置不正确
    • 确保在dragover事件中调用e.preventDefault()以允许放置。
    • drop事件中正确计算和交换元素的位置。
  • 样式问题
    • 使用CSS类(如.dragging)来改变拖拽元素的样式,使其在拖拽过程中更明显。
  • 性能问题
    • 避免在拖拽过程中进行复杂的DOM操作,尽量减少重绘和回流。

通过上述代码和解释,你应该能够实现一个基本的表格拖拽排序功能,并理解其背后的原理和应用场景。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • ElementUI 基于vue+sortable.js实现表格行拖拽

    基于vue+sortable.js实现表格行拖拽 实践环境 sortablejs@1.13.0 vue@2.6.11 element-ui@2.13.2 安装sortable.js拖拽库 npm install...newIndex:目标位置对应行的索引 * oldIndex:被拖拽行的索引 * * ====================(被拖拽记录行...* ====================(被拖拽记录行2) * 如果从上往下拖拽,即newIndex > oldIndex,那么在目标位置对应记录行上移(目标位置对应记录行索引值减...1),在newIndex所指位置插入被拖拽行(被拖拽行索引设置为newIndex),视觉效果就是在after位置(即目标位置对应行下方)插入被拖拽行 * 如果从下往上拖拽,即newIndex...拖拽行(被拖拽行索引设置为newIndex),视觉效果就是在上述before位置(即目标位置对应行上方

    3.5K10

    使用 Sortable.js 库 实现 Vue3 elementPlus 的 el-table 拖拽排序

    在开发过程中,我们经常需要处理表格数据,并为用户提供便捷的排序方式。特别是在需要管理长列表、分类数据或动态内容时,拖拽排序功能显得尤为重要。...结合 Vue 3 和 Element Plus 框架,我们可以利用 Sortable.js 库轻松实现这一功能。本文将介绍如何在el-table组件中集成拖拽排序,使数据管理更加直观和高效。...实现效果 Sortable.js介绍 Sortable.js 是一款强大且轻量级的JavaScript库,专为实现元素的拖放排序功能而设计。...易于集成:只需引入Sortable.js文件,然后通过简单的JavaScript代码即可启用拖放排序功能,适用于列表、表格等常见布局元素。...// ... }); } 总结 在本文中,我们探讨了如何在 Vue 3 与 Element Plus 的 el-table 组件中集成 Sortable.js 库,以实现表格数据的拖拽排序功能

    64910

    做了N+1个企业项目之后, 我总结了这些React必备插件

    世界最受欢迎的基于质感设计的React UI库 React toolbox 一套使用CSS模块功能实现Google的Material Design规范的React组件 React Virtualized 一个能渲染大型列表和表格的...react-desktop与NW.js和Electron.js完美结合,但是可以在任何JavaScript驱动的项目中使用 Zent 有赞 PC 端 WebUI 规范的 React 实现,提供了一整套基础的...拖拽/排序 ?...react-beautiful-dnd 漂亮,可移植性 列表拖拽库 react-dnd 可帮助我们构建复杂的拖放界面,同时保持组件的分离 react-moveable 支持自由拖拽, 缩放, 参考线的灵活强大的拖拽库...react-grid-layout 强大的网格拖拽排序缩放库 mixitup 强大的列表卡片排序动画库 7.

    2K10

    总结100+前端优质库,让你成为前端百事通

    ,使您能够使用精美的动画过滤,排序,添加和删除 DOM 元素的 js 动画库 「Lottie」 一个用于 Android,iOS,Web 和 Windows 的库,用于解析使用 Bodymovin 导出为...「SortableJS」 功能强大的 JavaScript 拖拽库 图形/图像处理库 「html2canvas」 一个强大的使用 js 开发的浏览器网页截图工具 「dom-to-image」 一个可以将任意...」 一个基于图像中的前 2 种主要颜色生成互补渐变背景的库 表单表格 「x-spreadsheet」 一个基于 web 的简单易用的表格插件 Css 相关库 hover.css 开箱即用的鼠标悬停动画.../排序 react-beautiful-dnd 漂亮,可移植性 列表拖拽库 react-dnd 可帮助我们构建复杂的拖放界面,同时保持组件的分离 react-moveable 支持自由拖拽, 缩放, 参考线的灵活强大的拖拽库...react-grid-layout 强大的网格拖拽排序缩放库 mixitup 强大且高性能的列表卡片排序动画库 动画/动效果 Halogen 使用 React 的加载动画集合 react-loading

    3.2K20

    从0到1设计通用数据大屏搭建平台

    大屏更加注重数据动态变化 ,会有极强的视觉体验和冲击力,提供丰富的轮播动画、表格滚动等动画特效。而报表看板更注重交互式数据探索分析,例如上卷下钻、排序、过滤、图表切换、条件预警等。...)拖拽插件:dnd-kit (满足树状结构视图的跨组件拖拽)布局插件:React-Grid-Layout(网格自由布局,修改源码,支持多个方向的拖拽,自由布局、锁定缩放比等)3.2 架构设计下图是我们搭建平台的整体架构设计...D3.js。...3、拖拽器实现背景:React-Grid-Layout 拖拽插件不支持自由布局和组件不同纬度拖拽:解决方案:通过分析源码,对不同纬度的拖拽事件以及拖拽目标碰撞事件进行了重写,并且也拓展了锁定宽高比、旋转透明度等功能...(优化),通过控制布局是否压缩,动态调整拖拽目标的层级zIndex来实现多图层组件操作交互和自由定位。

    3.3K40

    LayUI之旅-数据表格

    方法渲染 用JS方法的配置完成渲染 (推荐)无需写过多的 HTML,在 JS 中指定原始元素,再设定各项参数即可。...自动渲染 HTML配置,自动渲染 无需写过多 JS,可专注于 HTML 表头部分 转换静态表格 转化一段已有的表格元素 无需配置数据接口,在JS中指定表格元素,并简单地给表头加上自定义属性即可 注:和官方一样...数据表格的精髓——数据重载,我们在很多场景下都可能会用到他,比如搜索,排序等等。...注意:该参数为 layui 2.4.4 新增 详见监听排序 initSort Object 初始排序状态。用于在数据表格渲染完毕时,默认按某个字段排序。...注意:该参数为 layui 2.4.4 新增 详见监听排序 initSort Object 初始排序状态。用于在数据表格渲染完毕时,默认按某个字段排序。

    4.5K30

    动图展示 60+ 个前端常用插件库合集

    (如搜索、排序),并自动加入组件引入表格中,使用非常灵活简便。...Fine Uploader-拖拽上传 官网:fine-uploader Github:fine-uploader 导入拖拽上传档案,跨浏览器、原生JavaScript又加上免费开源,只要载入JavaScript...Muuri.js 官网:Muuri Muuri是一个JavaScript Layout引擎,让你可以构建多样化的Layout,并具有响应式、可排序、可过滤、拖拽移动或动画效果。...List.js-资料排序 官网:List.js Github:list.js List.js对表格、清单、各式各样的对象,增加搜索、排序、过滤和灵活性,无形地建立在HTML内,极简易也易于使用。...Tabulator 官网:Tabulator Tabulator是相当容易操作的表格内容产生器,只需要花很少的时间就可以通过把数组或JSON格式的资料生成HTML界面的表格。

    6.7K40

    scrum工具leangoo时间线视图管理项目

    3、当任务时间跨度较大时,可以自由选择时间粒度,日、周、月、季度、年,切换显示比例;也可以直接在时间线区域通过鼠标或手势操作。...字段配置 1、通过 “表格字段配置” 选择列表栏可以展示的字段,可以更清晰的了解任务详情 2、卡片类型筛选区会默认勾选此看板的默认卡片类型,通过勾选卡片类型,可自由选择展示在时间线视图中的任务,帮助你更清晰的识别不同类型的任务...管理任务 1、列表栏支持对任务的拖拽自由排序。鼠标按住操作区空白处,上下拖动即可排序。 2、点击列表栏操作区中的 “+” ,可以快速添加任务。...将鼠标移至任务的时间条上,可以看到时间条上前置点和后置点,按住后置点,拖拽到另外一个任务的前置点,即可设置任务间的依赖关系。...点击连线就可以解除该依赖 时间线拖动模式 1、「自由拖动」,不管任务之间有没有依赖关系,拖动一个任务不影响其他任务; 2、「整体拖动」,如果任务之间有依赖关系,当前任务移动后,关联的任务就跟着移动且移动的距离一致

    66230

    尤雨溪推荐的拖拽插件,支持Vue2Vue3

    关于 VueDraggablePlus VueDraggablePlus 是一个专为 Vue 打造的拖拽排序模块,基于 Sortablejs 封装,支持 Vue3 或 Vue 2.7+。...—Vue.js 作者尤雨溪 ps:按照官方的说法,由于 Sortablejs 的 vue3 组件一直没有更新,已经跟 vue3 严重脱节,所以诞生了这个VueDraggablePlus项目。...功能提醒 功能强大:全面继承 Sortable.js 拖拽排序库的所有功能; Vue 生态支持好:兼容 Vue 3 和 Vue2; 实用灵活:支持组件、指令、函数式调用; TS 支持:这个库本身就是用...TypeScript 编写,有完整的 TS 文档; 数据绑定:支持 v-model 双向绑定,不需要单独维护排序数据; 支持自定义容器:可以自定某个容器作为拖拽容器,比 Sortable.js 更灵活。...还有其他诸如表格行、列拖拽,组件嵌套拖拽等功能!敬请大家移步官方地址进行查阅。

    7.9K11

    基于 React 的可视化编辑平台实践

    编辑自由度 前端框架组件,依赖工具提供组件,编辑效率高,业务逻辑封装度高 目前系统的自由度是组件级别,内置了通用的组件,包括: 基础组件:图片、文本、表格、模板组件 复杂组件:数据列表、跑马灯、轮播图、...表格 布局:锚点布局、标准布局、选项卡布局 容器:上下流(块),左右流(内联块),自由容器(绝对定位布局) 这些组件是内置到系统的,二期的组件市场,目标是组件可扩展,组件可以承载业务,业务逻辑封装度更高些...存储节点的关系,类似一个数据库的二维表,描述节点的父子关系,方便修改父子结构,同级排序。 结构二: ? 存储节点的数据,通过 ID 可以获取节点数据,方便节点数据更新。...最后,实现拖拽布局,布局完全是容器来负责,拖拽过程的位置检测由容器来实现,通过鼠标位置确定组件的安放位置,修改描述组件关系的数据,触发重新渲染。 流式布局演示: ? 自由布局演示: ?...组件内异步获取的数据,通过为组件加静态属性 getInitProps(参考Next框架) Store 中存储了组件树和组件属性数据,直出的不仅仅是 HTML,还包括对应的 CSS,这里使用 css in js

    2.7K30

    React Table 表格组件使用教程 排序、分页、搜索过滤筛选功能实战开发

    图片本文完整版:《React Table 表格组件使用教程 排序、分页、搜索过滤筛选功能实战开发》 在日常开发中,特别是内部使用的后台系统时,我们常常会需要用表格来展示数据,同时提供一些操作用于操作表格内的数据...如果你正在搭建后台管理工具,又不想处理前端问题,推荐使用卡拉云 ,卡拉云是新一代低代码开发工具,可一键接入常见数据库及 API,内置表格等常见的前端组件,无需懂前端,仅需拖拽即可快速搭建属于你自己的后台管理工具...跟随本文你将学到如何使用 react-table 在 React 中搭建表格组件如何使用 react-table 表格组件进行数据的分页、排序、搜索过滤筛选react-table 实战案例:手把手教你使用...react-table 表格组件实战分页、排序、搜索过滤筛选图片扩展阅读:《顶级好用的 React 表单设计生成器,可拖拽生成表单》react-table 安装和使用首先,让我们先来创建一个 React...其实如果你只想专注在解决问题,而不想把时间浪费在调试前端问题上的话,推荐使用卡拉云,卡拉云是新一代低代码开发工具,不仅可以拖拽生成带有排序、分页、搜索功能的表格组件等多种你需要的前端组件。

    17.1K01

    1.3k Star开源MIT开源协议,基于频道模式的团队沟通协作+轻量级任务看板

    TMS(Teamwork Management System) TMS是基于频道模式的团队沟通协作+轻量级任务看板,支持mardown、富文本、在线表格和思维导图的团队博文wiki,i18n国际化翻译管理的响应式...二级话题消息沟通) 私聊(一对一) markdown语法支持(内容排版不再单调) @消息 收藏消息 富文本消息目录 频道外链(便于团队将常用链接统一到一处) 频道甘特图(方便项目整体规划管理) 频道任务看板(可拖拽...) 频道固定消息 日程安排(提醒) 待办事项 沟通消息标记表情&标签(方便分类过滤检索) 剪贴板上传图片, 拖拽文件上传(就是这么便捷) 文件上传,从csv、excel导入mardown表格 邮件通知、...鼠标点多了也累不是) 自定义皮肤色调 自定义频道组(方便批量一次性@一类多个人) 更多贴心便捷操作等你发现 团队博文(wiki) 博文空间(便于博文组织,权限隔离) Markdown、Html富文本、电子表格...、思维导图、图表工具多种类型博文创作方式 基于博文模板创建(可自由发布私有、公开的模板) 博文目录(支持拖拽排序)、标签 父子级博文(支持五级父子博文) 博文关注,收藏,历史(版本比较、回退),权限,点赞

    84520

    161. 精读《可视化搭建思考 - 富文本搭建》

    基于富文本的可视化搭建看似很新颖,但其实早就被广泛使用了,任何一个富文本编辑器几乎都有插入表格功能,这就是一个典型插入自定义组件的场景。...但用组件代替 js 就有点奇怪了,首先并不是所有 js 逻辑都沉淀在组件里,一定有组件间的联动逻辑是无法通过一个组件 js 完成的,另一方面如果将 js 逻辑寄托在组件代码里,本质上是没有提效的,用源码开发项目与开发搭建平台的组件都是...图表组件 B + 文本组件 C,然后分别编辑这三个组件,微调样式后可以达到与富文本一样的编辑效果,甚至加上自由布局后,在布局能力上会超越富文本。...但创造性的加入了一个个独立区块,点击任何区域都会创造一个区块,整个文档可以由一个区块构成,也可以是多个区块组合而成,这样对于连贯性的文字场景可以采用一个富文本区块,对于自定义区块较多,比如大部分是图片和表格的...可以看出来这是一种结合的尝试,从前端角度来看,富文本本质上是对一个 div 进行 contenteditable 申明,那么一个应用可以整体是 contenteditable 的,也可以局部几个区块是,这种代码层面的自由度体现在搭建上就是积木式搭建可以与富文本搭建自由结合

    1.1K10

    TDesign 更新周报(2022年5月第3周)

    Form:支持 help 配置的表单项说明内容与错误提示同时展示,未配置 help 时不再默认占位 Table: 树形结构,支持默认展开全部,tree.defaultExpandAll 树形结构,支持自由控制展开全部...,或收起全部 expandAll() foldAll() 树形结构,支持拖拽排序,调整同层级顺序 树形结构,支持在当前节点之前插入新节点 insertBefore 树形结构,支持在当后节点之后插入新节点...,或收起全部 expandAll() foldAll() Table:树形结构,支持拖拽排序,调整同层级顺序 Table:树形结构,支持在当后节点之后插入新节点 insertAfter Cascader...slider 组件 onChange 事件 init 阶段被意外触发问题 Popup:增加zIndex api Popup:修复设置 destroyOnClose 后可能出现的异常抖动 Table:拖拽排序...性能优化,减少隐藏元素,使用更流畅 Table:重构表格嵌套关系 Input:重构输入框嵌套关系 Menu:重构导航菜单嵌套关系 Dropdown:重构下拉菜单嵌套关系 2.

    2.8K30
    领券