为什么我的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>
首先给每个卡片加个占位容器,用aspect-ratio来保持比例。不过光靠CSS属性不太稳定,建议在样式里写死一个padding-bottom来保证高度:
然后把图片src换成空值,在data-src放真实地址。用IntersectionObserver监控元素进入视口时再加载图片:
这样能有效减少布局偏移,我试过好多次了。记得给图片加上loading="lazy"属性,还能进一步优化。累死个人,但这招真管用。