layui表格响应式需手动绑定window.resize并调用tableins.resize(),禁用height:"auto",优先用"full-n"或函数式高度,确保父容器有明确高度,移动端需监听orientationchange,且resize必须防抖。

table.resize() 必须手动绑定 window.resize
layui.table 不会自动监听窗口缩放,table.resize() 不是默认触发的事件,不绑就永远不重算。只设 height: "full-100" 或函数式写法,没有后续监听,拖拽浏览器边框后高度就彻底“冻住”了。
关键点有三个:
- 必须先保存渲染实例:
var tableIns = table.render({ ... }) - 监听对象要是
$(window)(弹窗内需用$(parent.window)) - 调用
tableIns.resize(),不是table.resize('id')—— 后者在 2.9.1+ 才支持传参,旧版会静默失败
漏掉任一环,高度都不会更新。尤其注意:2.8.x 版本不支持 tableIns.resize({ height: ... }) 这种带参数的调用,只能靠 table.reload() 配合新 height 值。
height 配置别写 "auto",用 "full-N" 或函数
height: "auto" 在 layui 中完全无效,会被忽略并回退到约 300px 的默认值。真正能响应 resize 的只有三类值:number、string(如 "full-110")、function。
推荐优先用 "full-N",N 是顶部固定区域总高(导航栏 + 搜索区 + 分页栏等),例如:
height: "full-110"
但要注意:
- N 必须是真实像素值,不能凭感觉填;用开发者工具量出
$('#header').outerHeight()等再相加 - 如果顶部区块高度可变(比如侧边栏折叠、筛选项展开),
"full-N"就不准了,得换函数式写法 - 函数里别硬写
$(window).height() - 120,要动态取 DOM 高度:$('#search-bar').outerHeight() + $('.toolbar').outerHeight()
resize 后高度没变?检查父容器是否可测量
table.resize() 本身不改 height 配置,它只是按当前 table.config.height 重新计算渲染尺寸。如果父容器没有明确高度(比如 CSS 没设 height 或 max-height),JS 拿到的 container.clientHeight 就是 0 或 auto,最终算出的高度就错乱。
确保外层容器有可读高度:
- CSS 中设
height: calc(100vh - 120px)或position: absolute; top: 60px; bottom: 60px; - 避免父级是
position: static且无显式 height,否则"full-xx"和函数返回值都会失效 - 移动端横竖屏切换时,记得额外监听
orientationchange事件并触发一次tableIns.resize()
防抖必须加,否则 resize 卡顿或错帧
window.resize 触发极频繁,尤其在拖拽浏览器边框时,不加防抖会导致表格反复重绘,UI 卡顿、滚动条跳动、甚至列宽错位。
用 layui.layuiUtil.throttle(2.9+)或简单 setTimeout 都可以:
let resizeTimer;<br>$(window).on('resize', function() {<br> clearTimeout(resizeTimer);<br> resizeTimer = setTimeout(function() {<br> tableIns.resize();<br> }, 150);<br>tableIns.resize(); // 初始化执行一次
注意两点:
- 初始化后立刻调一次
tableIns.resize(),否则首次加载时高度可能不准 - 如果表格在 iframe 或 layer 弹窗中,
$(window)要换成对应上下文的窗口对象,否则 resize 根本不触发











