Placeholder占位加载时怎么避免页面跳动?
我在用骨架屏做列表加载的placeholder,但数据回来后内容高度变了,页面会突然跳一下,特别难受。试过给容器写死高度,但不同设备显示行数不一样,根本没法固定。
现在用的是Tailwind写的骨架组件,大概长这样:
<div class="animate-pulse">
<div class="h-4 bg-gray-200 rounded mb-2"></div>
<div class="h-4 bg-gray-200 rounded w-3/4"</div>
</div>
有没有办法让placeholder和真实内容高度尽量一致?或者用其他方案解决跳动问题?
说几个实用的方案。
第一个方案,给最外层容器加
min-height,别写死高度。根据你的列表项平均高度估算一个最小值,比如每项大概120px,那10条数据就设置min-height: 1200px。这样骨架屏渲染时至少撑开这么多空间,数据回来后就算高度有出入,跳动幅度也小很多。第二个方案更靠谱,骨架屏的结构要和真实内容保持一致。你现在骨架屏里写的是
h-4,那真实内容里文字行高是多少?如果真实内容用的是text-base,默认行高大概是1.5rem,骨架屏却写死h-4(1rem),肯定对不上。正确的做法是让骨架屏模拟真实内容的布局:
关键点在于
leading-6对应骨架屏的h-6,text-lg对应h-7,padding和margin也要完全一致。第三个方案,如果内容高度确实变化很大,可以加个过渡动画遮一下:
数据回来时先让骨架屏淡出,再渲染真实内容,视觉上会顺滑很多。
前端这块其实没有完美的方案,只能尽量减少跳动幅度。如果列表项结构复杂,建议封装一个统一的内容容器组件,骨架屏和真实内容共用同一套间距样式,这样维护起来也方便。