layui table 原生不支持列宽拖拽,需手动实现:在 done 回调中插入拖拽条并监听 mouse 事件,通过修改 cols 中对应列的 minwidth 实现拖拽,配合 localstorage 持久化存储(key 为 table-${id}-${field}),注意 fixed 列需加后缀区分。

layui table 原生不支持列宽拖拽,必须手动实现
直接调用 table.render() 后鼠标移到列边线没反应、没手型、没宽度变化——这不是你配置错了,是 layui 官方至今(2026 年 10 月)没提供该功能。所有“能拖”的效果都来自自行封装或第三方补丁,不能依赖文档里不存在的 resize 事件或 autoresize: true 参数。
在 done 回调里插入拖拽条并监听 mouse 事件
核心是往每个 th 右侧插入一个透明拖拽条(<div class="layui-table-resize"></div>),再绑定 mousedown → mousemove → mouseup 逻辑:
- 必须在
done回调中操作 DOM,确保thead th已渲染完成 -
mousedown时记录初始列宽、鼠标 X 坐标、对应列的field和lay-id -
mousemove中只更新该列配置项的minWidth(不是th.style.width),避免破坏排序图标位置和导出逻辑 -
mouseup时调用event.preventDefault(),否则会触发文字选中或浏览器默认拖拽行为 - 建议设宽度下限(如
minWidth: 60),防止拖到内容不可见
拖完存 localStorage,下次渲染前 merge 到 cols
用户关页面后宽度重置是预期行为——layui 不保存任何列状态。要持久化,必须自己读写 localStorage:
- 存的时候 key 推荐格式:
table-${tableId}-${field}(例如table-user-list-username),value 存纯数字(如150,不要带px) - 读的时候必须在
cols初始化阶段就注入:遍历原始cols[0],找到field === 'username'的列,仅覆盖其minWidth - 如果
localStorage.getItem()返回null,务必 fallback 到原始默认值(如120) - 固定列(
fixed: 'left')需加后缀区分 key,否则左右固定列会互相覆盖
最容易被忽略导致“存了但没生效”的地方
问题通常不出在拖拽逻辑本身,而在于三个关键点:
-
localStoragekey 没加表格唯一id—— 多个表格共用同一页面时,光用username当 key 会串号 - 在
done回调里直接改th.style.width,而不是提前 merge 到cols的minWidth,导致导出和打印仍用原始宽度 - 没处理固定列场景:左右固定列应使用不同 key 前缀(如加
-fixed-left后缀),否则互相覆盖
minWidth 注入位置这三处,错一个就白忙活。











