图片元素

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

srcset 基于 src 属性构建的方式相同,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 文件,使其更易于下载。
备选尺寸
例如:适合在更大的显示器上播放的较大图片。
替代密度
例如:为高清屏幕提供丰富的像素质量。
备选宽高比
图片元素没有比例功能。