日期:2014-01-08  浏览次数:21058 次

网页制造aiyiweb文章简介:本文中所称 CSS雪碧 即为CSS Sprites,这个词组不断没有一个固定或者商定俗成的中文翻译,一些人开始称之为CSS雪碧,我们且当作一次尝试吧,如果大家觉得不妥,今后还会继续直称CSS Sprites。

原文:CSS雪碧:要还是不要?
译自:To Sprite Or Not To Sprite

声明,本文中所称 CSS雪碧 即为CSS Sprites,这个词组不断没有一个固定或者商定俗成的中文翻译,一些人开始称之为CSS雪碧,我们且当作一次尝试吧,如果大家觉得不妥,今后还会继续直称CSS Sprites。——神飞(vocal)

CSS雪碧曾经出现一段时间了,并上升为一种可以让你的网站速度变快的方式。Steve Souders刚刚在 Velocity ‘09上展现了SpriteMe! (讨论——为什么在你可以使用canvase和toDataURL和及时生成雪碧的时候还要使用CSS雪碧生成器或其它基于服务器的工具?)。然而,关于CSS雪碧有一些误解,最次要的一个就是它们没有缺点。

CSS雪碧的基本原理是把你的网站上用到的一些图片整合到一张单独的图片中,从而减少你的网站的HTTP请求数量。该图片使用CSS background和background-position属性渲染(值得一提的是,这也就意味着你的标签变得愈加复杂了,图片是在CSS中定义,而非<img>标签)。

CSS雪碧的最大问题是内存使用。除非这个雪碧图片是被非常小心的组织,你就会最终使用大量的无用的空白。我最喜欢的例子是来自于WHIT TV的网站,那里的 这张图片 用作精灵。留意这是一个1299×15,000像素的PNG图片。它也被紧缩的很好——实际下载大小只要大概26K — 但是浏览器并不会渲染紧缩后的图片数据。当这个图片被下载并被解紧缩之后,它将占用差不多75MB的内存 (1299 * 15000 * 4)。如果这个图片并没有使用alpha通明,它将会被优化至1299 * 15000 * 3,但是要在损失渲染速度的情况下。即便那样,我们也会讨论55MB。这张图片的大部分其实就是空白,那里什么都没有,没没有任何有用的内容。只是加载 WHIT主页 就会导致你的浏览器的内存占用上升到至少75+MB,仅仅是由于那一张图片。(PS:遗憾的是,该网站最近曾经改版,文中提到的图片曾经不存在了

有利于网站的正确的取舍并不存在。

另外一个(虽然并没有那么重要)不足就是如果一个使用CSS雪碧的页面使用一些浏览器提供的整页缩放功用缩放了,浏览器就需求做一些额外的任务来纠正这些图片边缘的行为——基本上来说,是为了避免雪碧中相邻的图片被“露进来”。这对于小图片没有什么问题,但是对于大图片会是一个功用下降。

当然有一些显示CSS 雪碧的明显的好处的例子,次要的例子就是合并一批相反大小的图片到一个文件中。例如,一系列用作标识你的网站中的很多东西的16×16图标,或者是一些用作分类的头之类的32×32 的图标。但是整合严重不同尺寸的图片,特别是将又瘦又高的图片和又宽又矮的图片放到一同从来不是什么好主意。

然而,CSS雪碧确实提高页面加载时间(至少在初始的页面加载中——在后续的页面加载中,浏览器就将图片缓存了)。有没有什么可以替代的?不幸的是,还没有一个可以替代的方案。很多浏览器开始支持离线清单了,将其扩展到允许下载一个包含一系列资源和对应的URL的清单的文件(比如一个jar/zip文件)或许是有可能的。但是任何此类做法在一段时间内还不会见到……

所以,在决定能否要使用CSS雪碧的时候,要留意在最后页面加载功用之外还有很多的要素。作为一个普通的经验法则,如果你的CSS 雪碧的大部分地方不包含真正的图片内容,你应该相应的避免使用它。同样,关注将来可能出现的既保持页面加载速度,同时留意避免内存的缺陷和雪碧的功用影响。

其它的CSS雪碧的不足

下面是一些网友在该文评论中提到的CSS雪碧的某些不足:

  • CSS 雪碧调用的图片不能被打印,除非在@media中特别添加 print声明——by RichB
  • 如果要修正雪碧中的一个图片,你就要修正整张图片,这无疑会增大任务量—— by Tom B

如果你在使用的过程中,有发现其它的CSS雪碧的不足,欢迎提出来。