不能直接用 loading: true,因其仅插入小图标、不遮罩、已废弃;需手动添加全屏遮罩:渲染前在body插入固定定位HTML,done/error回调中隐藏。

为什么不能直接用 loading: true
loading: true 只会在表格容器内部插入一个固定尺寸的小图标,不遮挡交互、不覆盖内容区域,且从 Layui 2.8+ 开始已被标记为废弃。它不是状态控制开关,无法响应请求生命周期,更做不到“全屏遮罩”——你看到的只是右上角一个旋转小图标,用户仍可点按钮、滚动、甚至重复提交。
怎么手动加一个真正可用的全屏 loading 遮罩
核心就两步:渲染前 show,数据回来后 hide。遮罩必须挂到 document.body 下,用固定定位 + 四边撑开,z-index 设为 9999 以上,确保压过所有 layui 组件。
- 在调用
table.render()前,插入这段 HTML:<div id="table-loading" style="position:fixed;top:0;left:0;right:0;bottom:0;background:#fff;z-index:9999;display:flex;align-items:center;justify-content:center;"><i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate"></i></div>
- 在
table.render()的done回调里执行:document.getElementById('table-loading').style.display = 'none' - 如果请求失败(比如触发了
error回调),也得手动隐藏,否则遮罩会一直卡住:document.getElementById('table-loading').style.display = 'none'
容易被忽略的三个细节
遮罩写在 body 里还不够稳妥,还得防错位、防拦截、防残留:
- 表格容器(
elem对应的 DOM)若设置了position: relative或其他定位,可能让遮罩相对其偏移——所以遮罩必须脱离容器流,用top:0;left:0;right:0;bottom:0四边撑满 viewport - 移动端滚动时,遮罩默认会拦截 touch 事件;但这里我们就是要阻断操作,所以反而要确保
pointer-events: auto(浏览器默认值,不用额外写) - 不要在
done里用setTimeout延迟隐藏——Layui 渲染完成即触发,延迟既没必要,还可能因网速快导致遮罩闪一下才消失
别用 layer.load() 叠在表格上
layer.load() 是独立浮层,z-index 默认只有 1989,远低于表格容器(默认 100,但实际渲染后常更高),而且它不绑定表格生命周期。常见问题包括:点遮罩关不掉弹窗、翻页后遮罩残留、Safari 下 touch 不响应、多层叠加时错位。真要复用 layer 样式,只建议用 layer.msg('加载中', {icon: 16, time: 0}) 做提示,但注意它不遮罩也不阻断操作。


















