最近有很多关于处理**响应式图片**的技术。 也就是说,帮助我们根据情况(例如屏幕大小和可用带宽)提供正确图片的解决方案。 它们都以略微不同的方式执行操作。为了跟踪这些技术,Christopher Schmitt 和我创建了 这个技术电子表格。
电子表格包含数据,但让我们通过实用问题的角度来理解它。
要选择适合您和您的项目的技术,以下问题可以作为指南。 许多问题可能适用于您的项目,因此您需要确定哪些技术适合哪些场景,并找到重叠之处。
我是否有遗留内容?
这实际上意味着……**我是否有更新起来不切实际的遗留内容?**例如,我在 CSS-Tricks 上有数千页的内容,只有一个写作人员。

<img />
,所以我需要一种可以让我保持原状的技术。我所知的唯一无需任何标记更改即可使用的技术是 自适应图像。 它通过将图像请求路由到 PHP 文件来工作,该文件智能地提供(并在需要时创建)适合屏幕宽度的图像。
另一个需要自问的问题是您是否关心遗留内容。 也许您网站的大部分流量都来自您**可以**进行标记更改的新内容,从而利用其他技术。 如果是这样,请继续阅读以发现这些其他技术。
如果您有一个小型项目、一个全新的项目或一个具有遗留内容并且您可以回溯更新的项目,您也可以选择一种确实需要特殊标记的技术,因此也请继续阅读。
我是否关心特殊标记?
这实际上是上述问题的子问题。 许多技术要求您使用特殊的 HTML。 例如,HiSRC 要求您将更高分辨率的图像作为数据属性。
<img src="200x100.png" data-1x="400x200.png" data-2x="800x400.png" />
我认为这是一种简洁、有效、语义化的技术,但它也意味着您需要在网站上的每个<img />
上使用这些属性,这在具有大量遗留内容的网站上可能无法实现。
如果您知道特殊标记(或专门的 CSS)对您来说不是一种选择,那么真正唯一的选择是 自适应图像。 即使 Sencha.IO 也需要为 src 属性添加前缀,这在遗留内容中可能无法实现。
我是否关心语义?
一些响应式图像技术涉及并非严格语义化的标记。 最终,图像只有一个语义化的方式。 那就是如果它的src
指向一个真实的图像,并且它具有描述该图像的alt
文本。 Brad Frost 对此进行了很好的总结
@stowball 不幸的是,它没有那么简单。 马的图片必须是马的图片,否则它就不是马的图片。 :)
— Brad Frost (@brad_frost) 2012年4月5日
换句话说,如果该技术在任何时候需要图像的src
丢失或链接到透明 GIF(或类似内容),则该技术不是语义化的。
那么为什么一些响应式图像技术会这样做呢? 因为让图像的src
指向马的图像意味着该图像将在浏览器解析该图像后立即开始下载。 没有办法阻止这种情况。 即使您非常快速地用更合适的版本替换该src
,现在您也正在下载两个图像而不是一个图像,这会降低性能而不是提高性能。 您可能会认为这是可以接受的(例如,“桌面”环境通常具有更大的带宽)。 通常,如果使用此技术,则src
中的图像将是最小可能的图像。
如果语义对您很重要,您应该查看 自适应图像(如上所述)或 HiSRC,这是 Christopher Schmitt 的一个插件,您可以将其与语义化的src
属性一起使用。
一些技术使用
我是否关心有效性?
有效性是指根据 W3C 标记验证服务“是否验证通过”。 验证是一种帮助您查找问题并编写更好标记的工具。 但仅仅因为某些内容未通过验证并不意味着它不好或错误。 如果无效代码在所有浏览器中都能完美运行,那么您或任何其他人都不应该关心。
如果您确实关心有效性(也许客户不合理地要求您这样做,并以此为筹码扣留您的工资),那么您将无法使用一些技术。 例如,picturefill 技术使用<picture></picture>
元素来发挥其魔力。 这最终可能会标准化,但尚未标准化,因此在技术上是无效的语法。 它也要求<img />
元素具有src
属性,因此为了解决双图像请求问题而删除该属性的技术是无效的。
如果有效性是您的要求,我建议使用以下技术:自适应图像、HiSRC 或 响应式增强。 它们都使用简单、有效的<img />
语法,包括src
。
我是否关心艺术指导?
一些响应式图像技术提供完全相同图像的不同分辨率版本。 虽然这简化了操作(即减少了工作量),但它可能无法接受。 这是一个直观的例子

