也许您一直在关注响应式图片的#热议话题?如果您不知道“响应式图片”是什么意思,它指的是在不同情况下提供不同的图片。如何做到这一点以及这些情况是什么,差异很大。
如果您没有跟上进度,这里有一些链接。Bruce Lawson 做了一个 年底报告。这提供了试图标准化解决方案的工作的良好历史记录。Mat Marquis 撰写了关于所有主要浏览器供应商现状(无共识)的 简洁摘要。Tim Kadlec 对 这种情况 做了一个很好的总结。Dave Rupert 也一直在 谈论它。
这里需要理解的一点是:所有这些讨论都集中在HTML 中的图片上。内容图片。
这个问题在 CSS 中得到了很大程度的解决。如果添加到页面中的图片不需要在标记中,则可以使用 CSS 中的媒体查询来处理条件并相应地更改图片。
/* Look ma, responsive images */
body {
background: url(mountains-small.jpg);
}
@media (min-width: 500px) {
body {
background: url(mountains-medium.jpg);
}
}
@media (min-width: 800px) {
body {
background: url(mountains-large.jpg);
}
}
当然,有时图片确实需要在标记中。这就是<picture>
和 srcset
以及 srcN
都试图解决的问题。这是一项艰巨的任务。解决方案需要
- 仅提供一个最终的 src
- 具有语义化
- 可访问
- 向后兼容
- 适应艺术指导
- 适应我们认为重要的所有条件
- 适应我们现在甚至没有考虑到的未来条件
- 独立于任何其他语言/技术工作
- 为作者、标准人员和浏览器供应商人员所接受
为什么每个人都难以达成一致?没有人参与其中是怀有恶意的。没有人坐在黑暗的城堡塔楼里疯狂地笑着。没有人故意延迟解决方案。至少据我所知。
我怀疑问题在于浏览器供应商人员正在尝试
- 对实施的难度进行有根据的猜测。
- 对特定实施到位后的未来将会如何进行有根据的猜测。
而作者
- 非常确定我们知道我们需要什么。
- 关心我们项目中的需求,虽然我们关心整个网络,但对网络的视角较少。
而标准人员需要
- 确保没有任何东西被破坏。
- 满足尽可能多的需求。
- 还要对特定实施到位后的未来将会如何进行有根据的猜测。
在他们进行所有这些猜测之后,他们会争论支持/反对提出的解决方案。存在分歧是有道理的,因为很难用数据来支持猜测。许多人只是在凭直觉行事。再加上自负和政治因素,它竟然发展到今天这样,真是令人惊叹。我反而对我们拥有网络标准感到震惊(敲木头)。
但我要偏离主题了。如果您现在马上需要响应式图片怎么办?因为,比方说,从理论上讲,有大量的设备正在加载网页,这些设备具有各种各样的屏幕尺寸、屏幕密度、屏幕颜色和互联网速度等。哦,等等。
即使您认为,去他的标准,我只是想现在做任何必须做的事情来解决这个问题。以下是选项
- 跳过
src
属性,让 JavaScript 确定条件,注入src
。我看到的 90% 的“新”响应式图片解决方案都是以某种形式1。 - 让服务器参与进来。让一个包含条件数据的 cookie(或类似内容)可用。拦截 img src 的 HTTP 请求,检查条件数据,直接从服务器提供合适的图片。
这两种技术的现有解决方案,方法略有不同。我在 这篇文章 中为您提供了这些解决方案的指南。
并记住,基于标记的解决方案可能不是处理此问题的唯一方法。还有其他一些想法正在浮出水面,这些想法采用了完全不同的途径
- 也许新的图片格式可以从本质上帮助解决这个问题。
- 也许服务器可以以某种方式自动帮助我们。
- 也许新的协议可以提供帮助。
- 也许我们应该能够直接控制浏览器的预取行为。
当我们走上这些道路时,我们现在在 HTML 解决方案中遇到的所有#热议话题几乎肯定会发生。
所以,是的,很难。
1 如果您要创建另一个这样的解决方案,我恳请您将其设计成一个 polyfill,并使用已经具有一定发展势头的语法。
至少对我来说,这将是最终的解决方案。很棒的文章,Chris!
是的,我认为这是真的。我认为需要一个更好的响应式图片解决方案。
谢谢,chris。
已经有了:Webp,也许还需要另一个来更好地压缩旨在进行动画的图片。
你的意思是像在一个图片中存储多个图片?有点像图片包?那真的太酷了。
使用此标记
以及在 svg 中,它看起来像
请参阅此处的文档:https://github.com/estelle/clowncar
更容易维护图片。
确实很难。就像很多事情一样,我们所能做的就是拼凑出一个解决方案,直到在未来几个月或几年里,我们找到一种“正确”的方法。
遗憾的是,我得出的结论是,在网页开发方面,不存在“完美”这种东西——这只是一个利用今天拥有的东西尽力而为,并希望明天出现更好的方法。
我认为主要问题是每个人都试图在客户端解决一个真正需要服务器端参与才能按我们所有人希望的方式工作的问题。
我禁不住觉得,期望服务器知道或关心某人的屏幕尺寸不是正确的方法。当然,客户端应该确定这一点,并相应地请求内容。
问题在于,网页开发者不想在每个 IMG 标签中都放置一系列 URL,当您引入 CMS 时,这变得不可能,因为我的客户在创建新的博客文章等时不会上传他们的图片的多个副本。
前进的唯一途径要么是一种新型的渐进式图片格式,它仅根据图片大小/屏幕 PPI 提供所需的像素数量,或者“客户端提示”,它告诉服务器图片在其当前位置/媒体查询中可以达到的最大尺寸。然后,服务器端脚本可以根据大小和艺术指导提供合适的图片。
这正是 HTTP 客户端提示 所关注的,它将允许客户端以服务器上的缓存友好方式指定他们想要的图片大小/类型。
结合像
<picture>
或src-n
这样的提案,我们将拥有一个相当不错的系统。针对 CMS 的要点直接说明,如果您通过图片上传器上传图片,为什么不告诉 CMS 创建您需要的所有不同图片大小,然后使用图片元素或 srcset 提案(通过 polyfill)?例如,WP 已经有插件可以做到这一点 此处链接到您的文字…
Jon,
关于您关于 CMS 和用户需要上传多个图片的评论。我认为如果用户要上传单个(大型)图片,CMS 可以很容易地处理创建该图片的多个版本并生成输出多个 URL 的必要代码,我没有任何理由。
我认为这仅仅是最小的问题!
没错。谢谢。许多这些解决方案的问题在于额外的标记。突然,一个包含大量图片的简单项目变成了一个巨大的编码时间陷阱,需要为每个位置调整 3-4 张图片的大小。最合理的方法是让服务器处理它。页面标题中的某些内容(可能与客户端提示相结合)可以告诉 Apache(或任何其他内容)动态创建图片的较小版本,以提供给无法处理较大图片的那些设备(或带宽)。这些备用大小的图片可以在创建时缓存在服务器上,并且批处理可以自动化。它也将面向未来。您不必像 Dick Tracy 手表浏览器那样,为下一代设备回过头来更新旧版 html。您可以在 Apache 模块的 init 文件中一次性完成所有操作。并且期望每个人都使用 CMS 来服务和创建多个图片是不现实的。
我们需要一种可用于过渡的响应式图像语法;最终目标可能是浏览器可以读取的渐进式图像格式(无需服务器的要求?)——但在那之前,我们将不得不从垫片/polyfill 开始。
我们需要**不要**在标记中重复 CSS 中的规则(如
src-n
的视口部分)。比srcset
更简洁的语法。我们需要一种简短的、人类可读/可写语法。我一直在认真思考这个问题——想出了这个:基于可用图像源选项(大小、dpr、格式)的语法——srcoptions
这篇文章的时机很好。我正在网上学习Aquent的响应式设计课程,刚刚完成了图像部分,这是整个课程中最复杂的部分。最简洁的方法是使用背景图像和background-sizing样式,但从可访问性的角度来看,这似乎不是最佳方法……
这真的让你希望有一个总体的组织来告诉浏览器制造商该做什么。
当我阅读以上内容时,我首先想到的是我们确实有……人们、用户、大众。但第二个想法是,我们仍然是精神上的婴儿,还没有成熟到能够明智地选择自己的力量。这就是为什么IE是使用最广泛的浏览器,而实际上它是最糟糕的。
所以我们没有。
话虽如此,我认为 CSS 将不得不拯救这一天。正如所说,它解决了大多数情况,其余的应该由以下内容保存
img { max-width: 100%; }
Chrome 是世界上最流行的浏览器,根据除 Net Applications 之外的所有统计网站,IE 最近一次占据榜首是在 2013 年 1 月。
@Mark Ayers,从统计学上讲,这是正确的,但你应该更清楚,因为我们都明白,人们不会使用世界上使用最多的东西,而是使用访客使用最多的东西。
应该实现类似于游戏开发世界中的图像mipmap。基本的mipmap生成一个图像金字塔(从大到小),图形卡知道根据查看距离交换哪个图像。甚至有一种图像格式(DDS)将mipmap金字塔存储在文件的内部(而不是让游戏引擎动态生成mipmap,而是动态生成)。
对于网络,我不知道该解决方案是什么样子。
虽然我同意目前在服务器端解决问题,但我认为这种方法不会作为标准被接受。我相信解决方案应该基于一个哑文件服务器(例如计算机上的目录)工作,因为 HTML 在其基本性质上仍然是一个文档文件,因此解决方案应该位于 HTML 文档本身。
除非我错过了,否则你错过了另一个问题,CMS。作为在企业环境中工作的人,那里有很多内容管理员,他们并不总是最精明的人,如何管理它就成了一个问题。这并不是说在规范最终确定后不会有人提出可行的解决方案,而是说需要考虑这些内容贡献者。
我已经厌倦了等待实现,所以我决定使用 JS 作为主要解决方案。
“跳过 src 属性,让 JavaScript 确定条件是什么,注入 src。我看到的 90% 的“新”响应式图像解决方案都是这种风格1。”
我有一个更好的主意。
与其跳过 src,为什么我们不将整个
<img src="i/normal-img" alt="Some img"/>
替换为<a href="i/normal-img">Some img</a>
。然后使用 JS 检测所需的图像,并将
<a href>
替换为<img src>
。如果没有 JS,
<a>
仍然指向图像。所以对我来说,这在语义/可访问性方面足够了,并且可以很好地回退到旧版浏览器。这太搞笑了!:D
如果人们不想费心选择一个自动更新的浏览器来实现尚未确定标准的标准——给他们一个指向图像的链接——而不是一个内联图像。
这可能很有趣,但它确实为我完成了工作。我尝试了所有可能的实现(技巧),到目前为止,它们都达不到预期。因此,虽然这看起来像是一个奇怪的解决方案,但它仍然比我测试过的任何东西都更好/更容易。
哦……你是认真的。
你也可以在其中包含一个带有 img 的 noscript 标签。我的意思是 img 支持现在非常好——只是没有响应式的东西;)
是的,我已经添加了带有默认 img 的 noscript 标签。
你可以做其他一些事情来为浏览器实现准备好时进行标记更改做好准备。
对于静态图像,始终可以使用带 min-device-pixel-ratio 的媒体查询(即使代码在浏览器供应商前缀中很荒谬;或者使用 LESS)[不是我的方法]
问题在于动态图像。
可以创建一个服务器端类/函数来为图像提供正确的标记;这样,如果引入了新的浏览器实现,您只需更改几行代码即可
是的,我真的很认真。
16 年后,HTML5 仍然是 W3C 的候选推荐(HTML4?1997!!!)。
因此,新的图像实现将在 2050 年可用(或渐进式图像……!是的,当然。到那时我们将在火星上)。
在那之前,我将使用最适合我的响应式方法,该方法基于 3 个要点
1- 服务器请求数量
2- 带宽使用情况(对于移动设备和服务器)
3- 最简单的实现
当我想到这个已经很复杂的舞蹈现在将包括服务器管理员团队时,我感到畏缩。
网页设计 + 前端开发 + 程序员 + 服务器管理员 = 舞蹈变得更加复杂了!o_O
如果你不打算使用 src 属性(并且只通过 js 插入它),你也可以使用背景图像,对吧?前者在语义上或根据标准如何更具意义?
为什么响应式图像如此困难
我通常最终会使用媒体查询,但是如果有人碰巧调整了浏览器大小,图片跳动时会有点“卡顿”。
你让我看到了现在就做
我告诉你一件事……如果没有丑陋的代码,现在或将来,我们都没有一个好的标准实现。
需要引入一个新的库,该库将根据屏幕分辨率动态创建图像,而不是调整图像大小。因为调整大小会损失图像的整体外观。
——
TheTechDigit.Com 团队
对于响应式图像,我通常在 **CSS** 中使用
%
来设置图像分辨率。例如,在此演示中
哈哈,呃,这不是本文的重点。您发布的代码仍然会下载全尺寸图像,而不管需要什么尺寸。
每个人都在说自己的方法,但需要一些标准。
这是一句很棒的引言。我想这可以用来形容生活中大多数的分歧。
非常好的想法。也许一个真正独特的方法永远不会存在。无论如何,值得多尝试!
我(现在)看不到只有一个(标准)解决方案。需求太多了!此外,我还没有看到那么多 CMS 集成。我希望将来能看到更多关于这方面的内容。
是的,希望他们能想出一个更简单、更标准的方法来实现响应式图像。但目前,我必须坚持使用 max-width、媒体查询、百分比和 jQuery 选项。非常感谢您分享您的想法!
目前,网络上有大量文章在争论这个话题——可能的解决方案、利弊……
目前,响应式图片只能通过 JavaScript、CSS 或服务器端检测来实现,与普通的“img”标签相比,实现起来更复杂,并且对性能有影响。
希望有人能想出一个更好的解决方案。
顺便说一句,我正坐在黑暗的城堡塔楼里疯狂地大笑。
我正坐在凳子上,一边磨着我的干草叉,一边思考着下个季节要种什么——顺便说一句;)
这个问题再次证明,Web 应该更多地参考游戏(引擎)的工作方式。我认为这个问题的最佳解决方案非常接近 .DDS 格式,这是一种基于图层的图形格式,图层始终按 x 2 分割。它们被称为 mipmaps(或子图),想象一个 500x500px 的文档。在最大图层下方是另一个图层,但只有 250x250px 的图像,再下方是一个 125x125px 的图层,依此类推。
对于游戏,屏幕显示和显卡等设置的组合决定了从这个 DDS 文件中提供哪个图层,以提供最佳体验,而无需包含(下载)整个文件。在 GIMP 中,创建较小图层的过程在保存图像时会自动进行。精灵 + mipmaps 中的纹理文件对游戏非常有效。想象一下,从远处看一面墙,没有必要查看/下载最大图层,而只需一个更轻、更小的图层即可,但当你靠近时,你确实想要更多细节,因此它开始淡入更大的图层。这种查看距离机制应该根据连接速度和屏幕 PPI 调整为基于 Web 的机制。
您知道当 PNG 或 JPG 文件的格式放大 2 倍(视网膜)时,文件大小不会变大吗?不客气!
你说得对,它不会变大,因为它已经变大了。我们从那个 @2x 图像大小开始,然后从那里缩小……你懂的。
然后,当您将其缩小到标准像素尺寸的屏幕时,相关的 PNG/JPG 文件实际上会减小文件大小和磁盘空间。
.DDS 格式的概念乍一看非常有趣,因为额外的图层将由软件创建,而不是由我们创建,因此我们的工作流程不会改变,因为我们仍然会导出单个图像/精灵,在标记中使用简单的
<img>
标签和单个src=""
,背景图像通过 CSS 也一样。但是,唯一可能令人担忧的是文件大小,除非该技术(浏览器、操作系统、脚本?)以某种方式“丢弃”未使用的图层并且不通过网络传输它们,否则一切都很好。
我喜欢这个概念……或者说“技术”更好,因为它已经存在了。
是的,您理解了,我们不需要游戏引擎,而是需要浏览器的帮助来告诉服务器(软件)根据 html/css 中定义的图像尺寸 + 屏幕 PPI 等值使用哪个图层。
还有一件事我想特别指出(因为我们似乎非常担心向用户呈现完美的像素)是
我们有一个 800×800 的原始 jpg,我们需要将其以 90% 的质量缩小到 200×200,以保持其美观,当我们制作一个 400×400 的 jpg 并将其质量设置为 60% 时,这个调整大小的图像文件大小更大,并且看起来更清晰,尤其是在视网膜显示屏上。那么,如果我们的视网膜就绪图像看起来更好并且文件大小更小,为什么还要费心去关心 200×200 版本呢?
为了回答我之前关于为什么还要费心处理普通屏幕的问题,如果视网膜就绪图像看起来更好并且文件大小更小,与压缩率更高的 50% 较小图像相比,这是因为浏览器会为重新渲染过大的图像到较小的图像占位符而创建 FPS/延迟。视网膜图像越大,延迟越大,至少在 Chrome 和 IE11 中已经进行了研究,查看这篇文章,文章结尾提出了一些非常好的问题
其他浏览器如何处理图像解码和调整大小?
随着文件权重的上下调整,这些结果如何变化(例如,对于压缩图像而言)?
文件格式是否会影响解码和调整大小时间?
http://timkadlec.com/2013/11/why-we-need-responsive-images-part-deux/
当涉及到标记中的图像时,我的解决方案曾经是只提供一个分辨率和文件大小合理的图像,并可以选择点击查看更大的图像。
如果只能支持 320×240 分辨率的移动设备必须下载一个 800×600 的 60kb jpg,我不会太担心。
如果我的 800×600 扩展到 1024×768,我也不会太担心——同样,如果图像质量非常重要,我会提供指向高分辨率版本的链接。
如果我的网站在一个页面上提供了 10、15、20 张大型图像,显然我做错了什么,或者我正在与 Flickr 竞争。
我说这是我曾经的首选解决方案,因为现在视网膜设备出现了,并且让事情变得更加困难了。
我现在采用的解决方案是躲在桌子底下,像一只吸食了大量糖分的疯狂黑猩猩一样胡言乱语。
有人可以尝试使用 Bootstrap 并只使用类“hidden xs” “vissible lg” 吗?我说的对吗?
这篇文章的标题不应该改为“为什么响应式图片如此困难?”吗?
我相信“响应式图片”是主题,也就是说,我们讨论的不是图片本身,而是响应式图像。
我们使用“is”的原因是“响应式图片”变成了复数主语,它是我们正在讨论的事物的名称,它是一个主题,因此它变成了单数。
您可以轻松地将以下代码用于响应式背景图像:
banner-panel{
}