<picture>

响应式用法

<img>标签的srcset属性和sizes属性分别解决了像素密度和屏幕大小的适配,但如果要同时适配不同像素密度、不同大小的屏幕,就要用到<picture>标签。

<picture>是一个容器标签,内部使用<source><img>,指定不同情况下加载的图像。

  1. <picture>
  2. <source media="(max-width: 500px)" srcset="cat-vertical.jpg">
  3. <source media="(min-width: 501px)" srcset="cat-horizontal.jpg">
  4. <img src="cat.jpg" alt="cat">
  5. </picture>

上面代码中,<picture>标签内部有两个<source>标签和一个<img>标签。

<picture>内部的<source>标签,主要使用media属性和srcset属性。media属性给出媒体查询表达式,srcset属性就是<img>标签的srcset属性,给出加载的图像文件。sizes属性其实这里也可以用,但由于有了media属性,就没有必要了。

浏览器按照<source>标签出现的顺序,依次判断当前设备是否满足media属性的媒体查询表达式,如果满足就加载srcset属性指定的图片文件,并且不再执行后面的<source>标签和<img>标签。

<img>标签是默认情况下加载的图像,用来满足上面所有<source>都不匹配的情况,或者不支持<picture>的老式浏览器。

上面例子中,设备宽度如果不超过500px,就加载竖屏的图像,否则加载横屏的图像。

下面给出一个例子,同时考虑屏幕尺寸和像素密度的适配。

  1. <picture>
  2. <source srcset="homepage-person@desktop.png,
  3. homepage-person@desktop-2x.png 2x"
  4. media="(min-width: 990px)">
  5. <source srcset="homepage-person@tablet.png,
  6. homepage-person@tablet-2x.png 2x"
  7. media="(min-width: 750px)">
  8. <img srcset="homepage-person@mobile.png,
  9. homepage-person@mobile-2x.png 2x"
  10. alt="Shopify Merchant, Corrine Anestopoulos">
  11. </picture>

上面代码中,<source>标签的media属性给出屏幕尺寸的适配条件,每个条件都用srcset属性,再给出两种像素密度的图像 URL。

图像格式的选择

除了响应式图像,<picture>标签还可以用来选择不同格式的图像。比如,如果当前浏览器支持 Webp 格式,就加载这种格式的图像,否则加载 PNG 图像。

  1. <picture>
  2. <source type="image/svg+xml" srcset="logo.xml">
  3. <source type="image/webp" srcset="logo.webp">
  4. <img src="logo.png" alt="ACME Corp">
  5. </picture>

上面代码中,<source>标签的type属性给出图像的 MIME 类型,srcset是对应的图像 URL。

浏览器按照<source>标签出现的顺序,依次检查是否支持type属性指定的图像格式,如果支持就加载图像,并且不再检查后面的<source>标签了。上面例子中,图像加载优先顺序依次为 svg 格式、webp 格式和 png 格式。