src
。 中间是可以在(咳咳)“平板电脑”上使用的稍微大一点的图像。 右侧是最大的图像。(来源)这些图像由设计师手工制作,裁剪以保留意义和影响。 如果您取右侧的图像并将其缩小,图像中的人会非常小,并且图像的风格可能会丢失。
如果这个艺术指导的想法对您的项目很重要,您将需要一种可以允许您指定在什么情况下提供哪个src
的技术。 这非常适合 picturefill,它允许您非常具体地指定源以及什么情况下获得什么。
<picture>
<source src="small.jpg" />
<source src="medium.jpg" media="(min-width: 400px)" />
<source src="large.jpg" media="(min-width: 800px)" />
</picture>
JavaScript 会从那里接管。
我是否关心 JavaScript?
大多数这些响应式图像技术都利用 JavaScript 来发挥其魔力。 一些只使用少量的 JavaScript 来设置 cookie,但仍然是 JavaScript。 有些要求您将<img />
放在
JavaScript 库依赖性怎么办?
HiSRC 和 rwdImages 都依赖于 jQuery。如果你的项目使用了不同的库,那么这些方案可能不适合你。不过,你可以移植它们并开源!如果你没有使用任何库,嗯,你可能应该使用,但我们现在不讨论这个。
我需要关心服务器端组件吗?
其中一些技术并非完全依赖于 JavaScript。 自适应图片 主要通过 .htaccess 和 PHP 来实现其功能。嗯,.htaccess 预设了一个 Apache 服务器。当然,我们都知道并热爱 PHP(咳咳),但许多网站运行在 Ruby 或 Python 等技术之上。
响应式图片(最初的 Filament Group 技术)也使用 .htaccess。因此,如果你使用的是像 Nginx 这样的 Web 服务器,那么这种方案要么不可行,要么你必须将 .htaccess 组件移植到 Nginx 的类似但不同的语法中。
我需要关心带宽测试吗?
测试浏览器窗口宽度并根据它决定要提供哪张图片非常酷,并且是响应式图片概念的基础。但这实际上只是决定应该提供哪张图片的一半因素。另一半是可用带宽。如果用户拥有非常快速的网络连接速度,那么提供大图片是可以的。如果用户拥有非常慢的网络连接速度,那么他们应该获得更小的图片(无论屏幕尺寸如何)。不幸的是,原生 带宽媒体查询 不存在。
目前有两种技术将带宽测试作为其决策过程的一部分:Foresight.js 和 HiSRC(两者都基于 Foresight.js 中的技术)。它的工作原理是下载一个测试文件并测量完成所需时间(可配置)。测试本身会略微影响性能,但理论上,通过了解当前带宽来提供图片所节省的开销是一个净(明白了吗?)收益。
我需要关心依赖第三方吗?
Sencha.IO 是一种完全由第三方提供的处理响应式图片的方式。据我所知,它运行良好,并且没有出现任何重大停机时间,但当然你始终存在这种风险。
你可能在想:哇,Sencha.IO 技术真的很酷,但我担心第三方依赖性。我希望我可以在自己的服务器上运行它。 如果你想走这条路,可以使用公开的 WURFL 数据库 和这个 服务器端响应式图片技术,它可以在本地使用该数据库。
还有一些像 Device Atlas Cloud 这样的第三方服务,它可以为你进行设备检测。它也是你应用程序的第三方依赖项。毫无疑问,他们的目标和重点是始终保持可用和快速,但你必须非常小心地选择你依赖的机构和服务,尤其是对于你的业务而言。
另外一些第三方服务:ReSRC.it,Responsive.io,Thumber.io
是否有特定 CMS 涉及特定 CMS 功能?
假设你的项目在 WordPress 中。WordPress 内置了媒体上传器。当你使用它上传图片时,它可以为你创建该图片的多个版本(缩小)。这非常酷且强大,你可以/应该利用它。
但这不仅仅是 WordPress 的功能。我相信这里的工作原理可以在任何内容管理系统中实现(或使其能够实现)。
只要解决方案是移动优先,我需要关心双重请求吗?
许多这些解决方案试图以最佳方式解决问题:只对正确的资源发出一个请求。如果你可以接受链接到文件的最小版本(以便无论如何都会发出该请求)并在需要时替换为更大的图片,那么也许 源代码混排 适合你。请注意,现在使用的库 建议使用 font-family
而不是 content
来检测媒体查询的变化。
我可以等待未来吗?
“新 iPad”(第三代,为了持久性)的发布引发了许多这些技术和对话。它高像素密度非常适合矢量图和大型照片,但实际上不适合需要放大到正确尺寸的小图标,并且可能会出现模糊。但是提供更高分辨率的图标意味着更大的文件大小和更慢的网站。因此,需要只在需要的情况下/环境中提供它们。
Web 标准领域意识到了这个问题。有一个 专门讨论它的团队。随着时间的推移,他们可能会解决这个问题,然后我们可以开始使用他们想出的任何方法(假设它很棒并且比我们现在拥有的更好)。
它可能是像 Nicolas Gallagher 建议的那样 通过 CSS 内容切换图片的 src 属性。它可能是 <picture></picture>
元素。它可能是 HTML 中的 srclist 属性或 CSS 中的 src 属性。它可能是一个 前缀。
它可能是发送浏览器信息请求,就像在 Client-Hints 中一样。
更多资源
- Jason Grigsby 撰写了一篇关于响应式图片的史诗级三部分系列文章,从这里开始。
- Christopher Schmitt 的 关于响应式图片的完整演讲幻灯片。
- Mat Marquis 关于 响应式图片:它们是如何几乎成功以及我们还需要什么 的文章。
但是使用高度/宽度自动技巧呢?这是我现在默认用于响应式布局的方法。
#contentwrapper img {
max-width:600px;
height:auto;
}
这可以调整图片大小,但是本文的重点是解决提供预格式化或自动格式化的尺寸较小的图片的问题——即 MB 和 KB,而不是高度和宽度。
通过提供优化的图片,你可以在适当的情况下使用更少的带宽,例如在无法正确显示高分辨率图片的小屏幕上,或者为那些担心其用户在移动设备上的数据限制的用户节省带宽。
很棒的文章,希望将来会有标准的解决方案,尤其是考虑到响应式网页设计越来越流行。我还没有时间亲自深入研究(当我开始研究时,我被一些问题(比如这个)吓退了),但结合这篇文章和我这个周末没有计划,我想我可能不得不深入研究并玩一玩!谢谢!
我个人最喜欢的是标签解决方案——它看起来最直接,也最容易实现。总有一天……
*图片标签 - 在代码doi中编写。
很棒的东西 - 我之前不了解自适应图像,但一直在使用类似的技术,使用phpThumb或SLIR(智能Lencioni图像调整器)。
由于我的默认CMS是MODX,使用phpThumb是我的主要技术,因为它内置于MODX中,并且运行得相当不错,但是自适应图像看起来很漂亮且简洁,并且由于它基于php,我知道它可以很好地与MODX配合使用。现在有点好奇想尝试一下!
总的来说,我最关心的是艺术指导。因为那是用户关心的。
他们不关心语义,他们关心它是否有效,他们不关心它是否来自第三方等等……但他们关心图像中的人是否小到无法识别。
ps。不是说你作为开发人员不应该关心,而是用户优先。
同意 - 这很重要。不过你的观点有点模糊。
我认为所有方面(艺术指导、高效代码、语义标记)的平衡比仅仅将用户体验置于首位更重要。需要注意的是,用户体验不仅仅是网站的视觉吸引力,还包括加载时间和响应能力等方面。
是的,那是真的。但他们也关心性能……
用户体验还应包括所有用户,包括依靠屏幕阅读器的视障人士。这是我个人强调语义的主要原因。
我做这个网页开发的时间越长,我就越意识到,如果一个网站不能为用户服务,那么它有多漂亮其实并不重要。
完全披露 - 我有一个儿子,他在15岁时失去了大部分视力,他现在19岁了。虽然语义之前对我来说很重要,但现在它是我工作中的首要目标。
视障人士群体比你想象的要大得多。
Trisha
5/21/2012
Trisha,
我完全同意。一些开发人员倾向于忘记他们不仅要为不同的设备和屏幕尺寸设计,还要为不同的人设计(这一个是最重要的变量)。成功的 设计将功能与美学结合起来,并赋予它们同等的重要性(例如,请参阅 Apple 的工业设计)。如果你忽略功能(或赋予它较低的重要性),那么你就进入了美术领域而不是设计领域(据我所知,美术并非对所有人开放——你需要理解它才能使用它。对于UI设计来说,这并不是一个非常直观的方法)。可访问性对我来说也是非常私人的事情,因为我有三个特殊需求的孩子每天都从中受益。
优秀的开发人员关心可访问性,这包括语义和有效性。
残疾人用户应该优先!
另一个值得一提的解决方案
http://responsejs.com/
太可惜了,你在分析中没有提到Riloadr:https://github.com/tubalmartin/riloadr
在一个最近的项目中,我们开始使用HiSRC进行响应式图像,但后来一个朋友建议我们尝试Riloadr。经过长时间的测试,我们切换到Riloadr,因为它具有灵活性。
这是我们迄今为止发现的最佳工具。
“srcset”被遗漏了,这似乎是我们迄今为止看到的“最智能”的解决方案。
业务规则/需求、基础设施更新/更改将削弱“picture”的实施,并且在使用此新标签的内容丰富的环境中开展业务的成本将阻止许多企业继续使用此标记——我的意思是*不是*博客,而是像FoodNetwork或HGTV这样的*内容丰富*的环境——内容丰富。
最终,无论采用哪种解决方案,*都需要*浏览器和服务器支持,无论是繁重还是轻量。标记更改/更新只是难题的一部分,*不应*仅由前端开发人员倡导。前端开发人员可以建议标记方面前进的最佳途径,但繁重的工作需要从前端移除。
好文章!我错过了一部分关于性能的内容。如果我最关心性能,而不关心语义或JavaScript,我应该使用哪种解决方案?
可能是本地(非第三方)的,不下载重复项,不使用jQuery或任何库,即时触发(不等待onload)……有任何推荐吗?
我想Riloadr会让你微笑!
关于:图像内容 - 有几个关于“图像显著性”的库可能有助于机器确定图像中感兴趣的点,并进行相应裁剪。
我只是想提一下这条推文,它提到了WHATWG为创建标记标准而做出的努力,这些标准将(有一天)解决我们所有响应式图像问题
“紧急!转发@wilto 如果你关心响应式图像,我们需要你的意见——WHATWG需要听到你的声音。cog.gd/3tt”
*它的
很棒的文章,确实给了我很多思考。
我更倾向于避免使用特殊的标记,因为根据我的经验,它只会让浏览器感到困惑,而旧版浏览器通常会失败。是的,IE 8 及更早版本,我说的是你……
顺便说一句,这个博客的设计非常不错
一个尚未提及的解决方案是Molt。与HiSRC类似,它使用数据属性来定义真实源,但我喜欢它最小的语法。例如。
很棒的文章,Chris。我正在管理一个新的社交网络应用程序的构建,以及为我的公司构建一个新的响应式框架,以便在未来的项目中使用。我们非常重视的是速度和用户体验方面的性能。响应式/自适应图像现在是一个有争议的重点,所以你的电子表格和文章对我的时机来说非常棒!我非常喜欢你的视频屏幕截图,并且认为实时查看你最喜欢的示例会非常酷。
再次感谢这篇文章!
虽然对于图像完全没用,但我一直在使用SVG作为图标和徽标。对于旧版浏览器,我很快就会切换到PNG,会有一些性能损失,但通常只会在桌面环境中。
由于它明显的易用性,我很惊讶更多的人没有使用SVG作为他们的图标等。
很棒的文章,Chris。谢谢
很棒的信息!随着平板电脑和移动设备需求的增加和增长,响应式网站的需求也呈爆炸式增长——工具越多越好!
感谢Chris提供的精彩概述。
WHATWG似乎已经发布了他们自己的提案,以
img
set
属性的形式。大多数开发人员,包括我自己,都强烈认为这并没有改进例如新的
picture
元素。另外,在W3C 响应式图片社区小组中正在进行一场关于不同方法的有趣讨论。
基本上是关于添加一个(或几个)带有媒体查询的
meta
元素,声明一个将在HTML(以及CSS/JS?)中使用的“变量”。例如
然后这将允许以下操作(使用URI 模板)
并且,可能在CSS中:
@media (case: breakpoint1) { ... }
无论如何,我认为这是一种有趣的方法,它解决了几个问题。查看@MattWilcox的文章并分享您的想法。
很棒的文章,兄弟。也许这不仅仅是一个主题,而是为了重写图片标题,关注SEO,在wordpress中我使用了一些插件,比如“SEO友好图片”。这篇文章内容丰富,涵盖了许多主题。期待你的下一篇文章 ;-)
Chris,这是我的想法。它使得替换img标签变得轻而易举,因为你只需进行简单的搜索和替换,无论是在你的文本编辑器中还是通过SQL – 而不影响源代码。它可能不靠谱,但这只是一个我用来改进图片标签的想法。希望得到你的反馈。
http://michaelgunner.co.uk/proposed-responsive-images-syntax/
依我拙见,如果使用PHP,我推荐Matt Wilcox的Adaptive Images。
– 无需手动创建多个版本的图片,
– 可以独立运行,通常无需更改前端标记或服务器端
– 即使没有JavaScript也可以正常运行
很棒的文章!最好现在就开始实践,因为视网膜显示屏已经成为主流。我希望CSS能够随着技术的进步而发展,使响应式网站的设计变得更容易。
接下来,CSS3是实现响应式的最佳方式……甚至HTML方法也能很好地工作……
我喜欢picture标签——之前不知道这个。
不过我不知道它是否实用,以及许多开发人员/设计师是否愿意为每个图片创建多个副本以进行服务。如果由CMS动态生成,那么它就是一个理想的解决方案。
rwdImages与Adaptive Images相比如何?
很棒的文章。如今,为许多不同类型和功能的设备提供更好的图片变得越来越重要。
但我真的很希望像David Hund所说的那样有一个像CSS媒体查询这样的解决方案。
在回答“我可以等待未来吗?”这个问题时——我让自己相信答案是“不”!
因为我们已经开始工作了,用户也已经通过响应式网页获得了设备友好的浏览体验。因此,我们应该从现在拥有的东西开始,逐步升级自己,然后再将注意力集中在一个专门的解决方案上。
我正在使用Foresight.js,它相当不错。
随着对响应式网站需求的增加,提示越多越好。很棒的文章,我今天学到了一些新东西。期待下一篇文章。
你好,
我们在globo.com使用响应式图片。
我们每个图片有四个不同的版本
a) 低质量(比原图小4-5倍),用于页面标记中。
b) “桌面”全质量图片
c) “平板电脑”全质量图片(使用面部识别智能裁剪)
d) “智能手机”全质量图片(使用面部识别智能裁剪)
我们将每个URL(除了低质量的)作为data-x-url放入标记中。
我们使用的方法是监控页面滚动,并且仅当用户“接近”图片时,才将低质量图片更改为给定设备的高质量图片。
这对我们来说效果非常好,我们对结果非常满意。我们的网站每月处理近20亿次页面浏览量,并且在任何给定时间都有30-40张响应式图片。
我们用于处理图片采样和裁剪的工具是我们自己构建的,并且已经作为开源发布(https://github.com/globocom/thumbor/wiki)。
此致,
Bernardo Heynemann
globo.com技术主管
你可以可能使用媒体查询的组合,调整宽度,然后使用clip突出显示img的特定区域。尽管由于clip仅在绝对定位时才有效,并且你必须计算顶部、左侧、右侧和底部的偏移量,因此这可能比它有用的麻烦更多。
不过只是一个想法!
这是一个jQuery插件,它根据当前窗口宽度(和像素密度)将整个HTML片段通过ajax加载到页面中。它可以用来告诉服务器提供适当大小的图片src URL等。它是Github的Pjax加载器的分支。它不依赖于用户代理或cookie – 仅依赖于窗口宽度。
http://stephanfowler.github.com/responsive-content/
那个URL的更正
http://responsivecontent.net/
我目前在标记中使用非常低质量的图片,然后在页面加载完成后使用javascript将其替换为全质量图片。这使得页面加载速度很快,并且最终会提供最高质量的图片。
这是一篇很棒的文章,它有助于突出为什么为响应式图片制定解决方案很困难,以及为什么可能永远不会出现“一统天下”的方案。我确实认为/希望标准和浏览器方面的人员达成一致可以解决大多数用例。
我还想指出一个不准确的地方。Scott Jehl的picturefill解决方案**不需要**元素。它使用span,因此实际上符合标准。当然,你说的它需要JavaScript是正确的,尽管它有一个HTML回退,如果JS不可用就会显示。
非常好的文章,还有一篇我想让你们阅读的有趣文章是http://mobile.smashingmagazine.com/2013/07/08/choosing-a-responsive-image-solution/你可以更清楚地了解一些流行的响应式解决方案。
我的问题是:我之前听说过CSS媒体查询中的背景图片会降低性能,因为所有不同尺寸的图片都会从服务器下载,并且会发送一些不必要的请求。这是真的吗?
Pixtulate 是一款第三方响应式图片服务,能够缩放和裁剪响应式图片,包括为艺术指导目的使用焦点。它允许你提供响应式图片,按需创建缩略图并智能地裁剪英雄图片。
这个列表很棒,但它忽略了SVG小丑车。在我的测试中,SVG小丑车在开发断点方面需要更多前期工作,但它没有任何基于javascript或实验性标记的解决方案的副作用。
我已经在一个生产网站上使用了5个月,并且只遇到过两个问题
* 用户无法右键单击并查看图片src
* 你必须添加一个带有正确的schema.org标记的链接元素,以便搜索引擎能够识别。
本文发表后出现的另一种技术是Slimmage。它有意避免艺术指导——但如果你不需要它,它提供了其他所有功能。速度、CSS媒体查询支持、无重复网络请求以及全方位浏览器兼容性。
它需要一个服务器端组件(最常与ImageResizer一起使用),但它可以与任何RIAPI兼容的后端一起使用。
我想要一个简单明了的解决方案,所以这是我对这个问题的JavaScript解决方案。
https://github.com/smasala/responsive-images-js
Picturefill 2.0 已经发布,我认为他们使用PICTURE元素和多个SRC属性的解决方案是迄今为止最简洁的。