一、<picture> 的核心概念

<picture> 是一个容器元素,内部包含零个或多个 <source> 子元素和一个必需的 <img> 元素。浏览器会根据屏幕尺寸、设备像素比、支持的图片格式等条件,从 <source> 中选择最合适的资源进行加载,而 <img> 则作为最终回退,确保在不支持 <picture> 的旧浏览器中也能正常显示图片。

基本语法结构
<picture>
   <!-- 大屏幕(桌面) -->
   <source media="(min-width: 1200px)" srcset="https://picsum.photos/1200/600">
   <!-- 中等屏幕(平板) -->
   <source media="(min-width: 768px)" srcset="https://picsum.photos/800/400">
   <!-- 小屏幕(手机) -->
   <img src="https://picsum.photos/400/200" alt="响应式图片示例" loading="lazy">
</picture>

二、<picture> 的主要优势

2.1 响应式图片加载
  • 根据屏幕尺寸加载不同分辨率的图片,避免小屏设备浪费带宽。

  • 为大屏或高分辨率屏幕提供高清图片,保证显示质量。

2.2 多格式支持与优雅降级

现代图片格式(如 WebP、AVIF)压缩率更高,但部分浏览器尚未支持。<picture> 可以按优先级列出多种格式,浏览器自动选择第一个支持的格式,不支持的场景无缝回退。

<picture>
  <!-- 优先使用AVIF格式 -->
  <source type="image/avif" srcset="https://picsum.photos/800/400">
  <!-- 其次使用WebP格式 -->
  <source type="image/webp" srcset="https://picsum.photos/800/400">
  <!-- 最后使用JPEG格式 -->
  <img src="https://picsum.photos/800/400" alt="格式优化示例" loading="lazy">
</picture>
2.3 艺术指导(Art Direction)

针对不同屏幕尺寸或设备方向,展示不同构图或裁剪版本的图片。例如移动端显示人物特写,桌面端显示完整场景。

<picture>
   <!-- 桌面端显示横版图片 -->
   <source media="(min-width: 768px)" srcset="https://picsum.photos/800/400">
   <!-- 移动端显示竖版图片 -->
   <source media="(max-width: 767px)" srcset="https://picsum.photos/400/600">
   <img src="https://picsum.photos/400/200" alt="艺术指导示例" loading="lazy">
</picture>

艺术指导”在 Web 图片中,指的是:

根据设备的屏幕尺寸、方向或其他特性,有选择地展示同一主题下不同构图、不同焦点、不同裁剪方式的图片版本,以达到最佳的视觉传达效果。

它强调的是“对图片内容本身进行差异化设计”,而不仅仅是技术上的分辨率适配。理解了这一点,你就会明白为什么这个术语既准确又形象。

三、关键属性详解

<source> 的核心属性

属性

作用

使用场景

srcset

定义一组图片资源,浏览器根据条件选择最合适的

响应式图片、高 DPI 适配

media

媒体查询条件,决定何时使用该媒体查询条件,决定何时使用该 <source>

艺术指导、不同屏幕尺寸

type

指定 MIME 类型,用于格式能力检测

现代图片格式降级

sizes

定义不同视口下图片的显示宽度,辅助 srcset 选择

配合宽度描述符(w)使用

<img>的角色
  • 作为所有 <source> 均不匹配时的最终回退。

  • 必须包含 alt 属性,保证无障碍访问。

  • 可附加 loading="lazy"、decoding="async" 等性能优化属性。

四、srcset 与 sizes 的深入理解

srcset 和 sizes 是 <img> 或 <source> 中实现响应式图片的重要机制,常与 <picture> 搭配使用。

4.1 宽度描述符(w)

