读书人

响应式图像Part 二深挖技术

发布时间: 2012-06-30 17:20:12 作者: rapoo

响应式图像Part 2——深挖技术

?

注:这篇文章发表于September 30th, 2011?,作者是Jason Grigsby

在响应式图像Part 1中,我站在一个比较概况的层面,解释了什么是响应式图像,这其中需要解决的问题以及一些共同面临的议题。在这篇文章中,我会对于响应式图像中设计的具体技术做一个更详细的论述,并且来看看这些技术的可用性。如果你还没有读过part 1,也许你会想要先读一下以便了解我在文中用到的一些术语。

当我两个月以前开始做这个工作的时候,我觉得工作的最后我可以说,“这是最有效的三种方法。去下载它们并整合进你的系统吧。”现在看来,这实在是太天真了。

现在我发现的是并没有一个综合的解决方案。相反,我们做了好几个月实验,每个实验都有它的优点与缺点。

因为这个原因,我们应该了解一些通用的元素和挑战,这样,对于我们的解决方案中的每个部分,我们就能选择相应最好的技术了。

被放弃的一些方法

动态库标签(Dynamic Base Tag

很多早期技术都使用Javascript来动态改变库标签。新的库标签将会在路径中加入用于指示需要解析的图像大小的信息。文件加载以后,库标签就会移除。

但是,这种方法会遇到我在part 1中所说的race conditions的问题。

(译者注:关于race conditons,参见http://linux.chinaitlab.com/man/linux/HOWTO/Secure-Programs-HOWTO/avoid-race.html,race condition是由于事件发生的相对时间之间的依赖而引起的异常行为问题。)

我发现Google Chrome会同时下载移动端和桌面端的图片。Scott Jehl发现这个问题是由于内部和外部Javascript不同处理方式间的区别引起的。他对webkit提交了一个bug,并将其标记为“不可修复”的,原因如下:

插入库标签会改变页面上随后的所有的URLs。任何脚本都有可能插入一个库标签来避免双重加载,除非有一个挂起的脚本(a pending script)加载,否则不会加载任何事物。这意味着预加载被禁止了,这就脱离了讨论范围了。

在理论上说,你仍然可以使用内联动态库标签,但是Filament Group主要使用的还是基于cookies的办法,因为这种方法似乎更安全。

暂时的图像(Temporary images

另外一个早期的技术是让图像的src指向一个暂时的图像,然后让Javascript用一个正确的文件路径来替换这个图像的源。在大多数情况下,这个图像是一个一像素的透明的gif图像,它使用了缓存技术,这样,无论它在页面中被引用多少次,浏览器都只需要请求一次。

这种技术的问题在于一旦Javascript失效,浏览器将永远不会加载图像。

基于Javascript的解决方案

你在哪里存储不同版本图像的路径?

如果图像指向的是‘small.jpg’,那么,对于需要加载大图像的大屏幕,你将‘large.jpg’的信息放在哪里?

URL参数

一种解决方法是将不同版本图像的路径作为url参数放在图像属性中。它最简单的形式如下:

<img src="small.jpg?full=large.jpg">

如果你有好几个不同大小的图像,只需要在url中增加一部分值就可以了。这种方法的关键在于将其和一个.htaccess文件绑定。

潜在的CDN,代理,以及缓存问题

使用URL参数的最大缺点在于在内容分发网络以及使用代理(代理在对内容进行缓存的时候不会注意到url参数)的情况下会引起问题。一些缓存算法会忽略任何有url参数的内容,这意味着由于图像不会被缓存,页面会变慢。

另外一些缓存算法只会缓存它们看到的第一种版本的图像。如果使用代理缓存看到图像的第一个人恰好是在移动终端上看到图像的,那么随后使用同样的代理缓存的人访问网站的人看到的都将是适用于移动端大小的图像,不论他们使用什么平台,除非这样的缓存过期了。

这在多大程度上会成为一个问题呢?就此我询问了Steve Souders。他说这足以构成一个问题因此你不能忽略它。这引发了Bryan 和Stephanie Rieger对于缓存和CDNs的一些评论。

因此,我认为我们应该找到一些不需要使用url参数的技术。

这种方法的一些例子:

读书人网 >图形图像

热点推荐