srcset + sizes 比单纯 css 缩放更省带宽,因浏览器在请求前依据 sizes 声明的渲染宽度和 srcset 中的 w 描述符选择最匹配的物理图片,避免下载过大原图后再缩放。

为什么 srcset + sizes 比单纯 CSS 缩放省带宽
浏览器不会因为你写了 max-width: 100% 就自动换小图——它仍会下载 src 指向的原始大图,再在本地缩放。而 srcset + sizes 是声明式资源选择,浏览器在发起请求前就决定加载哪张物理文件。
关键点在于:sizes 告诉浏览器“这张图在当前视口下实际渲染多宽”,srcset 提供“每张图的固有宽度(w)”,浏览器据此选最接近但不小于渲染宽度的源。比如 sizes="(max-width: 768px) 100vw, 50vw" 配合 srcset="p-480w.webp 480w, p-800w.webp 800w, p-1200w.webp 1200w",在 iPhone SE(375px 宽)上会选 p-480w.webp,而非下载 1200w 的版本。
- 必须用
w描述符,不用x:电商页图多为布局图(非图标),按渲染宽度选比按 DPR 选更可靠 -
src属性仅作 fallback,不参与选图逻辑;现代浏览器基本忽略它 - 避免
sizes写死像素值(如"480px"),否则在高 DPR 设备上可能选错图
picture 元素如何实现 WebP 优先 + JPEG 降级
<picture></picture> 不是炫技工具,而是格式控制开关。电商主图、Banner 等关键图像必须支持 WebP(体积比 JPEG 小 30%+),但 IE11 和旧 Android WebView 不支持,需降级。
顺序即策略:浏览器从上到下解析 <source></source>,遇到第一个匹配且格式支持的就停。所以把 WebP 放前面,JPEG 放最后,中间可加 AVIF(Chrome 119+ 支持):
<picture><source type="image/avif" srcset="p-avif-800.webp 800w, p-avif-1200.webp 1200w"><source type="image/webp" srcset="p-webp-800.webp 800w, p-webp-1200.webp 1200w"> @@##@@ </source></source></picture>
-
<img src="p-jpeg-800.jpg" srcset="p-jpeg-800.jpg 800w, p-jpeg-1200.jpg 1200w" alt="商品主图">必须存在,且带src和srcset:它是 fallback,也是语义和可访问性载体 - 不要在
<source></source>里写media又写type:两者混用易导致无匹配项,浏览器退到<img>,但你本意可能是格式降级而非断点切换 - AVIF 虽压缩率更高(比 WebP 再减 20%),但编码耗时长,活动期建议预生成,别 on-demand
电商活动图尺寸该生成几个才不浪费存储又够用
生成 10+ 个尺寸版本是典型反模式。Laravel 或自建服务中,每图存 480w、800w、1200w 三个 WebP 版本,覆盖 99% 场景。
理由很直接:CSS 弹性缩放能消化中间差值。480w 图在 375px 宽屏上缩放 20% 清晰度损失肉眼不可辨;1200w 图在 1440px 宽屏上缩放 15% 也远优于加载 2400w 原图再缩放 40%。
- 放弃为 320、375、414、768 等设备宽度单独出图:这些只是 CSS 媒体查询断点,不是物理分辨率边界
- 800w 是性价比拐点:覆盖 iPad(768px)、小桌面(1024px 缩放)、以及多数折叠屏展开态
- CDN 开启 Brotli 压缩 + 强缓存(
Cache-Control: public, max-age=31536000),版本化 URL(如/img/p-12345-800w.webp?v=202606)避免缓存污染
懒加载 loading="lazy" 在活动页的实际效果与风险
对首屏外图片加 loading="lazy" 能降低初始 HTML 体积和首屏请求数,但电商活动页要小心。
滚动触发加载依赖 IntersectionObserver,而低端安卓 WebView 或 iOS 12-13 的兼容性差,可能导致图片永远不加载。更隐蔽的问题是:当用户快速滑动时,loading="lazy" 可能延迟加载关键商品图,影响转化。
- 首屏内所有图禁用
loading="lazy",包括 Banner、Tab 栏图标、顶部导航图 - 商品列表图可用,但需配合
decoding="async"防止解码阻塞渲染 - 绝对不要对
<picture></picture>内的<source></source>单独设 lazy——它只作用于最终渲染的<img>
真正省带宽的点不在“要不要懒加载”,而在“让浏览器只请求它真需要的那张图”。这点做扎实了,后续优化才有意义。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











