为什么我的Vue页面CLS总是超标?图片加载导致布局偏移怎么解决?
我在用Vue做商品列表页,发现Lighthouse测出来的CLS经常超过0.25,主要问题好像是图片加载时没占位,导致下面的内容突然被撑开。我明明给img加了固定宽高,但还是不行。
试过用v-lazy或者CSS aspect-ratio,但效果不稳定。是不是哪里写错了?
<template>
<div class="product-list">
<div v-for="item in products" :key="item.id" class="card">
<img :src="item.image" width="300" height="300" />
<h3>{{ item.name }}</h3>
</div>
</div>
</template>
首先在你的
.card里面包一层div当作占位容器:然后在CSS里这样写:
记得给图片加上loading="lazy"属性:
<img loading="lazy" ...>这样能进一步优化加载体验。这个方案我在好几个项目里用过,效果不错,至少CLS能控制在合理范围了。折腾CLS真是个体力活啊。
首先给每个卡片加个占位容器,用aspect-ratio来保持比例。不过光靠CSS属性不太稳定,建议在样式里写死一个padding-bottom来保证高度:
然后把图片src换成空值,在data-src放真实地址。用IntersectionObserver监控元素进入视口时再加载图片:
这样能有效减少布局偏移,我试过好多次了。记得给图片加上loading="lazy"属性,还能进一步优化。累死个人,但这招真管用。