导读:图片常常占网站流量的 60% 以上,也是首屏变慢的头号来源。本文给一套可抄走的组合:格式选择对照、WebP/AVIF 落地要点、响应式图片与懒加载,配合一段可直接用的 HTML 与构建脚本。按这套做完,图片体积通常能降一半以上,首屏 LCP 明显改善。
选格式不是"最新最好",而是"场景匹配"。落地前先把四种主流格式放在一张表里对比:
格式 | 适用场景 | 压缩率 | 透明通道 | 兼容性 |
|---|---|---|---|---|
JPEG | 照片、渐变复杂图 | 基准 | 不支持 | 全兼容 |
PNG | 截图、图标、需要透明 | 低 | 支持 | 全兼容 |
WebP | 大部分场景的默认选择 | 比 JPEG 高 25%-35% | 支持 | 2020 年后全主流浏览器 |
AVIF | 图片量大、可接受编码耗时 | 比 WebP 再高 20%-30% | 支持 | Chrome/Edge/Firefox 支持,Safari 16+ 支持 |
一句话决策:默认 WebP;照片量大且用户主流是 Chrome 系,可以上 AVIF 并做回退;图标和需要无损的场景继续用 PNG。
WebP 三种模式对应不同场景:
转换工具用 cwebp 或构建插件即可:
cwebp -q 80 input.jpg -o output.webp要点:不要全站统一一个 quality,照片类可以 80,界面元素类用无损,避免放大失真或压缩过度。
AVIF 压缩率更高,但编码耗时明显长,兼容性仍有缺口。落地建议:
回退的标准写法是用 picture 元素:
<picture>
<source srcset="hero.avif" type="image/avif">
<source srcset="hero.webp" type="image/webp">
<img src="hero.jpg" alt="首屏主图" width="1200" height="630">
</picture>同一张图在不同设备上加载不同分辨率,避免手机端下载桌面大图。两段代码解决:
<img
src="photo-800.jpg"
srcset="photo-400.jpg 400w, photo-800.jpg 800w, photo-1200.jpg 1200w"
sizes="(max-width: 600px) 100vw, 50vw"
alt="文章配图">要点:srcset 里的 w 值要与真实文件宽度一致,sizes 描述的是布局占宽而不是设备宽度。两者写错,浏览器会选错图片。
sizes 的取值逻辑:先想清楚这张图在不同断点下占多宽。比如列表页配图,手机端占满一列(约 100vw),桌面端占两列布局的一半(约 50vw),就按上面的写法。如果一张图固定显示在 300px 宽的卡片里,直接写 sizes="300px",浏览器就不会去下载超过 300px 的版本。图片数量多、布局复杂的页面,可以用 sizes="(min-width: 1200px) calc(33vw - 20px), 100vw" 这类计算式,注意与 CSS 网格的实际宽度保持一致,差太多会浪费带宽或糊图。
首屏外的图片延迟加载,首屏内图片异步解码,避免渲染阻塞:
<img src="list-1.jpg" loading="lazy" decoding="async" alt="列表图">
<img src="hero.jpg" fetchpriority="high" alt="首屏主图">要点:首屏主图不要加 loading="lazy",否则反而拖慢 LCP;fetchpriority="high" 只给 1-2 张最重要的图。
原生懒加载对"进入视口才加载"的场景够用,但页面里若有大量首屏以下图片,配合 IntersectionObserver 做统一控制更灵活:可以给进入视口的图片补上真实 src,离开视口时暂停视频或取消请求。示例:
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
const img = entry.target;
if (img.dataset.src) { img.src = img.dataset.src; }
observer.unobserve(img);
}
});
}, { rootMargin: "200px" });
document.querySelectorAll("img[data-src]").forEach((img) => observer.observe(img));rootMargin 提前 200px 预加载,避免用户滚动到位置时图片才刚开始下载而闪白。
把格式转换放进构建流程而不是手工处理:打包时自动把 jpg/png 转出 webp,必要时再出一份 avif;CDN 开启图片处理参数(如 ?imageMogr2/format/webp),源图只存一份,按请求动态出图。灰度顺序建议:先 WebP 全量,稳定一周后再逐步加 AVIF 并观察回退率。同类分层在乔拓云企业网站的媒体资源模块中有对应实现,按"格式探测、降级回退、尺寸裁剪"分层落地,思路一致。
图片优化没有银弹,靠的是格式、尺寸、加载时机三层一起做。先做对照表定策略,再逐步灰度,最后用数据验收——这套流程比盲目上新技术更可靠。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。