响应式图片
为什么需要多分辨率图片?
- 屏幕像素比不同: 高密度屏需要高分辨率资源, 否则画面发虚;
- 屏幕宽度不同: 窄屏取大图浪费带宽;
- 手段: 用
srcset提供候选集, 由浏览器按条件挑一张;
用像素比选择图片怎么写?
- 写法:
srcset中每项为URL + x 描述符, 如480w.jpg 1.5x; - 含义: 描述符表示该资源适合的屏幕像素比;
- 兜底: 不带描述符的项按
1x处理, 未匹配时用src;
<img
srcset="elva-fairy-320w.jpg, elva-fairy-480w.jpg 1.5x, elva-fairy-640w.jpg 2x"
src="elva-fairy-640w.jpg"
alt="Elva dressed as a fairy"
/>
用显示宽度选择图片怎么写?
- 写法:
srcset中每项为URL + 固有宽度, 如elva-fairy-480w.jpg 480w; sizes: 用媒体条件声明该图在不同条件下的显示宽度;- 选择: 浏览器结合显示宽度与像素比, 挑出足够清晰的候选;
<img
srcset="elva-fairy-480w.jpg 480w, elva-fairy-800w.jpg 800w"
sizes="(max-width: 600px) 480px,
800px"
src="elva-fairy-800w.jpg"
alt="Elva dressed as a fairy"
/>
picture 元素如何按格式与媒体条件选择图片?
- 结构:
picture内放多个source, 末尾放一个img兜底; - 顺序: 浏览器取第一个条件匹配的
source; - 条件属性:
type按 MIME 类型选格式、media按媒体查询选图、srcset给候选集; - 兜底: 不支持
picture或没有匹配项时显示img;
<picture>
<source srcset="photo.avif" type="image/avif" />
<source srcset="photo.webp" type="image/webp" />
<img src="photo.jpg" alt="photo" />
</picture>
<picture>
<source srcset="mdn-logo-wide.png" media="(min-width: 1000px)" />
<source srcset="mdn-logo.png" media="(min-width: 600px)" />
<img src="mdn-logo-narrow.png" alt="MDN" />
</picture>
picture 与 img 的 srcset 如何取舍?
| 需求 | 选择 |
|---|---|
| 同一张图换分辨率 | img + srcset |
| 换图片格式或按媒体条件换图 | picture + source |
- 结论:
picture多覆盖格式与构图两类切换, 只换分辨率时img更直接;