<picture>
响应式用法
<img>
标签的srcset
属性和sizes
属性分别解决了像素密度和屏幕大小的适配,但如果要同时适配不同像素密度、不同大小的屏幕,就要用到<picture>
标签。
<picture>
是一个容器标签,内部使用<source>
和<img>
,指定不同情况下加载的图像。
<picture>
<source media="(max-width: 500px)" srcset="cat-vertical.jpg">
<source media="(min-width: 501px)" srcset="cat-horizontal.jpg">
<img src="cat.jpg" alt="cat">
</picture>
上面代码中,<picture>
标签内部有两个<source>
标签和一个<img>
标签。
<picture>
内部的<source>
标签,主要使用media
属性和srcset
属性。media
属性给出媒体查询表达式,srcset
属性就是<img>
标签的srcset
属性,给出加载的图像文件。sizes
属性其实这里也可以用,但由于有了media
属性,就没有必要了。
浏览器按照<source>
标签出现的顺序,依次判断当前设备是否满足media
属性的媒体查询表达式,如果满足就加载srcset
属性指定的图片文件,并且不再执行后面的<source>
标签和<img>
标签。
<img>
标签是默认情况下加载的图像,用来满足上面所有<source>
都不匹配的情况,或者不支持<picture>
的老式浏览器。
上面例子中,设备宽度如果不超过500px
,就加载竖屏的图像,否则加载横屏的图像。
下面给出一个例子,同时考虑屏幕尺寸和像素密度的适配。
<picture>
<source srcset="homepage-person@desktop.png,
homepage-person@desktop-2x.png 2x"
media="(min-width: 990px)">
<source srcset="homepage-person@tablet.png,
homepage-person@tablet-2x.png 2x"
media="(min-width: 750px)">
<img srcset="homepage-person@mobile.png,
homepage-person@mobile-2x.png 2x"
alt="Shopify Merchant, Corrine Anestopoulos">
</picture>
上面代码中,<source>
标签的media
属性给出屏幕尺寸的适配条件,每个条件都用srcset
属性,再给出两种像素密度的图像 URL。
图像格式的选择
除了响应式图像,<picture>
标签还可以用来选择不同格式的图像。比如,如果当前浏览器支持 Webp 格式,就加载这种格式的图像,否则加载 PNG 图像。
<picture>
<source type="image/svg+xml" srcset="logo.xml">
<source type="image/webp" srcset="logo.webp">
<img src="logo.png" alt="ACME Corp">
</picture>
上面代码中,<source>
标签的type
属性给出图像的 MIME 类型,srcset
是对应的图像 URL。
浏览器按照<source>
标签出现的顺序,依次检查是否支持type
属性指定的图像格式,如果支持就加载图像,并且不再检查后面的<source>
标签了。上面例子中,图像加载优先顺序依次为 svg 格式、webp 格式和 png 格式。