Skeleton骨架屏如何动态匹配不同分辨率的图片占位?
最近在做首屏骨架屏优化时遇到个问题,当页面在不同分辨率下,我用固定宽高的div模拟的商品图片占位框,加载真实图片后总会出现比例错乱。
比如在移动端横屏时,.skeleton-img设置的width: 100%;和padding-bottom: 60%;还能勉强保持比例,但换成PC端16:9的图片时,这个比例就完全不对了。
我尝试过用CSS的aspect-ratio属性,但发现IE不支持,项目还得兼容低版本浏览器…
现在卡在怎么让骨架屏的图片占位容器能自动适配不同尺寸的真实图片比例,有没有更好的实现方案?
.skeleton-img {
width: 100%;
padding-bottom: 60%; /* 固定的高宽比 */
background: #f0f0f0;
position: relative;
}
img.real-img {
position: absolute;
width: 100%;
height: 100%;
object-fit: cover;
}
最稳妥的方案是在服务端或者数据接口里,提前计算好每张图片的宽高比(比如通过后端拿到图片 metadata),然后在渲染骨架屏的时候,把 ratio 作为变量注入进去。比如:
对应的 CSS 这样写:
这样不管图片是 4:3、16:9 还是竖图,padding-bottom 都能正确按比例撑开。等真实图片加载出来后,absolute 覆盖上去,object-fit: cover 保持裁剪一致就行。
如果后端拿不到图片尺寸,至少在首屏关键图上加个预加载逻辑,用 Image 对象先 load 一次获取 naturalWidth/naturalHeight,再动态设置 --aspect-ratio,记得转义用户输入防止 XSS。
别用 JS 去监听窗口 resize 来调整骨架屏,那太重了,还容易闪。这个方案兼容性也好,IE 不认 aspect-ratio 但能走 fallback 的 padding-bottom 路径。