根本原因是Layui表格将height配置值固化于内部状态,全屏切换不触发table.resize();须监听fullscreenchange事件并调用table.resize(),配合setTimeout等待DOM重排,固定列还需调用table.getScrollWidth()重算滚动宽度。
全屏切换后表格高度卡死、列宽错乱
根本原因是 layui 表格初始化时把 height 配置值(比如 500 或 'auto')固化在内部状态里,而浏览器 f11 全屏只是改变视口尺寸,并不会触发 table.resize()。退出后容器尺寸恢复,但表格仍按全屏时的计算结果渲染,导致高度残留、列宽挤压或横向滚动条异常。
必须在 fullscreenchange 事件中手动干预:
- 监听全局
document的fullscreenchange事件,而不是只靠按钮点击 - 进入全屏后,调用
table.resize('yourTableId'),并加setTimeout(..., 16)等待 DOM 重排完成 - 退出全屏时同样要调用
table.resize(),否则列宽/固定列对齐会永久错位 - 若用了
fixed: true列,resize 后建议补一句table.getScrollWidth('yourTableId')触发内部滚动宽度重算
直接调用 layui.fullscreen.toggle() 报错 “not a function”
说明你用的是 Layui 2.7 或更早版本。layui.fullscreen 是 2.8 新增模块,未加载就调用会报这个错。别去搜“layui 全屏插件”,多数 patch 代码维护性差,且和后续版本冲突。
兼容方案只有两个:
- 升级到 Layui 2.8+,并在
layui.use(['table', 'fullscreen'], ...)中显式引入fullscreen模块 - 不升级就手写原生 API:
document.documentElement.requestFullscreen ? document.documentElement.requestFullscreen() : document.documentElement.webkitRequestFullscreen ? document.documentElement.webkitRequestFullscreen() : document.documentElement.msRequestFullscreen()
为什么只改 CSS 容器 height 不算真全屏
常见错误是给表格外层 div 加 style="height: 100vh;" 或隐藏头部/侧边栏——这本质是“伪全屏”。F11 退出后布局必然错乱,打印/截图也不对,因为:
- 浏览器原生全屏(
requestFullscreen)会触发resize和fullscreenchange事件,可被监听;CSS 拉伸完全绕过这些机制 - 固定列、冻结列、
cellMinWidth等依赖视口真实尺寸的特性,在伪全屏下无法正确响应 - 移动端 Safari 等环境根本不支持
documentElement.requestFullscreen,但至少有统一入口可做降级处理
退出全屏后列宽没恢复,特别是最后一列异常
这是最常被忽略的点:全屏时视口变大,Layui 表格自动撑开列宽;退出后视口缩回,但列宽缓存未清空,尤其当最后一列被 table.hideCol() 隐藏过时,layui-table-last-col 类的样式链会被破坏。
务必在 fullscreenchange 回调里判断是否已退出:
- 用
document.fullscreenElement === null判断退出状态 - 退出后先调
table.resize(),再执行table.showCol()或table.hideCol()恢复列状态(如果之前动态隐藏过) - 若用了
totalRow,resize 后建议再调一次table.reload('id', { where: {...} })确保合计行重绘
复杂点在于,全屏不是一次性的操作,而是可能反复进出的状态切换;所有列控制、尺寸重绘、滚动计算都得放在事件流里闭环处理,不能只靠按钮单点触发。