srcset 中使用 w 表示图片的原始宽度(像素),配合 sizes 让浏览器根据视口宽度选择合适的图片。

 <!-- 同一张图片的不同宽度版本 (picsum 同一ID不同尺寸) -->
 <img src="https://picsum.photos/id/100/800/500"
      srcset="https://picsum.photos/id/100/400/250 400w,
              https://picsum.photos/id/100/800/500 800w,
              https://picsum.photos/id/100/1200/750 1200w,
              https://picsum.photos/id/100/1600/1000 1600w"
      sizes="(max-width: 600px) 100vw, (max-width: 1000px) 80vw, 1200px"
      alt="山谷河流风景,根据视口宽度自动选择合适分辨率"
      loading="lazy"
      style="width:100%; height:auto;">
  • sizes 含义:视口 ≤600px 时图片占 100% 宽度;601–1000px 时占 80% 宽度;> 1000px 时,占 1200px宽度。

  • 浏览器会结合当前视口宽度与 sizes 计算出图片所需实际宽度,再从 srcset 中选择最合适的图片源。

4.2 像素密度描述符(x)

用于适配不同 DPI 屏幕(如 Retina 屏),浏览器根据设备像素比选择对应倍率的图片。

<picture>
   <source srcset="https://picsum.photos/400/200 1x,
                   https://picsum.photos/800/400 2x,
                   https://picsum.photos/1200/600 3x">
   <img src="https://picsum.photos/400/200"
        srcset="https://picsum.photos/400/200 1x,
                https://picsum.photos/800/400 2x"
   alt="高DPI优化示例">
</picture>

  • 注意:w 和 x 描述符不能混用,需根据场景选择一种。

4.3 <source> 中的 src 与 srcset 差异
  • src:指定单一资源,适用于简单的格式降级场景。

  • srcset:指定一组资源,浏览器根据条件自动选择最优,更适合响应式场景。

<!-- 使用 src:单一格式降级 -->
<source src="image.webp" type="image/webp">

<!-- 使用 srcset:多分辨率响应式 -->
<source srcset="small.jpg 480w, large.jpg 1200w" sizes="100vw">

五、<picture> 与 <img> + srcset 的对比

特性

<picture>

<img> + srcset

艺术指导(不同构图)

✅ 支持

 ❌ 不支持

多格式选择(WebP/AVIF)

✅ 支持

❌ 仅单一格式

媒体查询

✅ 完整支持

❌ 有限(仅通过 sizes 间接影响)

语法复杂度

较高

较低

适用场景

杂响应式、格式优化、艺术指导

简单分辨率适配、高 DPI 适配

六、最佳实践与性能优化

  1. 始终提供有意义的 alt 属性

  • 确保屏幕阅读器用户能理解图片内容,装饰性图片可使用空 alt。

2. 合理设置 sizes 属性

  • 当使用宽度描述符(w)时,sizes 能显著提升浏览器选择图片资源的效率,避免“猜测”。

  1. 结合懒加载与解码优化

  • 在 <img> 上使用 loading="lazy" 延迟加载视口外图片,decoding="async" 避免解码阻塞主线程。

  1. 多格式图片自动化生成  

  • 通过构建工具(如 ImageMagick、sharp)生成多种尺寸和多种格式(AVIF、WebP、JPEG)的图片变体。

  1. 测试回退机制

  • 在旧版浏览器(如 IE11)中验证 <img> 是否正常显示,必要时引入 Picturefill 等 polyfill。

七、浏览器兼容性

<picture>在现代浏览器中支持良好:

对于不支持的浏览器,会忽略 <picture> 和 <source>,直接渲染 <img>,因此只要提供了有效的 <img> 回退,即可保证基本功能。

建议访问《Can I Use》网站,以及时了解 picture 属性在各类浏览器中的最新兼容性支持情况。

总结

<picture>元素将“资源选择”与“资源渲染”分离,使图片交付真正做到“因地制宜”。它不仅能根据屏幕尺寸、设备像素比选择最合适的图片,还能实现多格式优雅降级与艺术指导,是现代 Web 图片优化的核心工具。

在实际开发中,建议结合 srcset、sizes、media、type 等属性,根据内容类型与设备特征综合运用。掌握 <picture>,意味着你已掌握了高性能、高兼容性、高用户体验的图片交付方案。

彩蛋

文中配有完整示例,点击《HTML picture元素完全指南 | 响应式图片深度示例》即可查看。