使用CSS精灵图来处理图片的一般规则是,只应该对较小的图片(如图标)使用,而实际的图片内容应该始终通过 <img>
元素表示。 我的问题是:为什么?难道使用精灵图的优点在处理内容图片时不值得吗?
我读过的一个原因是为了启用 alt
文本,以更符合语法和屏幕阅读器的可访问性。然而,当这是一个问题时,你是否可以轻松地使用一个单独的微小透明的图片,将所有语法糖放在一个呈现实际视觉内容的精灵图上?
使用CSS精灵图来处理图片的一般规则是,只应该对较小的图片(如图标)使用,而实际的图片内容应该始终通过 <img>
元素表示。 我的问题是:为什么?难道使用精灵图的优点在处理内容图片时不值得吗?
我读过的一个原因是为了启用 alt
文本,以更符合语法和屏幕阅读器的可访问性。然而,当这是一个问题时,你是否可以轻松地使用一个单独的微小透明的图片,将所有语法糖放在一个呈现实际视觉内容的精灵图上?
与图标等UI类型的图片相比,内容图片往往不会被重复使用。比如新闻网站:如果他们在每个故事中使用的每个内容图片都是雪碧图的一部分,那么这个雪碧图会很快变大,即使只有查看一个故事的用户也需要下载整个雪碧图。
通常情况下,网站内容的维护者并不了解CSS。希望内容编辑通过编辑主雪碧图文件、重新保存为JPG格式并添加CSS来放置图片到页面上是有些不合理的。
如果将许多大型图片文件设置为雪碧图,则雪碧图文件将变得非常大。当用户首次访问页面时,可能需要下载很长时间,或者占用那些只看到其中一个图像的用户过多的带宽资源。
显然,这些都是概括性陈述 - 在特定情况下,将更大/更多的内容图片设置成雪碧图可能是完全合理的。
对于雪碧图中的任何精灵图像,您都可以使用一个微小的透明图像文件来使用<img>
标签,这通常对于裁剪和超越background-position
允许的位置很有用。
我能想到的另一个原因是搜索引擎;如果您在图片上使用了描述性的alt标签或者在figure
元素中使用了figcaption
,那么搜索引擎就能够找到、分类和显示它。
alt
文本吗?它不是太容易被滥用了吗? - Paul D. Waite从我继续研究这个问题来看,另一个潜在的问题是内存消耗。尽管精灵图可能被压缩到足够快速下载,但它们在客户端机器的内存中占用的空间是在浏览器渲染它们之后,这意味着即使是文件大小相当小的精灵图,它们所占用的内存也可能非常大。
我还没有看到明确的答案,关于是否与不使用精灵图加载同样数量的图像时所看到的内存占用量相比,这种内存占用量是否更大。对于引发这个问题的项目,我将在未来几周进行测试,因此一旦得出结论,我将返回并更新这个答案。
精灵通常用于静态内容(在许多页面上都出现的图像)。
内容图片通常只出现在一个页面上,因此您无法将其添加到精灵文件中。
如果您想要实时生成精灵,请制作包含所有图片的自定义精灵文件,但我认为其生成成本远高于所节省的重复HTTP调用成本。
精灵的目的是为了节省HTTP请求,但您不应该浪费服务器端计算时间来制作它,也不要将昂贵且无用的图片放入精灵文件中。
在整个网站中,应该使用精灵图来作为常见图标,而不是页面特定的内容。当您将大图片制作成精灵图时,会浪费很多白色空间。
根据http://blog.vlad1.com/2009/06/22/to-sprite-or-not-to-sprite/,这也是一个问题:
另一个(但不太重要)的缺点是,如果使用精灵图的页面使用许多浏览器中存在的全页缩放功能进行缩放,则浏览器可能需要额外的工作来获得这些图像边缘的正确行为 - 基本上是为了避免精灵图中相邻的图像“泄漏”。对于小图片,这不是问题,但对于大图片可能会影响性能。
精灵用于减少对服务器的请求量。大量小请求的影响比一个较大的请求更容易使服务器变慢。但是,如果精灵的图像(我喜欢称之为精灵地图)太大,也会降低性能。另一个重要的事情就像你所说的,每个单独图片都有可能给出一些名称,通过搜索引擎进行管理和索引。
background-image
属性可以省去透明图像的需要。但我没有看到在background-image
属性中任何可以指定alt-text的地方。我有什么遗漏吗? - Jeffrey Blakebackground-image
在<img>
标签上并不意味着不需要alt文本。我只是说,如果你愿意,可以将所有的精灵图像都放在<img>
标签中,而不仅仅是内容相关的图像。 - Paul D. Waite<img>
元素不同,背景图片没有alt
属性,并且屏幕阅读器等辅助技术不会对其进行通告。 - steveax<img>
元素的背景。 - Paul D. Waite