不是的升级版,而是其“条件调度层”,自身不渲染图片,仅按的media顺序匹配首个为true的预裁剪图源;常见失效因断点顺序错误(须宽→窄)、media写在上、缺括号、置于后、断点重叠或缺失src/alt。

直接说结论:<picture></picture> 不是 <img> 的升级版,而是它的“条件调度层”——它自己不显示图,只决定该让哪个 <source></source> 或最终的 <img> 上场。
为什么 <source></source> 总是不生效?顺序和断点写反了
浏览器对 <source></source> 是从上到下线性扫描,命中第一个就停,后面全忽略。常见错误是把小屏规则放最前:
- ❌ 错误写法:
<source media="(max-width: 768px)" srcset="m.jpg"></source>→ 所有设备都匹配这条,桌面图永远加载不到 - ✅ 正确顺序:宽屏优先,窄屏兜底,比如:
<source media="(min-width: 1201px)"></source>→<source media="(min-width: 769px)"></source>→<source media="(max-width: 768px)"></source> - 断点必须无重叠、无间隙:用
768px和769px,别用768px和768px,否则 768px 视口行为不可控
media 属性只能写在 <source></source> 上,别塞进 <picture></picture>
<picture media="..."></picture> 这种写法完全无效,浏览器直接跳过整个属性,不会报错也不会警告。
-
media必须是<source></source>的属性,且值必须是合法 CSS 媒体查询,带括号、单位、空格规范,例如:media="(max-width: 480px)" - 写成
media="max-width: 480px"(缺括号)或media="480px"(非媒体查询)→ 静默失效 - iOS Safari 对
orientation: landscape支持不稳定,别拿它做核心断点
<img> 不是可选的,是强制存在的语义与降级基础
没有 <img>,<picture></picture> 就是空盒子——既不渲染图,也不读屏,旧浏览器(如 IE)直接无视整块结构。
-
<img>必须是<picture></picture>的最后一个子元素,且必须含src和alt -
alt不是装饰:它是屏幕阅读器唯一读取的内容,不能写“banner1”,得描述画面实质,比如“AI 芯片产线实拍,机械臂正在封装晶圆” - 所有
srcset和img[src]路径必须真实存在;404 不报错,只会静默 fallback 到下一条,调试得靠 Network 面板清缓存后看实际加载项
格式优先级和 type 属性容易被服务器拖垮
写 <source type="image/webp"></source> 没用,如果服务器返回的 Content-Type 不是 image/webp(大小写、拼写、空格全要一致),浏览器就当没看见。
-
type值必须是标准 MIME 类型,type="webp"或type="image/jpg"都非法 - 推荐三层 fallback:WebP → JPEG →
<img>的 JPG,确保兼容性 - 现代部署建议:Nginx/Apache 配置好 WebP 的
Content-Type,并开启Accept头协商,否则type形同虚设
真正卡住人的不是语法,是断点顺序、<img> 缺失、type 与服务端响应头不一致这三处——它们不出错,但会让整个 <picture></picture> 退化成一张静态图。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











