图片优化不是"可有可无的小技巧",而是首屏速度、视觉稳定与交互响应 的主战场。2024--2025 年,Web
平台在指标与 API
上有重要变化:INP
取代 FID
成为核心指标 、Fetch Priority
更易用、响应式预加载 更精细。本文系统梳理 2025 年如何正确使用 <img>
,并给出可复制 的代码模板、避坑清单 与上线前检查表。
为什么图片优化是必须项
- 图片是网页上最常见、体量最大的一类资源,直接影响最大内容绘制
LCP
、累计布局偏移CLS
与 交互响应INP
。 - 合理的尺寸、格式与加载顺序,可以显著降低字节、减少竞争、提升稳定性与响应速度。

2025 年需要先知道的三件事(重要变更)
-
INP
取代FID
成为核心指标2024-03-12 起,
INP
(Interaction to Next Paint
) 正式替代FID
成为Core Web Vitals
的响应性指标;Chrome
等工具也相应弃用FID
。INP
≤ 200 ms 视为"良好"。这意味着你既要管好LCP/CLS
,也要关注交互阶段的脚本与渲染开销。 -
优先级提示(
Fetch Priority
)已普及为关键图片(通常是
LCP
图片)增加fetchpriority="high"
,可显著提前其抓取相对次要资源(如下文脚本、非首屏图片)。该属性已在Chrome
、Safari
、Firefox
获得支持。 -
预加载响应式图片:用
imagesrcset
/imagesizes
如果你要预加载带
srcset
的图片,应在<link rel="preload">
上同时指定imagesrcset
与imagesizes
,否则浏览器可能预加载到错误尺寸;且不要 同时预加载多种格式(如AVIF
与WebP
),否则可能两者都被下载。
核心指标与目标值
LCP
(最大内容绘制) :衡量加载性能。为了提供良好的用户体验,请尽力在网页开始加载的 2.5 秒 内完成LCP
。CLS
(累计布局偏移) :衡量视觉稳定性。为了提供良好的用户体验,请尽力使CLS
得分低于 0.1。INP
(交互到下一次绘制) :衡量响应速度。为了提供良好的用户体验,请尽力将INP
控制在 200 毫秒以内。
CLS
:从"不会抖"开始
1. 给图片固有尺寸(最重要的一条)
设置固有尺寸能让浏览器在图片到来之前就预留空间,几乎杜绝 CLS
:
html
<!-- 固有宽高:让浏览器能预留空间,避免抖动 -->
<img
src="/images/keyboard.jpg"
alt="粉色键盘的近景照片"
width="1200" height="483" />
现代浏览器会根据 width
/height
在图片尚未下载 前推导出纵横比,提前占位,几乎杜绝因图片导致的 CLS
。布局再怎么缩放(例如 width: 100%
),高度都能按比例计算。

