全屏后表格列宽错乱、滚动条消失的根本原因是layui table未自动重算尺寸,需监听fullscreenchange事件并用table.reload()传width/height/page/cols等参数实现伪重载,或对本地数据用setcolswidth()+resize()轻量重排。

全屏后表格列宽错乱、滚动条消失,table.resize 不起作用
Layui 的 table 组件本身没有监听 resize 事件并自动重绘的机制,F11 全屏会触发浏览器窗口尺寸突变,但表格容器(尤其是带固定列或 width: auto 的列)不会自适应,表现为列宽挤压、表头/内容错位、横向滚动条不出现。
根本原因不是“没刷新”,而是表格内部计算列宽、容器高度的逻辑只在初始化或 reload 时执行,全屏后 DOM 尺寸变了,但 tableIns.config 里缓存的 width、height 没更新,table.resize() 又只是重排已渲染的 DOM,不重新测量。
- 别依赖
table.resize()—— 它只重绘,不重算,对全屏无效 - 必须手动触发一次「伪重载」:用
table.reload()并显式传入当前容器尺寸,而非靠它自动读取 - 确保表格容器(如
#demo)本身设置了width: 100%和height: 100%,否则table拿不到可用尺寸
监听 F11 全屏事件并安全触发表格重载
不能直接监听 keydown 判 F11,因为全屏状态变更实际由 fullscreenchange 事件通知。且要防抖:F11 切换过程可能触发多次事件,而 table.reload() 是异步请求,重复调用会导致状态错乱。
- 用
document.addEventListener('fullscreenchange', handler),兼容 Chrome/Firefox/Edge - handler 内先判断是否进入全屏:
document.fullscreenElement !== null - reload 前加锁:
if (isReloading) return;,并在done回调末尾置isReloading = false - reload 时必须传
width和height,例如:{ width: $(tableIns.config.elem).width(), height: $(tableIns.config.elem).height() }
table.reload() 全屏重载时容易漏掉的关键参数
全屏下最常出问题的是分页容器高度归零、固定列错位、列宽塌缩——这几乎全是因 reload 时漏传配置导致的静默降级。
- 必须传
width和height:否则沿用初始化时的缓存值,全屏后容器变大,表格仍按旧尺寸渲染 - 必须传
page配置(哪怕只写{ curr: tableIns.config.page.curr }):否则分页器重置为第 1 页,且高度计算异常 - 若用了
fixed: true的列,reload 时cols必须完整传入原结构,不能省略或简写——缺失fixed字段会导致固定列失效 - 不要传
url或where,除非你真想重新拉数据;纯样式修复就只传尺寸和分页配置
更轻量的替代方案:不 reload,只强制重绘容器
如果表格是本地数据(data 选项初始化),全屏后只需视觉重排,完全没必要走 AJAX。此时 table.reload() 是杀鸡用牛刀,还可能因没传 url 导致控制台报错。
- 改用
$(tableIns.config.elem).closest('.layui-table-view').css('height', 'auto')触发父容器重流 - 再调
tableIns.resize()—— 这次才真正有效,因为容器高度已重置 - 最后手动触发列宽重算:
tableIns.setColsWidth()(Layui 2.8+ 支持,低版本需用table.resize()+setTimeout(..., 10)微延迟 - 该方式无网络请求、无状态丢失,适合高频切换全屏的场景











