关掉默认loading,用CSS骨架屏+before/done控制显隐是最稳最轻量的解法;需确保骨架高度与表格行高一致、列内容走templet、事件绑定用table.on、IE11下设table-layout:fixed及minWidth。
直接关掉默认 loading,用 css 骨架屏 + before/done 控制显隐,是最稳、最轻量的解法。 layui 的 table.render() 同步拼 dom 这一行为无法绕过,但“眼睛看到的闪烁”本质是空白 → 突然填充的视觉断层,不是性能问题,而是呈现节奏没管好。
为什么 document.ready 里调 render 一定会闪
DOM 就绪 ≠ 数据就绪。Layui 在 render() 内部才发 AJAX,等响应回来再生成表格 HTML —— 这中间浏览器画布就是空的。尤其在弱网或接口慢时,白屏可能持续 800ms 以上,用户明显感知为“页面抽搐”。
更糟的是,很多人还在 done 回调里手动操作 DOM(比如 $('td .btn').on()),这会触发二次重排,把闪烁放大。
用 skeleton 替代 loading: true
默认的全局遮罩 loading 动画本身就有入场/退场抖动,且和表格尺寸不匹配时还会拉伸变形。换成纯 CSS 骨架屏,控制粒度更细:
- 给表格容器加 class,比如
<div id="table-container" class="skeleton"></div> - 在
before回调里激活骨架:before: () => $('#table-container').addClass('skeleton-active') - 在
done回调里移除:done: () => $('#table-container').removeClass('skeleton-active') - CSS 中确保
.skeleton-active::before占满容器高度,且行高/间距和真实表格一致,否则尺寸跳变仍会闪
templet 和 table.on 是避免 done 里 DOM 操作的底线
所有列内按钮、状态徽章、图片头像,都必须走 templet 或 toolbar 配置,让 Layui 在首次渲染阶段一次性注入 HTML。
事件绑定只用 table.on('tool(demo)', callback),绝不在 done 里写 $().on()。
如果某行要动态加 class(比如标红异常数据),用 tr.addClass('warn'),别用 tr.html() 替换整行 —— 后者强制重绘整个 <tr>,是闪烁放大器。
IE11 下必须加 table-layout: fixed
IE11 对表格宽度计算极不稳定,Layui 内部靠 JS 测宽设列宽,一旦父容器宽度未明确或 DOM 尚未回流,列宽就会反复重算,导致左右晃动。
解决方案很具体:
- 表格容器父级加
width: 100%(不能是max-width或依赖内容撑开) - 给
<table>元素加内联样式:style="table-layout: fixed;" - 每列配置
minWidth(如minWidth: 120),不依赖内容自适应
真正难处理的不是“怎么加骨架”,而是所有环节都要对齐:骨架高度得和表格行高一致、templet 里不能有异步请求、IE11 的 table-layout 得写死在 HTML 里……漏掉任意一环,闪烁就可能换个形式回来。


