2. 尺寸难预知时:用 aspect-ratio
或"占位尺寸"
不知道实际像素,但知道大致长宽比:
css
/* 知道大致宽高比时 */
.thumb {
aspect-ratio: 4 / 3;
width: 100%;
}
.thumb > img {
width: 100%;
height: 100%;
object-fit: cover;
}
长页/瀑布流里,延迟渲染区域配合:
css
section {
content-visibility: auto;
contain-intrinsic-size: auto 500px; /* 未渲染前的占位尺寸,防抖动 */
}
content-visibility
让视口外内容跳过布局/绘制,contain-intrinsic-size
负责预留空间,避免滚动到该区域时发生位移。
LCP
:把"最大内容"尽快送到眼前
LCP
往往就是首屏主视觉图(Hero
) 。要赢在毫秒级:
1. 不要 给 LCP
图加 loading="lazy"
懒加载会推迟"是否在视口"与"发起请求"的时机,必然 拖慢 LCP
。首屏图请移除 loading="lazy"
。
2. 用 Fetch Priority
提升优先级
html
<!-- 关键:提升抓取优先级 -->
<img
src="/img/hero-1600.jpg"
srcset="/img/hero-1200.jpg 1200w, /img/hero-1600.jpg 1600w"
sizes="(max-width: 900px) 100vw, 70vw"
width="1600" height="1000"
fetchpriority="high"
alt="新品主视觉" />
这会把 LCP
图尽早纳入"第一阶段"关键下载序列,这一提示已被主流浏览器采纳。
3. 必要时做响应式预加载
html
<!-- 与 imagesrcset 配合使用 -->
<link
rel="preload" as="image"
href="/img/hero-1600.jpg"
imagesrcset="/img/hero-1200.jpg 1200w, /img/hero-1600.jpg 1600w"
imagesizes="(max-width: 900px) 100vw, 70vw"
fetchpriority="high" />
注意:
- 不要同时预加载
AVIF
与WebP
,否则可能两者都被下载,浪费带宽。 - 如果
LCP
图在HTML
中位置已很靠前,未必需要预加载(避免"抢带宽")。
响应式图片:w + sizes
是首选
最佳实践 是使用宽度描述符 (800w/1200w/1600w
)配合 sizes
,告诉浏览器在不同条件下的实际渲染宽度。
html
<img
src="/img/post-800.jpg"
srcset="/img/post-800.jpg 800w, /img/post-1200.jpg 1200w, /img/post-1600.jpg 1600w"
sizes="(max-width: 768px) 100vw, 70vw"
width="1600" height="1067"
alt="活动现场" />
要点:
-
准确书写
sizes
(按布局真实占宽);避免始终100vw
导致过大图浪费。 -
背景图可用
image-set()
做密度切换:css.banner { background-image: image-set(url(/img/banner.avif) 1x, url(/img/banner@2x.avif) 2x); background-size: cover; background-position: center; }
让浏览器按
DPR
选择合适资源。
格式策略:AVIF
→ WebP
→ JPEG
AVIF
:高压缩率且主流浏览器广泛支持;优先推荐。WebP
:兼容面最广,作为AVIF
的回退非常合适。JPEG
:最终兜底。
可用 <picture>
同时宣告多个格式并提供回退:
html
<picture>
<source type="image/avif" srcset="/img/photo.avif">
<source type="image/webp" srcset="/img/photo.webp">
<img src="/img/photo.jpg" alt="合影" width="1600" height="1067">
</picture>

仍要预加载时,只预加载最可能被采用的那个格式。
懒加载与解码:只"懒"看不见的图
-
首屏外图片使用:
html<img src="/img/gallery-1.webp" loading="lazy" decoding="async" width="800" height="600" alt="画廊图片" />
-
loading="lazy"
让视口外图片延后请求,缓解首屏竞争;decoding="async"
避免同步解码阻塞渲染。 -
切记 :
LCP
图不要懒加载。
渲染级优化:长列表/长文档的隐藏功臣
当页面包含评论区、长目录、商品瀑布流等大量视口外内容时:
css
.section {
content-visibility: auto; /* 视口外跳过布局/绘制 */
contain-intrinsic-size: auto 500px; /* 先给一个合理占位,避免滚动到时位移 */
}
这组属性能有效减少首屏工作量并避免后续 CLS
。
高分屏与 DPR
:何时用 x
、何时用 w
- 布局宽度已知 :优先
w + sizes
(下载更精准、带宽利用更好)。 - 只想做密度切换 :可用
1x/2x/3x
(x
描述符)。 - 背景图:用
image-set()
,结合background-size: cover/contain
。

无障碍与语义
- 始终写好
alt
:传达图片语义内容;纯装饰性图片可用空alt=""
或使用CSS
背景。 - 关键图片可结合
elementtiming="hero"
,方便用Performance Element Timing
观测关键渲染(进阶)。
动图与视频:别再用重量级 GIF
- 体量大、压缩差的
GIF
会极大拖慢页面。 - 建议改为
MP4/WebM
或AVIF/WebP
动图 ;必要时用<video>
控制播放与无障碍。

