图片元素

上一个模块演示了 srcset 属性如何允许您提供同一图片的不同尺寸版本。然后,浏览器便可决定要使用的正确版本。如果您想完全更改图片,则需要 picture 元素。

srcsetsrc 属性为基础,picture 元素以 img 元素为基础。picture 元素封装了 img 元素。

<picture>
  <img src="image.jpg" alt="A description of the image.">
</picture>

如果 picture 元素内没有嵌套的 img 元素,则 picture 元素将不起作用。

srcset 属性一样,picture 元素会更新该 img 元素中 src 属性的值。不同之处在于 srcset 属性向浏览器提供建议,而 picture 元素则发出命令。这让您拥有控制权。

source

您可以在 picture 元素中指定多个 source 元素,每个元素都有自己的 srcset 属性。然后,浏览器会尽可能执行第一个请求。

图片格式

在此示例中,有三张不同的图片,它们采用三种不同的格式:

<picture>
  <source srcset="image.avif" type="image/avif">
  <source srcset="image.webp" type="image/webp">
  <img src="image.jpg" alt="A description of the image." 
    width="300" height="200" loading="lazy" decoding="async">
</picture>

第一个 source 元素指向采用新 AVIF 格式的图片。如果浏览器能够呈现 AVIF 图片,那么系统会选用该图片文件。否则,它会移至下一个 source 元素。

第二个 source 元素指向 WebP 格式的图片。如果浏览器能够呈现 WebP 图片,则会使用该图片文件。

否则,浏览器将回退到使用 img 元素的 src 属性中的图片文件。该图片为 JPEG 格式。

这���味着,您可以开始使用新的图片格式,且不会影响向后兼容性。

在该示例中,type 属性告知浏览器指定了哪种类型的图片格式。

图片尺寸

除了切换图片格式之外,您还可以切换图片尺寸。使用 media 属性告知浏览器图片将会显示多宽。在 media 属性内添加媒体查询。

<picture>
  <source srcset="large.png" media="(min-width: 75em)">
  <source srcset="medium.png" media="(min-width: 40em)">
  <img src="small.png" alt="A description of the image." 
    width="300" height="200" loading="lazy" decoding="async">
</picture>

此处将告知浏览器,如果视口宽度超过 75em,必须使用大图片。浏览器必须使用 40em75em 之间的中等图片。在 40em 下,浏览器必须使用小图片。

这与在 img 元素中使用 srcsetsizes 属性不同。这样,您就向浏览器提供建议。source 元素更像是一个命令,而非建议。

您还可以在 source 元素的 srcset 属性内使用像素密度描述符。

<picture>
  <source srcset="large.png 1x" media="(min-width: 75em)">
  <source srcset="medium.png 1x, large.png 2x" media="(min-width: 40em)">
  <img src="small.png" alt="A description of the image." width="300" height="200" loading="lazy" decoding="async"
    srcset="small.png 1x, medium.png 2x, large.png 3x">
</picture>

在该示例中,您仍在告知浏览器在不同断点处执行什么操作,但现在浏览器可以选择与设备的像素密度最相符的图片。

剪裁

如果您只需投放同一图片的不同尺寸版本,srcset 就是最佳选项。但是,如果图片在尺寸较小时看起来不美观,您可以尝试将图片剪裁为剪裁版本。

不同的图片可能具有不同的宽度和高度,以更好地适应其上下文。例如,在移动浏览器上,您可能需要同时剪裁和长剪裁;而在桌面浏览器上,则可能需要剪裁较宽和较短的剪裁。

下例中的主打图片会根据视口宽度更改其内容和形状。为每个 source 元素添加 widthheight 属性。

<picture>
  <source srcset="full.jpg" media="(min-width: 75em)" width="1200" height="500">
  <source srcset="regular.jpg" media="(min-width: 50em)" width="800" height="400">
  <img src="cropped.jpg" alt="A description of the image." width="400" height="400" loading="eager" decoding="sync">
</picture>

请注意,您不能根据图片来源更改 alt 属性。您需要编写一个 alt 属性,用于描述完整尺寸的图片和剪裁后的图片。

对于大多数自适应图片,您可能不需要使用 picture 元素,因为 img 元素的 srcsetsizes 属性涵盖了很多用例。但对于需要更精细的控制的情形,picture 元素是一个功能强大的工具。

有一种图片可能不需要这两种解决方案,那就是图标。接下来我们说说

检查您的掌握程度

测试您对图片元素的了解程度

srcset 属性为浏览器提供________时,<picture> 元素为浏览器提供________。

建议、命令
相片元素提供了控制力,非常适合用于艺术指导。
命令、建议
哎呀,您倒退了。

<picture> 元素的部分功能如下:

其他剪裁方式
例如:横向图片或纵向图片,具体取决于视口。
替代格式
例如:更小且更易于下载 avifwebp 文件(如果可能)。
其他尺寸
例如,针对较大显示器提供较大的图片。
替代密度
例如:为高清屏幕提供丰富的像素质量。
其他宽高比
图片元素没有宽高比功能。