为 Core Web Vitals 优化图片:LCP、CLS 和 INP 实战指南

core-web-vitals-images

对绝大多数网站来说,图片是 Core Web Vitals 分数最大的单一影响因素。它通常是最大的可见元素、最常引发布局抖动,也经常是阻塞主线程的元凶。本文把所有跟图片有关的优化手段串起来,让 LCPCLSINP 三项都进入绿区。

三大指标速记

三个指标都跟图片相关,下面逐项说明怎么优化。

1. 让 LCP 图片优先加载

大多数落地页的 LCP 元素就是首屏大图。三个立竿见影的动作:

2. 用现代格式

把 JPG/PNG 换成 WebP 或 AVIF,体积通常能再降 25%–50% 而画质不变,直接喂入 LCP。用 <picture> 给老浏览器留个 JPG 兜底:

<picture>
  <source srcset="/hero.avif" type="image/avif">
  <source srcset="/hero.webp" type="image/webp">
  <img src="/24picture/hero.jpg" alt="..." width="1920" height="1080">
</picture>

用我们的 PNG 转 WebP 工具几秒就能转完。

3. 压缩要狠,但要合理

JPG/WebP 的质量 80 是大多数照片的甜点位——肉眼跟质量 95 没区别,但体积小一半。图形类用无损 WebP 或压缩 PNG。一键瘦身可用我们的 图片压缩工具(纯浏览器,文件不离开你电脑)。

4. 永远写 width 和 height

这是治 CLS 最重要的一招。widthheight 不是布局尺寸,现代浏览器用它们提前预留宽高比空间

<img src="/24picture/hero.webp" width="1920" height="1080" alt="...">

配合 CSS max-width: 100%; height: auto;,图片自适应缩放且不会引起布局偏移。

5. 用 srcset 做响应式

给一台 360 像素宽的手机送 4K 图就是浪费带宽。用 srcset + sizes,让每个设备只下需要的:

<img
  src="/24picture/hero-1280.webp"
  srcset="/hero-640.webp 640w, /hero-1280.webp 1280w, /hero-1920.webp 1920w"
  sizes="(max-width: 768px) 100vw, 1280px"
  alt="..." width="1920" height="1080">

批量调尺寸用我们的 尺寸调整工具

6. 首屏以下统统懒加载

给所有首屏外的 <img>loading="lazy"。浏览器会在用户滚动到附近时才下载它们,把带宽和 CPU 留给 LCP,间接改善 INP。

例外:LCP 图本身和你预加载的图不能loading="lazy"

7. 异步解码

给非关键图片加 decoding="async",浏览器会把解码挪出主线程,避免在滚动或点击时被大图解码卡住,对 INP 友好。

8. 留意 Web 字体和图标雪碧图

用了图标雪碧图或大型 SVG,记得过一下 SVG 优化器。我们的 SVG 优化器通常能砍掉 30–60% 体积,并降低解析时间——这对交互密集的页面 INP 帮助显著。

9. 警惕会跳的轮播图

轮播容器要写死高度。如果不同图片宽高比不一致,用 object-fit: cover 统一比例。每加载一张新图就改变尺寸的轮播,是 CLS 的"重灾区"。

10. 缓存要狠

给带 hash 的图片文件名设置 Cache-Control: public, max-age=31536000, immutable。回访用户带缓存命中,LCP 几乎是满分。

快速自查清单

小贴士:我们见到 90% 的 LCP 失分都是因为同一张未优化的巨图。把它转成 WebP,写好尺寸,加上 preload,分数立刻就跳。

结论

Core Web Vitals 不是黑盒。图片几乎主导一切,绝大多数修复只是一行 HTML 或一次格式转换。把首屏图搞定,所有图都写宽高,首屏外懒加载——你就能过线。

不知道从哪开始?把首屏图过一遍我们的 压缩工具,再用 PNG 转 WebP 转好——LCP 会立刻下降。