如果您正在阅读本文,您可能已经熟悉响应式图片。即使如此,了解一些背景知识可能会有所帮助。(然后我们将进入 WordPress 部分,以及如何使用 Cloudinary 使它们变得更好。)在 Web 存在的大部分时间里,无论何时您想在网页上包含图片,您都会创建如下所示的标记
<img src="/path/to/my/image.jpg" alt="a very nice image">
在此示例中,<img>
元素引用了一个名为 `image.jpg` 的单个图片文件,该文件位于 `/path/to/my` 服务器上。此标记非常简单,因为它告诉浏览器下载并呈现由 src
元素引用的特定图片文件到网页上。
这种安排一直很好,直到 2010 年,Ethan Marcotte 发表了他的开创性文章,响应式网页设计,该文章推广了使用层叠样式表媒体查询来修改网页布局以适应用户使用设备大小的技术。响应式网页设计也增加了人们对根据屏幕大小优化网站性能的兴趣。这种关注使图片对性能来说是一个多么大的痛点变得清晰起来,占每个网页中包含的大部分字节。使用响应式设计,开发人员开始向所有用户发送在大型桌面显示器上看起来很漂亮的图片,这导致向较小的移动设备发送额外的字节,使移动浏览体验比必要的速度慢得多。

一群勇敢的 Web 开发人员,被称为响应式问题社区小组 (RICG),着手通过引入新的 HTML 来解决此问题,以便开发人员可以根据上下文信息(如屏幕大小)为网页识别不同的图片源。这是一个新的标记模式示例
<img src="small.jpg"
srcset="large.jpg 1024w, medium.jpg 640w, small.jpg 320w"
sizes="(min-width: 36em) 33.3vw, 100vw"
alt="A rad wolf">
在此示例中,<img>
标记现在包含两个新属性:srcset
,其中包含图片文件列表及其相应的像素宽度,以及 sizes
,它为浏览器提供了一个关于图片预期布局大小的估计,具体取决于某些媒体查询条件。包含 src 属性是为了作为旧浏览器的后备,这些浏览器不支持新的 srcset
和 sizes
属性。

此新标记允许浏览器确定并下载最合适的图片,从而为用户节省字节(和时间)。要更深入地了解此标记和其他响应式图片标记模式,我强烈建议阅读 Jason Grigsby 的响应式图片 101 系列文章。
WordPress 中的响应式图片
在 2015 年底,WordPress 与 RICG 成员合作,发布了版本 4.4,其中包括对响应式图片的原生支持。WordPress 4.4+ 会自动为帖子或页面中包含的图片生成 srcset
和 sizes
属性。WordPress 实现使用现有的图片调整大小功能来完成此任务。在 4.4 版本之前,WordPress 已经创建了上传到媒体库的任何图片的几个较小版本。从 4.4 版本开始,WordPress 使用这些附加尺寸来创建 srcset
属性,以便访问您网站的人可以通过下载不超过其所需大小的图片文件来获益。
此实现开箱即用,但有一些限制。例如,WordPress 在上传原始图片时创建图片尺寸变体,这意味着只有在此时定义的图片尺寸才会在 srcset
属性中可用。此外,图片处理可能会占用许多共享托管计划中可用的资源,因此 WordPress 必须谨慎对待默认情况下创建每个图片的多少变体。
理想情况下,您可以在需要布局时动态创建图片尺寸,并将处理转移到外部图片服务。幸运的是,像Cloudinary 这样的服务存在,它们正是这样做的。我对 Cloudinary 在图片管理领域所做的工作印象深刻,因此我想看看如何使用该服务来扩展 WordPress 中默认的响应式图片实现。
使用 Cloudinary 扩展 WordPress
Cloudinary 提供执行多种图片转换的工具,除了简单的调整大小之外,它还发布了自己的 WordPress 插件 到 WordPress.org 插件库。该插件尚不支持开箱即用的响应式图片,因此我想看看是否可以使用其图片上传应用程序编程接口来制作一个精简的插件。我的目标是将媒体库中的图片同步到Cloudinary 的服务,并让 Cloudinary 自动创建为响应式图片提供服务的图片尺寸。
我创建了一个演示插件,已发布到 GitHub,以便您可以查看它。在后续文章中,我将解释更多插件的技术细节和设计决策,但现在我将概述插件的功能。