数据节省与用户偏好(可选)
需要面向弱网/昂贵网络的站点,可根据用户偏好减少图片资源:
-
CSS
:css@media (prefers-reduced-data: reduce) { /* 降级背景图、关闭自动播放等 */ }
-
HTTP Client Hints
(服务器侧协商):Sec-CH-Save-Data
/Sec-CH-Prefers-Reduced-Data
等(属进阶能力,兼容性需评估)。
场景化模板(复制即可用)
首屏主视觉(LCP
)
html
<!-- head(可选):确有必要时做响应式预加载 -->
<link rel="preload" as="image"
href="/img/hero-1600.jpg"
imagesrcset="/img/hero-1200.jpg 1200w, /img/hero-1600.jpg 1600w"
imagesizes="(max-width: 900px) 100vw, 70vw"
fetchpriority="high">
<!-- body:真正渲染 -->
<picture>
<source type="image/avif" srcset="/img/hero-1200.avif 1200w, /img/hero-1600.avif 1600w" sizes="(max-width: 900px) 100vw, 70vw">
<source type="image/webp" srcset="/img/hero-1200.webp 1200w, /img/hero-1600.webp 1600w" sizes="(max-width: 900px) 100vw, 70vw">
<img
src="/img/hero-1600.jpg"
srcset="/img/hero-1200.jpg 1200w, /img/hero-1600.jpg 1600w"
sizes="(max-width: 900px) 100vw, 70vw"
width="1600" height="1000"
fetchpriority="high" <!-- 关键:别 lazy -->
alt="新品主视觉">
</picture>
要点回顾:不要 给 LCP
图加 loading="lazy"
;必要时再考虑预加载并配合 imagesrcset
/imagesizes
。
非首屏图(卡片/列表/瀑布流)
html
<img
src="/img/card-400.avif"
srcset="/img/card-400.avif 400w, /img/card-800.avif 800w"
sizes="(max-width: 600px) 50vw, 25vw"
width="800" height="600"
loading="lazy" decoding="async"
alt="卡片缩略图">
CSS
背景(横幅/装饰)
css
.banner {
background-image: image-set(url(/img/banner.avif) 1x, url(/img/banner@2x.avif) 2x);
background-size: cover;
background-position: center;
min-block-size: 40vh;
}
CMS
/ 未知宽高比的缩略图(防抖动)
html
<figure class="thumb">
<img src="/cms/auto.webp" width="1200" height="800" alt="图文摘要">
<figcaption>......</figcaption>
</figure>
css
.thumb { aspect-ratio: 3 / 2; }
.thumb > img { width: 100%; height: 100%; object-fit: cover; }
即使图片比例波动,仍能保证不抖动。
常见误区与修复
- 把首屏图懒加载 → 直接移除
loading="lazy"
,并考虑fetchpriority="high"
;必要时配合预加载。 - 预加载多个格式 (
AVIF
+WebP
)→ 只预加载最终最可能使用的那个。 sizes
过大 导致浪费 → 用真实占宽(可借助DevTools
"渲染宽度"调试)。CLS
抖动 → 添加width/height
或aspect-ratio
;对延迟渲染区域用contain-intrinsic-size
。INP
偏高 → 交互时减少长任务、降低同步JS
、延迟非关键图片与第三方脚本加载。
速查清单(Checklist
)
- 尺寸 :所有
<img>
具备width
/height
或可推导的aspect-ratio
(防CLS
)。 LCP
图 :不懒加载,设fetchpriority="high"
;必要时响应式预加载。- 响应式 :以
w + sizes
为主;sizes
与真实占宽匹配。 - 格式 :
AVIF
优先,WebP
兜底,JPEG
再兜底;避免双格式同时预加载。 - 懒加载 :首屏外图片一律
loading="lazy"
,并考虑decoding="async"
。 - 渲染 :大量折叠内容使用
content-visibility: auto
+contain-intrinsic-size
。 - 动图 : 尽量用 视频 或
AVIF/WebP
动图 替代GIF
。 - 指标 :
LCP ≤ 2.5s
、CLS ≤ 0.1
、INP ≤ 200ms
(以第 75 分位、真实用户数据为准)。
FAQ:常见问题解答
Q1:我用 <picture>
了,还需要写 width/height
吗? 需要。width/height
写在最终的 <img>
上,用于推导纵横比并占位,防止 CLS
。
Q2:主视觉图到底要不要预加载? 视情况。若它在 HTML
里位置已有靠前且无强竞争,fetchpriority="high"
即可;若抓取确实偏晚,再考虑"响应式预加载"(imagesrcset
/imagesizes
),避免双格式并发。
Q3:sizes
很难写对,有没有经验值? 先按布局估算,例如:移动端 100vw
,桌面端主列 70vw
;然后用 DevTools
检查实际渲染宽度,微调到更贴合的表达。
Q4:电商类长列表如何降低 CLS
与 INP
? 给所有缩略图加固有尺寸;列表容器使用 content-visibility: auto
+ contain-intrinsic-size
;首屏外图片全部懒加载;交互时减少同步 JS
与第三方阻塞。
结语
2025 年的图片优化要点并不复杂:把该给浏览器的信息给全(尺寸、占宽、优先级),把该延后的资源延后(非首屏图、长列表),把会出问题的环节前置处理好(格式策略、预加载规范) 。照本文模板与清单落地,你的首屏更快、页面更稳、交互更流畅。