如何在 jQuery 中实现表格内多个 div 元素的同步拖拽与自由放置

落杰酱_3848

落杰酱_3848

2026-10-07

547人浏览

原创

如何在 jQuery 中实现表格内多个 div 元素的同步拖拽与自由放置

本文详解如何使用 jQuery UI 实现多个 .dragDiv 元素在同一表格单元格中自由拖放(支持多元素共存),修正原代码中“仅允许单元素放置”的限制,并通过 CSS Flex 布局确保居中对齐与视觉一致性。

本文详解如何使用 jquery ui 实现多个 `.dragdiv` 元素在同一表格单元格中自由拖放(支持多元素共存),修正原代码中“仅允许单元素放置”的限制,并通过 css flex 布局确保居中对齐与视觉一致性。

在默认的 jQuery UI 拖拽逻辑中,.droppable() 的 accept 选项若使用函数形式(如 accept: function() { return $(this).find("*").length == 0; }),会强制目标单元格为空才能接收拖拽元素——这直接阻碍了“多个 div 同时放入同一单元格”的需求。要实现真正的多元素协同拖放(即允许多个 .dragDiv 被独立拖入、并存于同一 <td> 中),关键在于两点重构:<h3>✅ 1. 修改 <code>accept 规则:从“空单元格校验”改为“类名匹配”

将 accept 由动态函数改为静态选择器 ".dragDiv",使所有带该类的元素均可被任意 <td> 接收,不再检查目标是否为空:<pre class="brush:php;toolbar:false;">$(&quot;.mainTable tr td&quot;).droppable({ accept: &quot;.dragDiv&quot;, // ✅ 允许任何 .dragDiv 进入(无论目标是否已有子元素) drop: function(event, ui) { const $target = $(this); ui.draggable.position({ my: &quot;center&quot;, at: &quot;center&quot;, of: $target, using: function(pos) { $(this).animate(pos, 100, &quot;easeOutBack&quot;); } }); } });</pre> <blockquote><p>⚠️ 注意:无需手动 <code>append() —— jQuery UI 默认会在 drop 时自动将拖拽元素追加到目标容器内。显式调用 append() 反而可能引发重复插入或定位错乱。

✅ 2. 优化 CSS:用 Flexbox 替代绝对定位,保障多元素居中与堆叠

原 CSS 中 .dragDiv 使用 position: relative + margin: auto 无法在多元素场景下保持居中。改用 Flexbox 容器布局,让每个 <td> 成为弹性容器,内部元素自然垂直/水平居中:<pre class="brush:php;toolbar:false;">.mainTable tr { display: flex; } .mainTable tr td { width: 100px; height: 100px; display: flex; flex-direction: column; justify-content: center; /* 垂直居中 */ align-items: center; /* 水平居中 */ border: 1px solid #ccc; /* 可选:增强单元格可视边界 */ } .dragDiv { background-color: #00ABA9; height: 50px; width: 80%; /* 避免过宽导致拥挤 */ border-radius: 4px; /* 提升视觉友好度 */ }</pre> <h3>✅ 完整可运行示例(精简版)</h3> <pre class="brush:php;toolbar:false;"> &lt;script src=&quot;https://code.jquery.com/jquery-3.6.0.js&quot;&gt;&lt;/script&gt;&lt;script src=&quot;https://code.jquery.com/ui/1.13.2/jquery-ui.js&quot;&gt;&lt;/script&gt;&lt;style&gt; /* 上述优化后的 CSS */ &lt;/style&gt;</pre> <table class="mainTable"> <tr> <td id="11"><div class="dragDiv" id="1"></div></td> <td id="12"><div class="dragDiv" id="2"></div></td> <td id="13"></td> </tr> <tr> <td id="21"></td> <td id="22"></td> <td id="23"></td> </tr> <tr> <td id="31"></td> <td id="32"></td> <td id="33"></td> </tr> </table> <script> $(function() { $(".dragDiv").draggable({ revert: 'invalid' }); $(".mainTable tr td").droppable({ accept: ".dragDiv", drop: function(event, ui) { ui.draggable.position({ my: "center", at: "center", of: $(this), using: function(pos) { $(this).animate(pos, 100, "easeOutBack"); } }); } }); }); </script><h3>? 补充说明与进阶建议</h3> <ul><li> <strong>无冲突拖拽</strong>:每个 <code>.dragDiv 独立拖拽,互不影响;同一 <td> 可容纳任意数量元素(浏览器性能范围内)。<li> <strong>视觉反馈增强</strong>:可为 <code>:hover 状态添加背景色变化,或在 over/out 事件中高亮目标单元格。

  • 数据绑定扩展:若需记录元素位置,可在 drop 回调中读取 ui.draggable.attr('id') 和 $target.attr('id'),构建映射关系。
  • 移动端兼容性:jQuery UI 默认不支持触摸事件,如需移动端支持,建议集成 jQuery UI Touch Punch 插件。
  • 通过以上改造,你即可在 3×3 表格中自由拖放多个 div,并支持任意单元格内的多元素共存——真正实现灵活、直观、可扩展的拖拽交互体验。

    jQuery 1.12.4
    jQuery 1.12.4

    jQuery 1.12.4是jQuery 1.x系列的最后一个正式稳定版本,由jQuery团队于2016年发布。该版本主要面向需要兼容旧版浏览器环境的网站和Web应用,尤其适用于仍需支持Internet Explorer 6、Internet Explorer 7、Internet Explorer 8等老旧浏览器的项目。

    下载

    相关专题

    更多
    js获取数组长度的方法
    js获取数组长度的方法

    在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

    2023.06.20

    4626

    5

    js刷新当前页面
    js刷新当前页面

    js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

    2023.07.04

    1149

    3

    js四舍五入
    js四舍五入

    js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

    2023.07.04

    4564

    6

    js删除节点的方法
    js删除节点的方法

    js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

    2023.09.01

    920

    4

    JavaScript转义字符
    JavaScript转义字符

    JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

    2023.09.04

    1816

    5

    js生成随机数的方法
    js生成随机数的方法

    js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

    2023.09.04

    3305

    4

    如何启用JavaScript
    如何启用JavaScript

    JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

    2023.09.12

    4293

    6

    Js中Symbol类详解
    Js中Symbol类详解

    javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

    2023.09.20

    2800

    5

    java访问控制修饰符介绍
    java访问控制修饰符介绍

    java访问控制修饰符有四种,分别是public、protected、private、默认访问修饰符。详细介绍:1、public,public是最宽松的访问控制修饰符,被修饰的类、方法和变量可以被任何其他类访问,当一个类、方法或变量被声明为public时,它们可以在任何地方被访问,无论是同一个包中的类还是不同包中的类;2、protected修饰符等等。

    2023.09.20

    888

    7

    热门下载

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

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    jQuery官方API文档
    jQuery官方API文档

    共0课时 | 0人学习

    jQuery 教程
    jQuery 教程

    共42课时 | 16.3万人学习

    HTML+CSS基础与实战
    HTML+CSS基础与实战

    共132课时 | 18.8万人学习