首先,当您将图片添加到 WordPress 媒体库时,WordPress 使用Cloudinary 的 PHP 集成库 将该图片上传到 Cloudinary,并指示其服务创建将在 srcset
属性中使用的替代图片尺寸。有趣的是,Cloudinary 开发了一种独特的响应式图片断点解决方案,该解决方案会根据图片内容自动计算所需的最佳图片尺寸。

图片上传到 Cloudinary 后,该服务会将与新创建的图片尺寸相关的数据返回到您的 WordPress 站点。通过使用 WordPress 过滤器,我们可以使用这些数据为图片构建 srcset
属性,这些属性引用来自Cloudinary CDN 的文件,而不是本地托管的图片。
总结
通过将 WordPress 原生响应式图片功能的简单性与Cloudinary 提供的图片管理工具相结合,您可以完全按照自己的意愿管理内容,同时为访问您网站的访客提供针对其设备功能自动优化的图片,而无需担心添加到您网站的每张图片。
这篇文章(以及插件!)由Joe McGill撰写。
文章系列
- 响应式图片和 WordPress 入门(您当前所在位置!)
- 集成 Cloudinary 和响应式图片的 WordPress 插件
Cloudinary 可以极大地帮助网页上的响应式图片! 它们不仅可以创建发送最佳尺寸所需的各种尺寸的图片,还可以以正确的格式发送,甚至可以完全自动化任何应用程序的过程。
我们正在努力将 Cloudinary 集成到 CSS-Tricks 上。我对此非常兴奋,因为它应该会带来良好的性能提升(我们正在仔细跟踪)。具体来说,这就是它如何成为 WordPress 正在执行的响应式图片的升级
sizes
属性。前沿技术。谢谢!
只是好奇我是否正确理解了这一点。我主要是一个图片控制新手,并且很想与他人(准确地)分享……
首先,我了解到 CDN 本身会使我们的 WP 网站加载速度更快。比 WP 的新功能(srcset 对 WP 主机本身内部的文件所做的操作)还要快。其次,我了解到您的插件代码旨在创建更多可能性/决策点/图片文件。这些数据不会存储在 WP 服务器上,而是存储在单独的图片托管 CDN 上(或者我可能在想 AWS S3?)。我看到改变游戏规则的地方在于,当这种耦合与最终设备的需求更好地匹配时(而不是最终设备使用有限的板载 WP srcset)。如果所有源都位于 WP 服务器上,它也会减轻 WordPress 本身的工作量(这就是为什么如您上面所说,WP 不会自动生成太多可能性)。
我理解对了吗?如果您回复,提前感谢。现在就去让这个宝石发挥作用……
那么,使用此插件的 Cloudinary 是否比 Jetpack Photon 更好?
您好,Rosmen,
我在做这个的时候没有进行任何的并排比较。如果你想检查一下并反馈,那将会很有趣。
Chris,如果能看到一篇关于你遇到的任何问题的后续文章,那就太好了。我开始做同样的事情,但我发现我在网站上做了很多工作是在上下班途中在我的本地机器上进行的。
任何关于……或者说是技巧……在本地开发中保留本地图像集,而在生产中使用 Cloudinary 的建议都将非常受欢迎 :)
除此之外,我发现它对网站和网站性能来说是一个很好的补充。
不错的覆盖范围。那么,你的下一集将完全涵盖实现?谢谢。
令我惊讶的是,没有考虑将这项工作卸载到客户端(即浏览器/js)来进行图像调整大小,然后将其传递到您的服务器。(即,WP 或您自己的服务器根本不需要任何工作)
其次,我的理解是 CDN 主要有用是因为如果您的网站访问者加载来自 CDN 的资源(来自您的网站),他们可能已经缓存了它。
因此,如果一个帖子/网站的内容(即相关的响应式图像)不会从任何其他地方加载,我不明白 CDN 如何帮助提高性能。
有人愿意澄清 CDN 或第三方的好处吗?
CDN 的一个巨大优势在于它提供了靠近用户的本地数据中心,从而导致更快的下载速度。
非常好。我多年来一直使用 Cloudinary 作为 CDN。这是否适用于已上传到 Cloudinary 的图像?
顺便说一句,我进行了一个将动画 GIF 转换为视频的 hack:https://gist.github.com/soderlind/f0e0981a9ece9b41144f8fe22db23a6f