自 WordPress 4.4 起,通过在生成的图像标记中包含srcset和sizes属性,原生支持响应式图像。有关此功能的背景信息,请阅读合并提案。

一些历史

当用户在 WordPress 中上传图像时,它会自动将新图像裁剪为较小的尺寸。例如,如果您上传一张 1500 x 706 的图像,图像尺寸可能如下所示:

  • 原始大小 – 1500 x 706
  • 大尺寸 – 500 x 235
  • 中等尺寸 – 300 x 141
  • 缩略图 – 150 x 150

因此,WordPress 会自动为上传到媒体库的每一张图像创建多个尺寸。附加尺寸会根据主题而创建。如果原始大小的图像已附加到帖子,桌面和移动设备用户将看到原始大小的图像。然而,由于显示和文件大小原因,在移动设备上使用原始大小的图像是没有意义的。

在响应式设计流行之前,许多网站尝试根据设备类型(例如手机、平板等)动态地向浏览器提供不同的布局(包括图像)。在这些情况下,所有动态操作都在页面渲染之前在服务器端完成。这种策略通常与自适应设计一词相关联。

另一方面,响应式设计使用媒体查询等工具,允许单个页面在浏览器中呈现,并根据视口宽度和显示密度等因素进行响应。

响应式图像遵循第二种策略,将所有信息 upfront 发送给浏览器,让浏览器负责加载适当的图像,而不是在页面加载之前在服务器端做出这些决定。

工作原理

通过将图像的可用尺寸包含在srcset属性中,它允许软件根据设备的屏幕大小自动使用和显示正确的图像。如果您在 WordPress 中将原始大小为 1500 x 706 的图像附加到帖子,移动设备将看到大尺寸或中等尺寸的图像——这可能会节省带宽并在此过程中加快页面加载速度。

请注意,为了与现有标记保持兼容,如果内容 HTML 中已经存在srcset或sizes,则不会添加或修改它们。响应式图像没有任何设置需要配置,因为魔法是在幕后发生的。

浏览器端

为了帮助浏览器从源集列表中选择最佳图像,WordPress 还包含一个默认的sizes属性,其等效于(max-width: {{image-width}}px) 100vw, {{image-width}}px。虽然这个默认值对于大多数站点开箱即用即可工作,但主题应使用wp_calculate_image_sizes过滤器根据需要自定义默认的sizes属性。

正常的浏览器请求发送到服务器,服务器发送回响应。该响应包含指向其他资源的链接——字体、CSS、JS 和图像。浏览器注意到这些资源,并向服务器发送额外的请求以获取这些资源。

这种响应式图像方法的作用是为图像标签提供额外的属性,提醒浏览器该特定图像标签可用的不同图像文件,以便浏览器可以智能地请求适合其窗口/视口大小甚至分辨率支持的适当图像文件(源)。这意味着浏览器可以请求适当“尺寸”的图像文件,而不是被提供过大的图像并在事后调整大小以适应空间。

要了解srcset和sizes如何工作的完整概述,请阅读 A List Apart 的 Eric Portis 撰写的实践中的响应式图像。

新的函数和钩子

为了实现此功能,以下新函数已添加到 WordPress 中:

为了防止将非常大的图像添加到srcset属性中,已添加一个max_srcset_image_width过滤器,允许主题为源集列表中包含的图像设置最大图像宽度。默认值为2048px。

一个新的默认图像尺寸

为了更好地利用响应式图像支持,已添加一个新的默认中间尺寸medium_large。新尺寸的默认宽度为 768px,没有高度限制,并且可以像 WordPress 中的任何其他尺寸一样使用。由于它是标准尺寸,它仅在新图像上传或使用第三方插件重新生成尺寸时才会生成。

medium_large尺寸不包含在选择要插入帖子的图像的 UI 中,我们也不会在媒体设置页面中包含更改图像尺寸的 UI。但是,开发人员可以使用update_option()函数修改此新尺寸的宽度,类似于任何其他默认图像尺寸。

自定义响应式图像标记

要修改默认的srcset和sizes属性,您应分别使用wp_calculate_image_srcset和wp_calculate_image_sizes过滤器。

对于未嵌入帖子内容的图像(例如文章缩略图、画廊等),覆盖其srcset或sizes属性可以使用wp_get_attachment_image_attributes过滤器来完成,类似于修改其他图像属性的方式。

此外,您可以在模板中直接使用wp_get_attachment_image_srcset()创建自己的自定义标记模式。以下是如何使用此函数构建带有自定义sizes属性的<img>元素的示例:

<?php
$img_src = wp_get_attachment_image_url( $attachment_id, 'medium' );
$img_srcset = wp_get_attachment_image_srcset( $attachment_id, 'medium' );
?>
<img src="<?php echo esc_url( $img_src ); ?>"
     srcset="<?php echo esc_attr( $img_srcset ); ?>"
     sizes="(max-width: 50em) 87vw, 680px" alt="Foo Bar">

需要更多开发者详细信息?
在此 GitHub 存储库上了解更多关于自定义响应式图像标记的信息.

来源