必须用仅当同时需“换构图”(如桌面全景/手机特写)和“换格式”(如avif→webp→jpeg);否则用更简稳。

只在真需要“换构图”或“换格式”时才用 <picture></picture>,其他情况直接写 <img srcset="" sizes=""> 更省力、更稳、更少出错。
什么情况下必须用 <picture></picture>?
只有两个硬需求同时存在时,<picture></picture> 才不可替代:
- 内容语义要变——比如桌面端展示全景场景,移动端只裁人脸特写(art direction)
- 格式要降级——比如优先用
image/avif,不支持就切image/webp,再不行才上image/jpeg
如果只是“同一张图在不同宽度下加载不同分辨率”,<img> 的 srcset + sizes 就够了,不用绕一圈写 <picture></picture>。
<source></source> 的 media 断点怎么写才不翻车
断点不是越细越好,而是要覆盖常见设备宽度、无重叠、无间隙,并且顺序从大到小排:
- 用
min-width开头(如media="(min-width: 1200px)"),别用max-width打头——否则容易漏掉超大屏 - 相邻断点必须衔接:比如
(min-width: 769px)接(min-width: 481px),中间不能留白 - 绝对不要用
orientation: landscape——iOS Safari 和部分桌面浏览器行为不一致,匹配失败静默降级 - 所有
media值必须是合法 CSS 媒体查询,括号一个都不能少;media="768px"或media="tablet"直接被忽略
<img> 必须写的三项,缺一不可
<picture></picture> 最常出问题的地方,就是最后一行的 <img> 写得不完整:
- 必须有
src属性——没有它,Safari 16.4 之前版本会空白,其他浏览器也可能 fallback 失败 - 必须有
alt属性——无障碍强制要求,也防止图片 404 时页面崩形 - 必须是
<picture></picture>的最后一个子元素——浏览器按顺序匹配,<img>是兜底项,放错位置等于没写 - 别给
<img>写srcset或sizes——它只负责 fallback,这些属性在<img>上无效
格式降级时 type 和顺序怎么安排
type 不是“多选一”,而是“命中即停”。浏览器只认是否支持该 MIME 类型,不推理、不叠加:
- 把最现代的格式放最上面:
<source type="image/avif" srcset="..."></source>→<source type="image/webp" srcset="..."></source>→ 最后才是<img src="..."> - 不要混写
type和media在同一个<source></source>里还指望它“智能组合”——浏览器只检查是否同时满足,不满足就跳过整条 - 服务器返回的 Content-Type 必须和
type值严格一致,image/webp文件却返回Content-Type: image/jpeg,这条<source></source>就会被静默跳过
真正省力的关键,是先想清楚:这张图到底要不要换内容?要不要换格式?如果答案都是“否”,那就别碰 <picture></picture>——一行 <img srcset="a.jpg 400w, b.jpg 800w" sizes="(max-width: 768px) 100vw, 50vw"> 足够扛住绝大多数场景。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











