移动端优先的适配核心是小屏规则置顶、用max-width写断点、的srcset处理dpr切换;中2x无效因其仅响应media匹配,不读取x描述符。

移动端优先的 <picture></picture> 适配,核心是把小屏规则放最前、用 max-width 写断点、<img> 的 srcset 负责 DPR 切换,而不是靠 <source></source> 的 2x。
为什么 <source></source> 里写 2x 没用
<source></source> 的 srcset 只响应 media 匹配结果,完全不看 x 描述符。浏览器拿到匹配的 <source></source> 后,直接加载它指定的 URL,DPR 信息被丢弃。
- 错误示例:
<source media="(max-width: 480px)" srcset="mob@2x.jpg 2x"></source>→ 小屏设备无论 DPR 是 1 还是 3,都只加载mob@2x.jpg - 正确做法:把密度适配交给最外层
<img>的srcset,且必须配sizes(如果用了w)或纯x(如"a.jpg 1x, a@2x.jpg 2x") - 注意:
sizes写在<img>上才生效;写在<source></source>里会被忽略
media 断点必须从窄到宽,且单位不能省
移动端优先意味着第一个 <source></source> 就该覆盖手机,后续依次放宽条件。浏览器是“短路匹配”,不是“多选”。
- ✅ 推荐顺序:
media="(max-width: 479px)"→media="(min-width: 480px) and (max-width: 1023px)"→media="(min-width: 1024px)" - ❌ 错误写法:
media="max-width: 480px"(缺括号)或media="480px"(非法语法),整条<source></source>被跳过 - ⚠️ 避免重叠断点:比如
max-width: 768px和min-width: 768px在 768px 宽时行为不可控,推荐用开区间(如479px / 480px)
完整结构里 <img> 不是可选项,而是语义和降级核心
<img> 必须存在,且必须放在所有 <source></source> 之后。它既是 fallback,也承载 alt、srcset、sizes 和加载逻辑。
- 漏掉
<img>→ 页面不显示图,控制台报错或静默失败 -
<img>没写src→ 即使<source></source>匹配成功,部分旧浏览器或爬虫可能无法解析 -
<img>的src应设为最小屏通用图(如mob-400w.jpg),作为所有未命中<source></source>时的兜底
格式降级要用 type,且顺序决定优先级
现代格式(WebP/AVIF)支持靠 <source type="image/webp"></source> 声明,浏览器按顺序检查,首个支持的即被采用。
- ✅ 正确结构:先写
avif,再webp,最后无type的<img>用jpg或png - ❌ 把
jpg的<source></source>放最前 → 所有浏览器都加载它,新格式永远没机会触发 - ⚠️
type值必须是标准 MIME 类型:image/avif,不是avif或.avif
真正容易被忽略的是:你写的 media 数值,必须和项目中实际生效的视口宽度一致——不是设备物理像素,也不是你猜的“手机大概 375px”,而是 document.documentElement.clientWidth 在那个断点下的真实值。CSS 里改了 max-width: 480px,HTML 里就得同步,否则图片和布局就错位了。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











