layui怎么实现页面内部不同模块之间的拖拽互换位置并自动保存排版

夏瑶酱_4895

夏瑶酱_4895

2026-10-20

658人浏览

原创

必须使用原生 drag api 实现跨容器模块拖拽,因sortable.js仅支持同级元素排序;需设置draggable/droppable属性、preventdefault防拦截、移动端降级为touch模拟,并通过localstorage按容器id存模块id数组实现持久化布局。

layui怎么实现页面内部不同模块之间的拖拽互换位置并自动保存排版

拖拽模块互换位置必须用原生 drag API,Sortable.js 不适用

因为模块是页面内独立区块(比如 .module-card),不是同级列表项,Sortable.js 默认只处理同级 li 或 tr 的顺序重排,无法跨容器移动。真正能实现「A 区块拖进 B 区域」的,只有浏览器原生 dragstart/dragover/drop 三件套。

关键点在于:drop 目标必须是带 droppable="true" 的容器,且 dragover 中必须调用 e.preventDefault(),否则事件直接被浏览器拦截——你拖着松手,啥也没发生,连控制台都不报错。

  • 每个可拖拽模块加 draggable="true",并在 dragstart 中通过 e.dataTransfer.setData('text', e.target.id) 记录来源 ID
  • 每个目标区域(如 #sidebar、#main-content)设 droppable="true",并监听 dragover 和 drop
  • drop 里用 appendChild 或 insertBefore 移动 DOM,别用 innerHTML 重写,会丢事件绑定和状态
  • 移动端完全不支持 drag 系列事件,必须检测 'ontouchstart' in window,走 touch 模拟逻辑,否则 iOS 上功能直接消失

保存排版不能只存 DOM 结构,要存「容器 → 模块 ID 列表」映射

用户拖完模块,页面布局变了,但刷新就回退——因为没持久化。localStorage 只能存字符串,所以得把结构扁平化成键值对:key 是容器 ID,value 是该容器下模块 ID 的有序数组,例如:localStorage.setItem('layout-sidebar', '["mod-user-info","mod-notices"]')。

千万别存 HTML 字符串或 JSON 对象嵌套,一来体积大,二来解析失败就整个排版崩掉;也别用 document.body.innerHTML 快照,模块内部可能有动态渲染内容(如 ECharts 图表),快照后还原会白屏。

深蓝色网站后台管理系统layui框架模板-AdminPro
深蓝色网站后台管理系统layui框架模板-AdminPro

一款深蓝色网站后台管理系统layui框架模板

下载
  • 每次 drop 完成后,遍历所有目标容器,收集其子模块的 id 属性,生成数组并存入 localStorage
  • 页面初始化时,在 layui.use 加载完成、DOM 就绪后,立即读取各容器对应 key,按顺序 appendChild 还原模块
  • 如果某个模块 ID 在 localStorage 里存在但当前页面没加载(比如权限控制隐藏了该模块),跳过它,不要报错中断流程
  • 避免用 window.location.href 当 key 前缀——带查询参数的 URL 会导致重复 key,比如 /dashboard?tab=1 和 /dashboard?tab=2 存两份

模块拖入后样式错乱?多半是 CSS 选择器没适配动态插入

模块从 A 容器拖到 B 容器,DOM 节点移动了,但它的样式规则可能依赖父级类名,比如 #sidebar .module-card { width: 240px; },而 #main-content .module-card { width: 100%; }。拖过去后,元素还在,但样式没自动切换。

最稳妥的做法是:所有模块自身带完整内联样式或独立 class,不依赖父容器上下文。例如给每个模块加 class="module-card module-card--sidebar" 或 module-card--main,然后在 CSS 里分别定义,而不是靠后代选择器。

  • 避免使用 .container > .module-card:nth-child(2) 这类强位置依赖的样式,拖拽后 DOM 顺序变,样式就失效
  • 模块内部如果有 iframe 或 canvas,拖拽后需手动触发 resize 或 reinit(比如 ECharts 的 resize())
  • 如果模块用了 layui 的 form.render() 或 element.init(),移动后要重新调用,否则开关、标签页等组件会失活

为什么 reload 页面后模块顺序恢复默认?时机没卡准

很多人把排版还原逻辑写在 layui.use 回调里,但这时 DOM 可能还没挂载完;或者写在 $(document).ready,但 layui 的模块加载是异步的,DOM 已存在,模块却还没初始化完毕——结果就是:还原代码执行了,模块被 append 进去,但紧接着 layui 自己又按原始 HTML 渲染了一遍,覆盖掉了你的操作。

正确时机只有一个:等所有 layui 模块(table、form、element)都 use 完,并确认页面上所有模块容器已真实存在(可用 document.getElementById('sidebar') 拿到非 null 结果),再执行还原。

  • 推荐做法:用 setTimeout 延迟 10ms 执行还原逻辑,确保渲染队列清空
  • 更健壮的方式:监听 DOMContentLoaded + layui.use([...], callback) 双保险,callback 内再检查容器是否存在
  • 绝对不要在 table.done 或 form.render 回调里还原模块顺序——那是表格/表单专属逻辑,跟布局无关,混在一起容易互相干扰
模块拖拽互换看着简单,实际卡点全在 DOM 移动后的样式继承、第三方组件状态重置、以及 localStorage 与渲染生命周期的毫秒级对齐——差那几十毫秒,就白忙活半天。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

layui layui菜鸟教程

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2135

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3262

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1096

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3719

7

ajax教程
ajax教程

php中文网为大家带来ajax教程合集,Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。php中文网还为大家带来ajax的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

2900

4

ajax中文乱码解决方法
ajax中文乱码解决方法

ajax中文乱码解决方法有设置请求头部的字符编码、在服务器端设置响应头部的字符编码和使用encodeURIComponent对中文进行编码。本专题为大家提供ajax中文乱码相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

360

5

ajax传递中文乱码怎么办
ajax传递中文乱码怎么办

ajax传递中文乱码的解决办法:1、设置统一的编码方式;2、服务器端编码;3、客户端解码;4、设置HTTP响应头;5、使用JSON格式。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.15

2733

5

ajax网站有哪些
ajax网站有哪些

使用ajax的网站有谷歌、维基百科、脸书、纽约时报、亚马逊、stackoverflow、twitter、hacker news、shopify和basecamp等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.09.24

1161

6

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
ThinkPHP配置开发与CMS后台实战
ThinkPHP配置开发与CMS后台实战

共87课时 | 12.9万人学习

第二十三期_综合实战
第二十三期_综合实战

共89课时 | 11.2万人学习

Layui 快速入门精讲
Layui 快速入门精讲

共5课时 | 1.6万人学习