渐进式渲染时首屏内容被二次重绘怎么办?
我在用骨架屏做渐进式渲染时遇到个问题,当真实内容加载完成替换骨架屏时,页面会出现明显闪烁。比如下面这个商品卡片:
<div class="skeleton">
<div class="img-loader"></div>
<div class="text-loader"></div>
</div>
<div class="product" style="display:none">
<img src="product.jpg">
<h3>商品标题</h3>
</div>
我尝试用JavaScript动态切换显示,但发现当元素从隐藏变为显示时,整个卡片会突然跳动。即使设置了相同宽高,为什么还会触发重排?有没有更好的实现方式避免这种视觉跳跃?
首先,用visibility:hidden代替display:none。display:none会完全从渲染树移除元素,而visibility:hidden会保留布局空间:
然后JS切换时加上过渡动画:
更安全的做法是把骨架屏做成真实内容的遮罩层,而不是两个独立元素。这样能完全避免布局重算:
安全提醒:记得处理图片加载失败的情况,否则骨架屏会永远遮住错误状态。可以在
另外,如果商品卡片高度不固定,建议在骨架屏外层加个min-height占位,防止内容加载后页面突然下移。
visibility替代display,避免触发重排,代码如下:用
visibility:hidden和opacity做过渡,等图片加载完成再切换显示状态,避免闪烁和跳动。记得给图片加个onload事件,确保内容加载完成后再做切换。