本文自 2007 年首次发布以来,经过多次修订和重写,以保持信息的最新性。最近一次修订由 Flip Stewart 于 2015 年 1 月完成。
什么是 CSS 雪碧图?
剧透警告:它们不是帮你编写样式表的仙女。我希望如此。简而言之:CSS 雪碧图是一种将多个图像组合到单个图像文件中的方法,以便在网站上使用,从而提高性能。
考虑到您创建的是一个大图像而不是使用许多小图像,所以“雪碧图”这个词似乎有点用词不当,但是可以追溯到 1975 年的 雪碧图的历史 应该有助于澄清这些问题。
概括地说:“雪碧图”一词源于计算机图形学中的一种技术,最常用于视频游戏中。其想法是计算机可以将图形提取到内存中,然后一次只显示该图像的一部分,这比不断提取新图像要快。雪碧图就是那个大型的组合图形。
CSS 雪碧图的原理与此完全相同:获取图像一次,然后将其四处移动,只显示其一部分。这样可以减少获取多个图像的开销。
为什么要使用 CSS 雪碧图?
将较小的图像塞进较大的图像中似乎违反直觉。较大的图像加载时间不会更长吗?
让我们看看实际示例中的一些数据
图像 | 文件大小 | 尺寸 |
---|---|---|
canada.png | 1.95KB | 256 x 128 |
usa.png | 3.74KB | 256 x 135 |
mexico.png | 8.69KB | 256 x 147 |
这加起来总共需要加载 14.38KB 的三个图像。将这三个图像放到一个文件中,重量为 16.1KB。雪碧图最终比三个单独的图像大 1.72KB。这并没有太大区别,但是**必须有充分的理由接受这个更大的文件……并且确实有!**
虽然雪碧图的总图像大小(有时)会增加,但**多个图像使用单个 HTTP 请求加载**。浏览器限制站点可以进行的并发请求数量,并且 HTTP 请求需要 一些握手过程。
因此,雪碧图对于 与压缩和合并 CSS 和 JavaScript 相同的原因 非常重要。
如何使用 CSS 雪碧图?
这是一个雪碧图示例,其中将三个不同国家的国旗组合到单个图像中
您可以在多个 CSS 类中设置相同的 background-image
,并设置各个类的背景位置和尺寸以显示雪碧图的一部分。以下是一些演示该概念的代码
.flags-canada, .flags-mexico, .flags-usa {
background-image: url('../images/flags.png');
background-repeat: no-repeat;
}
.flags-canada {
height: 128px;
background-position: -5px -5px;
}
.flags-usa {
height: 135px;
background-position: -5px -143px;
}
.flags-mexico {
height: 147px;
background-position: -5px -288px;
}
如果您认为必须有一种方法可以自动化此过程,以便您无需手动创建这些雪碧图,然后调整样式表以匹配,那么您是对的,并且您很幸运!
使用 Grunt/Gulp/Node 生成雪碧图
如果您通常使用 Grunt、Gulp 或 Node,则 css-sprite (现在称为 sprity) 是一个很棒的 Node 包,它可以从图像的 glob 中创建雪碧图。Sprity 具有许多很棒的功能,包括将输出格式化为 PNG、JPG(或 Data URI)以及以 CSS、LESS、Sass 和 Stylus 生成样式表。
要通过命令行编译雪碧图,请使用以下命令全局安装 css-sprite:
$ npm install sprity -g
然后,要生成雪碧图和相应的样式表,请运行:
$ sprity ./output-directory/ ./input-directory/*.png
有关在 Grunt 或 Gulp(或许多其他环境)中使用 css-sprite 的更多信息,请访问 GitHub 上的项目存储库。
使用 Compass 生成雪碧图
使用 Compass 生成雪碧图 需要一些额外的设置和维护,但是如果您已经在使用 Compass,它可以很好地融入您的现有工作流程。
首先在您的 `images` 目录中创建一个目录(是的,它需要位于您的 `images` 目录中才能工作),并使用与您要创建的雪碧图相对应的名称。确保您要转换为雪碧图的图像为 PNG,并将它们放在您的新目录中。我正在创建国旗雪碧图,因此我将我的目录命名为 flags,并将三个 PNG 放入该目录中。
在一个名为 `flags.scss` 的新 SCSS 文件中(此处的名称并不重要),以下三行将按顺序导入 Compass 的雪碧图制作工具,全局导入要转换为雪碧图的 PNG(请注意,此处的路径不包含 images/),然后生成雪碧图的 CSS。请注意,**@include 语句的中间词需要与前一行的目录匹配**。
@import "compass/utilities/sprites";
@import "flags/*.png";
@include all-flags-sprites;
这是一个相当简单的生成雪碧图的过程,但它有一些缺点/怪异之处
- 生成的 CSS 不包含雪碧图的宽度或高度。
- 雪碧图之间没有共享类;背景图像应用于每个类。
使用 ImageMagick 生成雪碧图
ImageMagick 可用于使用以下命令从命令行创建雪碧图
convert *.png -append sprites.png # append vertically
convert *.png +append sprites.png # append horizontally
这将获取 glob 选择的所有 PNG 文件并将它们连接到单个文件中,但不会创建相应的样式表。如果您使用 ImageMagick 创建雪碧图,您可能需要阅读下面有关使用 Sprite Cow 的部分。
将 Sprite Cow 与您的雪碧图一起使用
Sprite Cow 是一种托管工具,用于生成与您的雪碧图相对应的样式表。它不会为您创建雪碧图,它只是帮助您获得使用雪碧图所需的数字(雪碧图各个部分的宽度、高度和背景位置)。它拥有 2 倍图像兼容性和一个简单的界面,可以快速指定雪碧图的哪些区域构成每个图像以创建 CSS。您只需点击所需的部件,它就会为您提供所需的 CSS。
使用 Spritepad 生成雪碧图
Spritepad 是另一个用于创建雪碧图的托管解决方案。使用 Spritepad,您可以上传单个图像,根据需要定位它们,并且 CSS 会实时更新。完成后,下载图像并将 CSS 复制到您的项目中。
使用 SpriteMe 生成雪碧图
SpriteMe 是一种书签工具,可以根据它在当前页面上找到的内容生成雪碧图。因此,从本质上讲,您根本不需要使用雪碧图来开发,然后使用它在最后将内容组合成雪碧图。这是一个工作流程,解释了它是如何工作的。
我的精灵图应该横向还是纵向?
一种选择是都不用。将它们压缩成一个网格,使其尺寸尽可能小。图像的尺寸大小会影响图像使用时占用的内存量,因此越小越好。如果你最终自己布局精灵图,Sprite Cow 是一个有助于 CSS 生成部分的不错工具。
如果为了简单起见,你打算选择其中一个,那么一种方法是查看图像文件的最大宽度和最大高度。如果最大宽度大于最大高度,则精灵图应水平排列。如果最大高度大于最大宽度,则垂直排列。如果你使用的是生成工具,它们通常会为你做出这个选择。
在某些情况下,实际上可能有意义对角线布局精灵图。这使得可以在未知宽度和高度的区域使用精灵图成为可能,这非常酷。
尽管另一种解决方法是使用伪元素。
替代方案
CSS 精灵图有一些替代方案,但正如你所料,它们各自都有自己的优缺点。
数据 URI
数据 URI 允许你将图像数据直接嵌入到样式表中。这避免了对图像的额外 HTTP 请求,使其本质上与精灵图相同,但没有花哨的定位。
图标字体
图标字体类似于精灵图,因为它们实现了相同的功能:将多个图像组合到一个请求中。
SVG
SVG 图像也可以组合成精灵图并用作图标系统。不过这是一种略微不同的方法,利用了 SVG 的语法和优势。你可能需要考虑一个回退系统,因为 SVG 的浏览器支持不如 CSS background-image(CSS background-image 基本上没有任何浏览器支持问题)。
Grunticon 和 Iconizr 是用于处理 SVG 精灵图的可能性,它们有助于回退。
使用 <img> 和 object-position
Robin Rendle 有一篇关于这种巧妙技巧的精彩文章这里。
示例
- Mozilla 开发者网络 使用精灵图在切换其顶级导航时在不同状态之间切换。
- Mailchimp 在其侧边栏导航的不同状态中使用精灵图(背景图像 SVG)。
- Mapbox 使用图标字体在其整个站点中使用的较小图标,但使用相当高分辨率的精灵图用于社交媒体和新闻徽标。
好文章!将收藏起来以备不时之需!
CSS 精灵图的另一个好处是你可以轻松地制作列。在我之前的一个网站上,我尝试过制作三列等长的列,这几乎是不可能的,直到我使用精灵图作为一张背景图像。
我已经看到这种技术被使用了很多年,但主要是在之前的导航中。
虽然我理解它背后的原理,但它实际上并没有什么实际意义(除了请求参数之外)这样做。
我主要不喜欢这个的原因可能来自我使用过该网站的偏见,而这个网站不是我最初设计的。我没有原始的图形文件,并且不得不从头开始重新创建它(当我只想更改一个小图标而不必担心同一图形中的其他 4 个图标时)是一件很痛苦的事情。
更好的网站性能,也许有一点。我会说现在大多数网站上最大的时间消耗是在服务器端,特别是对于所有现有的数据库驱动平台。
如果你有时间,我认为这是值得的,但我说,如果你在截止日期内,它可能会让你花费的比它值钱的更多。
@spiralstarez:我认为你提出了一些很好的观点。更新图形对于精灵图来说是一件更痛苦的事情,特别是如果你没有本地文件。
我认为可能有一个最佳点,在那里使用 CSS 精灵图是最有益的。如果你有一个相当低流量的网站在一个不错的服务器上……是的……它可能没有多大关系。如果你正在运行一个超高流量的新闻门户网站,例如 yahoo.com,那么肯定有好处,并且使用它们来减少服务器请求是**必须的**。
有趣的文章。
但是,我想指出,如果用户增加字体大小,那么此选项的整洁性就会开始失效,因为你会看到其他图像显示出来。也许稍微改变一下方法会更好:使合成图像水平运行,而不是垂直运行。
此外,可以在 css 中使用 min-heights 来防止图像在用户减小字体大小时折叠(这不太可能)。
Chris,
你以大多数人都能理解的方式写这篇文章做得很棒。我已经使用精灵图进行翻转导航有一段时间了,我确实发现它是提高页面加载时间的最佳方法。
Lucy 关于精灵图在字体大小缩放时遇到麻烦提出了一个很好的观点,绝对要鼓励人们在各种字体大小下测试他们的设计。
此外 - 如果你要谈论精灵图,你必须提到 Ask.com 上最酷的精灵图示例之一。这是一个指向其精灵图图像的直接链接:http://sp.ask.com/i/h/sprite/b1.png
干杯,
Scott
很棒的文章
正如你在开头提到的,我曾将它们用于单个开关导航状态,但我从未想过将这种技术用于多个图像!
谢谢 Chris!
我以前见过这样做 - 但你解释的方式更有意义。
@lucy:很棒的观点!是的,你绝对可以使你的精灵图水平运行而不是垂直运行。事实上,你可以同时执行这两者,只需查看 Scott 在下面链接的 Ask.com 的精彩示例精灵图,它使用了各种 X 和 Y 定位。
@Chris & Matt & Scott:谢谢!感谢你们的支持。
Lucy Barker,
这就解释了为什么我没有看到它。我在一个 Feed 阅读器中阅读这篇文章,当点击示例时,在方块下看到了下划线。它们是下一个方块的顶部。当我在 Firefox 中打开示例时,方块的底部被切掉了,增加字体大小使它们恢复了,但也显示了下面的一些方块。
感谢这篇文章,它真的让我对网站的策略方法有了启发。再次感谢。
在图像之间留出更多空白可以解决字体大小增加或减少时发生的退化问题。
http://www.shacknews.com 几年来一直在使用 CSS Sprites。
Ugh。最终,合理的解决方案是*停止使用位图图形*。随着屏幕分辨率越来越高,仅仅使用 SVG 会好得多。可惜你不能依赖它可用(曾经,你当然不能依赖 PNG 可用,所以也许有一天……)。
可以通过将组合图像的过程整合到系统构建中来轻松实现这种方法的可维护性。SCCS 将维护原始的单独图像,并且将在构建时将它们转换为单个超级图像。样式表必须作为模板完成,使用图像组合步骤的工件来填充实际的超级图像坐标。
我第一次在 paulstamatiou.com 上遇到精灵。
顺便问一下,有没有办法将精灵用于链接以外的元素以及重复背景?我怀疑最后一个。
精彩的帖子。引人入胜的阅读。我已经在 InformedNetworker.Com 上发布了它……我很乐意让你提交你认为可能对你的读者有用的任何未来帖子的文章链接。
@Sumesh:我认为没有办法将精灵用于重复图像,因为最好的方法是知道你将要使用的精灵元素的高度和宽度,并且你不太可能知道你正在尝试使用的元素的高度和宽度。
但是你可以绝对地将精灵用于链接以外的事物。任何在 CSS 中接受 background-image 属性的东西都是公平的游戏。
雅虎!广泛使用 bg 精灵来重复背景(这是一个示例——来自他们的主页),但你的警告以及上面关于了解你的宽度/高度的警告非常重要。这是一个问题,特别是如果你刚刚开始。这绝对是一种高级技巧,而且很容易被绊倒。(我做过,也被绊倒过!)
如果你“必须”这样做,我认为关键是背景之间有大量的空白,并进行广泛的测试。
关注 CSS3。它很快不会出现在许多浏览器中,但我们最终应该能够将精灵用于完全重复的背景。
http://www.css3.info/image-sprites-syntax/
尺寸减小的一部分仅仅是因为 GIF 限制为 256 色,因此这不是一个完全公平的比较。如果你仔细检查拼接后图像中的颜色,你会发现它们与之前略有不同。对于大多数图标,你无法分辨出差异,但在具有大量渐变的效果上,你会注意到它。不幸的是,这种效果在你添加更多图像时会加剧。如果你使用 PNG - 你会发现大部分文件大小的减少消失了。
当然,要点是减少你必须从服务器获取的文件数量是一件好事(即使使用流水线和 HTTP/1.1),并且这一点仍然成立。但是,鉴于清晰度的降低(如果你使用 GIF,则为图像质量),这是否值得付出代价?
这是我做的一个 CSS 精灵工具
http://www.csssprites.com
(我必须承认,UI 非常丑陋,但如果有人想贡献一个样式表,那将不胜感激,链接回确认等)
一个小通知 - 如果你的图像精灵是带有 alpha 通道的 .PNG 文件,则 IE6 的透明度 hack 将破坏你的 css 样式。AlphaLoader 过滤器不支持 background-position 属性,背景会自动定位在左上角。因此,你必须为 IE6 提供 gif 精灵或为其使用单个 PNG 图像。
@Some Jackass:你说得对,文件大小节省的一部分来自这样一个事实,即所有图像的总调色板将最多强制为 256 色,而不是每个图像都有 256 色。但即使你在每个图像上使用的颜色足够少,也不会妥协,仍然可以从不必每次都重复文件格式代码中节省一些空间。不多,但有一些。
@Matas Petrikas:感谢你指出这一点。简而言之,当使用 PNG hack 时,不要使用精灵。
关于 Matas 的评论 - 在这些情况下,在没有任何 hack 的情况下使用 PNG 精灵是可以的
a/ 你的 PNG 具有恒定的透明度(真/假,如 GIF)。在这种情况下,可以使用所谓的 PNG8 格式,其中你有一个位用于透明度
b/ PNG 具有可变透明度,但保存时有 4 位用于透明度
a/ 的 PNG 可以由许多工具生成,例如命令行上的 imagemagick
> convert my.png PNG8:my8.png
b/ 类型的 PNG 仅由 Fireworks 生成(据我所知)(Fireworks 将其称为 PNG8)
@Stoyan:你能更多地解释一下 4 位 PNG 透明度吗?我实际上只熟悉 Photoshop 中的 PNG-8 和 PNG-24。使用 PNG-8(1 位透明度),不需要 hack。使用 PNG-24,使用 hack 会破坏精灵,因为 hack。你是说还有其他方法可以保存 PNG,以便在不需要 hack 的情况下支持 alpha 透明度吗?
嘿,Chris,我的意思是不同的格式——Fireworks 将其称为 PNG8,但使用 imagemagick 的“identify”查看结果图像时,我看到 4 位用于透明度。
这里的故事很长
http://www.sitepoint.com/blogs/2007/09/18/png8-the-clear-winner/
我不知道 Fireworks PNG8 的测试范围有多广。我用一张图片进行了测试运行,似乎工作正常,然后用灰色渐变图片使用它,它没有正确渲染。可能存在一个试图检测“应该”是什么 alpha 透明度的算法,但对于这种情况,它绝对是“损坏”的。
我不会依赖它。
@Greg 使用 PNG 8,“像素要么是实心的,要么是完全透明的,但永远不会是部分透明的。” - 因此它不会适用于渐变,因为 alpha 水平需要变化
喜欢关于 Chuck Norris 的评论:P 我不认为我会真正使用它,在当今的宽带速度下,节省的空间很少。我可能会在未来的设计中尝试一下,仅仅是为了好玩:P
我认为你错过了要点——节省的是 9 个更少的请求——避免了最终用户 4-9 次延迟命中(这与他们的连接速度无关)并减少了服务器的工作量。
很棒的文章,但我必须挑出一个技术问题。切片的主要原因之一*不是*为了欺骗眼睛获得更快的加载体验,而是为了优化大型 gif。
你看,如果可以最大限度地减少特定图像的相应调色板,则可以显着压缩 gif。因此,gif 中相同(或相似)颜色的较大区域可以通过切片分解,从而大大减少整个图像的总大小。换句话说,所有切片的组合尺寸将小于未切片的整个图像。
当然,环境发生了巨大变化,随着 jpeg 和 PNG 的使用越来越多,以及用户带宽的增加,响应时间(往返时间)变得比仅仅是带宽更重要。尽管如此……很棒的文章!
@Shane:你知道,我记得当时我坐在那里写这些的时候,我停顿了一下,用手敲着额头,思考着我们为什么要把图像这样切开。我以前经常这样做,但我怎么也想不起来我为什么要这么做。我想我从来没有想过这个问题,这只是一个标准。
但是,是的,你完全正确,真正的原因是 GIF 的颜色索引功能。
但是,对于 508 合规性,如何为图像应用 alt 标签?这可能吗?
背景图像不需要这样做。
@Kakupacal – 精灵技术最适合背景(装饰)图像。即使没有背景图像,您的页面也应该能够正常工作并保持可访问性。
对于“内容”图像,最好仍然使用带有 alt 属性的 img 标签。例如,新闻文章中的照片是内容的一部分,应该是一个 img 标签。
Yahoo DevNet 确实认为“CSS 精灵是减少图像请求数量的首选方法”,但他们还有许多其他关于减少 HTTP 请求的建议,以及他们的一般最佳实践列表。
Chris,我真的很感谢您对这篇文章的细致关注!
感谢您整理这些内容。终于有一个不错的静态图像示例了。我想为我们的网站设置这个,但我认为最好先获取所有我想要的图像,这样我就不必在几周后再次经历这个过程。
非常感谢
Chris
IE5/6 中是否有任何已知问题?
我已经在两个区域中使用了精灵,用于一个新网站,规模比我以前更大。
之前我只是为各个导航元素的下拉和悬停状态做了这个。然后将它们放在它们定义的位置。
这次我有一个图形用于 5 个单独的链接,两者都具有下拉和悬停状态。
到目前为止,在所有浏览器中,该网站都运行正常,除了 IE5 和 6。
它在 Y 轴上将整个图像的完整宽度复制了 4 次。然后在第 5 次时,它显示了按钮及其悬停状态,就像它应该的那样。
哈哈,快把我逼疯了。
我不期望任何人解决这个问题,因为它很难解释,但我希望有人在 IE6 中遇到过精灵的一些问题,可以提供一些关于背景重复的信息,或者至少看到这种效果,尽管在声明块上调用了 no-repeat 值。
我还没有完全弄清楚是什么导致了我的问题,但我认为这与将同一个图像应用于我的 UL 中的所有 A 元素,而不是每个 A 元素的单独图像有关。
我必须为 IE 应用 0px 高度到我的导航的 LI 和 A 元素。
奇怪。
这太棒了。我之前使用过这种技术来进行三态导航……一个图像,其位置根据关闭/悬停/活动状态通过 CSS 进行操作。这确实拓宽了视野。在您可能在页面加载时动态加载图像进行轮播的地方,而不是动态图像加载,只需使其成为动态 CSS 定位即可。感谢您指出了此技术的更多可能性!
谢谢,
Jim Summer
Jacksonville Web Design
http://tentonweb.com/
非常有用的提示,此技术有很多可能的实现方式。
我发现自己更喜欢图像的“切片”,我希望更改它不会很难。
实际上 Chuck 说过“所有伟大的技术都需要巨大的奉献”。
Chris,说得很好,
这项技术并不局限于图标。
我开始重新开发我自己的网站,这次它在图形方面非常密集。
我在复杂的背景上使用了精灵技术,对结果感到震惊。
http://websemantics.co.uk/new/
在 Firefox 中,右键单击页面背景,然后查看背景图像。
单击图像以放大到全尺寸,您将看到所有背景渐变垂直堆叠。
还值得注意的是,它是一个压缩的 .png 文件,因此没有图像质量损失。
与之前的尝试相比,页面加载速度(实际速度和感知速度)都令人难以置信。
虽然此技术存在问题且耗时,但绝对值得。
此致
mike
Mike,干得好。使用精灵技术用于不同目的的一个很好的例子。我认为,如果有人非常专注,可以使用一张图像制作整个复杂的布局。
Chris
我实际上正在尝试做完全相同的事情。谢天谢地,它不是一个大图像,但我只使用一个图像在用户单击叠加在图像上的按钮时更改状态。它比我预期的要复杂。
seekingalpha.com 已使用 CSS 精灵构建了其整个网站。
您可以从中学习很多!
这听起来有点像 HTTP 需要大修——这个建议是一种解决方法。
并不是真正的解决方法。HTTP 永远不会“大修”。此技术所做的是简化/优化。
优化与解决方法无关,就像代码重构一样!
感谢您将此比较放在一起,它确实说明了通过一些额外的计划和工作可以实现的尺寸和速度改进。
我一直使用这种技术并且非常喜欢它。我发现的唯一缺点是在使用精灵的 Firefox 中打印页面时,完整图像(所有状态)都被压缩到打印文档上的“蒙版”区域。打印预览看起来不错,但 PDF/打印输出会压缩图像。在 IE 中似乎可以正常打印。
好吧,我认为如果您以百分比形式提供 background-position,它肯定会在 IE-6 中与其他浏览器显示不同。其他浏览器会按预期显示位置。因此在这种情况下,您需要以像素形式提供位置。您认为这是正确的方法吗?或者我在其他地方出错了?请告诉我。
我喜欢使用精灵的想法(特别是对于导航),但是从您制作的 Vid 教程中出现了一个问题,Chris。为了抵消导航文本,您使用了负边距……当用户在他们的浏览器上关闭图像时,您如何解决此负边距问题?是的,我知道对于今天的带宽来说这不是什么大问题,但它仍然让我感到好奇,因为文本将不会显示(例如,如果导航位于网站顶部的横幅上)。感谢您对此给出的任何答案。
@Nodster
除了 text-indent 方法(确实在图像关闭时失败)之外,还有许多方法可以处理此问题。
我只想补充一点,我在我的网络日志的当前设计中使用了 CSS 精灵。由于它是 PNG 文件,我决定为 IE6 和更旧的浏览器删除一些图形,但它对所有其他浏览器都运行良好。
目前,徽标是精灵的一部分,但我将将其剪切并放置一个
img
标签在顶部 div 中,以便它也可以在打印时可见。感谢您的帮助……sprite111
sj
我认为 CSS 精灵是一个有趣的概念,可能非常适合一些应用程序,例如背景和基本的按钮悬停。但是,在原型设计团队将工作移交给开发团队(或移交给客户)的生产环境中,它实际上并不实用。
仅仅是颜色完整性、易于更新、打印问题、不支持 alt 标签等问题,就足以不将其广泛应用于客户的生产站点。
虽然我认为我理解了这一点,但显示您使用的图像将更有帮助!
查看创建 CSS 精灵的视频播客示例(如果您喜欢这种东西)这里
您好,请您帮帮我,CSS 精灵非常有趣,但它们在 Internet Explorer 6 中有效吗?我遇到了一些问题……请帮忙,谢谢。
我经常使用这种方法,但有人知道为什么 IE6 在每次悬停时都会“重新加载”图像吗?
当你将鼠标悬停在链接上时,已经加载的图像会消失,然后每次都会重新加载!
我爱 IE……才怪!
你好,
我用 PHP 创建了一个 CSS 雪碧生成器(CLI 模式)
它能够自动替换背景图像。
如果你感兴趣,可以看看这里
http://tanila.de/smartsprite/index.php
此致
tanila
你好,
感谢你的主题,它帮助我学习了 CSS 雪碧的使用!
这是我遇到的一个奇怪的情况
我在我的网站上使用了大量的 CSS 背景图像(实际上是 66 张图像!)。这些图像中很大一部分用于展示盒子,我可以使用 CSS 雪碧技巧来处理盒子的左上角和左下角,但似乎无法用于右上角、右下角和中间部分(这些部分需要重复)。我是否弄错了,是否有某种方法可以实现这个目标?
如果没有办法使用这个技巧,你有什么建议来减少图像数量吗?
如果您能将任何答案/建议发送到我的邮箱:pashaie-at-gmail-dot-com,我将不胜感激;)
先感谢您
完美!这正是我需要提高性能的东西!
谢谢。
感谢 Chris 的所有教导!!非常宝贵!!我通过你的文章和视频自学了“雪碧导航”,效果很好。不过我遇到两个问题……1.) 通过将文本“移出屏幕”,Firefox 会创建一个非常难看的点状框一直延伸到屏幕外(用于键盘导航)。我学会了“关闭它”(outline: 0;),但是……它……消失了,而且有可访问性障碍的人很难导航……有没有办法只让文本“消失”,但保持其位置?2.) 居中……天啊……我刚刚花了 4 个小时在网上搜索如何居中我的列表……没有结果……我最终用了“hack”方法,给它添加了一个左外边距……有没有办法将这个列表居中?
CSS 雪碧生成器的链接在哪里?
http://spritegen.website-performance.org/
@Lucy 现在大多数浏览器都支持缩放。设计人员应该创建静态字体大小而不是“em”字体大小,这样就不会出现背景图像问题。
@Brent 使用 Tab 键浏览超链接的人应该使用自己的 CSS 或禁用所有 CSS。
我更喜欢折衷的方法,只为同一个按钮创建雪碧。我真的很讨厌完美地对齐雪碧,所以我创建了一个 Photoshop 脚本,它将两张相同大小的图像组合成一个简单的普通/悬停雪碧。它不像你可以在网上创建的 20 张图像雪碧那样天才,但它更简单,你可以在 Photoshop 中为它分配键盘快捷键。我更喜欢这种控制方式,而且你不会遇到“我没有源文件”的问题。
http://www.smjdesign.com/designwell/archives/photoshop-script-combine-two-images-css-hover-css-sprite/
另外,有人知道是否必须重新创建/提交文件到这些在线雪碧生成器,文件是否必须按其文件名顺序排列,以便它们位于相同的位置,并且你不需要更改所有 CSS 规则。这似乎会很麻烦。
非常感谢你提供的脚本!绝对的省时神器!
我想我会努力开始使用它。我唯一的问题是:如果你完成了你的雪碧,一切都很完美,但你忘记了一些东西,一些需要你重做整个工作的东西……然后你需要从头开始,浪费不必要的时间,而这些时间可以用于更重要的事情。
你不需要重做,你只需打开你的雪碧图形,稍微增加其高度或宽度,然后将新的雪碧放在里面并重新保存即可。这肯定比使用单个图像更费事,但也不是世界末日。
不错的文章……我最近一直在使用雪碧,它确实会影响网站的页面加载速度。如果我们为菜单元素及其悬停状态使用单个图像,那么在网站加载过程中,如果我们滚动到菜单元素上,则在图像正确加载之前不会显示任何图像……使用 CSS 雪碧可以避免这个问题。
是的,更快的过渡是一个巨大的好处。
我注意到很久以前 play.com 网站上使用了类似的技术,但我从未尝试过自己尝试。
这是一篇不错的文章,我将在测试用例上试一试,看看效果如何。
好文章 Chris,我是 CSS 雪碧的超级粉丝。看看我为 alittlephotoshop.com 制作的样式表吧
http://bit.ly/4g4Ncr
但是,正如你所说,问题肯定在于工作流程。我最近不得不替换侧边栏标题图像,因为我添加了一个新的。当我在我的笔记本电脑上时,我没有 PSD 文件,所以开始了一些严肃的 Photoshop 技巧操作。这非常麻烦。
此外,当你根据明确的像素位置构建你的样式表时,如果一个图形在你的网站上变得冗余,就像我的搜索框从未被使用过一样。基本上不可能从样式表中删除它,除非重写整个东西以防止文件膨胀。
最终,Spriteme 这个服务真是太棒了!我想这将是我最后一次手动构建雪碧表。相反,只需定期构建整个网站,上传它,运行 Spriteme,最后保存样式表的第二个版本。
对原始文件进行更改并使用 Spriteme 重新构建似乎比一次又一次地修改我的样式表来进行微小更改更优雅。
你确实有一种简化这个过程的好方法。它真的帮助我理解了。正如其他人所说,我认为计划你将在哪里使用它们是最重要的事情。
嘿 Chris,
将雪碧集成到 WordPress CMS 网站的最佳方法是什么,以便 PHP 生成的内容与雪碧配合良好?有什么建议吗……?
-Murph
附言——感谢你所做的出色且富有洞察力的工作。我每天都会从你的某个网站学到新东西。
技术将完全相同;WP 不会做任何魔法。有时唯一的技巧是识别样式是在哪里声明的,如果不是在 stylesheet.css 中。例如,某些插件包含自己的样式表。
Firebug(Firefox)或 Dragonfly(Opera)在这里会很方便。
一旦你确定了 CSS 的位置,你将同时识别图像的来源。如果它们是单独的图像,你只需要在你的图像编辑器中打开它们并将它们复制/粘贴到你的新雪碧文件中并计算偏移量。
Greg
谢谢,Greg。我想我会在我的下一个设计中尝试一下这个雪碧功能!
这是我最喜欢的 CSS 功能之一。我设法将我的模板减少到只有 3 张图像,因为总是有所有这些脚本和其他文件导致我的网站变慢。
有些人说管理雪碧很难,但我认为恰恰相反,特别是对于悬停效果。将所有这些图像放在一个文件中使组织和查找它们以供以后编辑变得更容易。假设我在标题中寻找某些东西,那么如果我们有一个“header.png”文件,那么你就可以在里面找到你的导航和其他所有内容,就像你在服务器上有一个文件夹/目录一样。
我反对 SpriteMe 这样的服务,因为它更像是一种静态解决方案。如果你不断编辑你的图像或发现自己经常更改网站的设计,则需要再次创建所有文件的雪碧,甚至可能只需要更改一个小的更改就需要修改 CSS。
哦,对于那些认为即使从速度方面考虑也不值得的人,以我的标题雪碧为例。如果所有这些都是单个图像,那么我的网站加载将需要很长时间。我编辑它也没有问题,所以这是一个个人问题。
http://cdn.myunv.com/img/resource/sitewide/assets.sprite.png
抱歉重复发帖:(
http://www.jaredhirsch.com/coolrunnings/public_images/2593af8d3b/spriteme1.png
不错的总结 Chris!我对雪碧并不陌生,但我喜欢你提到了它们不能做什么(重复图像)并展示了一些知名网站的示例。
我发现Mint在其图标集中有一些大型图像雪碧。
只要它们只在一个方向上重复(repeat-x 或 repeat-y),你就可以使用重复图形。
如果该雪碧中还有其他图像大于你的渐变,你只需将其拉伸以填充整个宽度或高度。
帖子不错,我一直在导航和按钮中使用精灵图有一段时间了。我一直犹豫是否使用更大的精灵图,在一个文件中包含很多图形,因为我担心它会降低页面渲染速度。即使你“看不到”精灵图像的其余部分,你也可以在页面上到处使用一堆 1000px x 1000px 的精灵图文件。是否有任何研究表明这会影响渲染性能?我只是杞人忧天吗?
关于 CSS 精灵图的精彩文章,我发现这些技巧对 CSS 新手非常有用!
一如既往地写得妙极了。
我了解精灵图已经有一段时间了,但从未真正有动力或理由开始使用它们。我对它们持怀疑态度的部分原因来自文件管理和前面提到的可编辑性(这个词存在吗?!)的影响。 “[打开] 你的精灵图,使其稍高或稍宽,并将新的精灵图放入其中并重新保存”的想法让我的过于吹毛求疵的组织调整露出了它的真面目。
此外,作为一名经常处理预先编写的 Joomla 插件等工作的人,无法检查某个元素、查看其背景图像、创建一个新的(可能是完全不同大小的)图像、上传和替换,而是要筛选 PNG 图像并用新的精灵图将其膨胀,这似乎有点不切实际。显然,这在大型讨论中只是一个小问题,但对于开源开发者来说绝对是不可取的……
更新和重新发布这篇文章的想法很棒。
天啊,我开始迷上 CSS-TRICKS.com 了。我担心 CSS 和其他类似精灵图的东西会非常高级且难以理解,但你解释的方式消除了我的恐惧,我完全可以理解。
看看 Mashable.com,他们有一个非常漂亮的 CSS 精灵图。
Mashable 精灵图
很棒的文章。我自己也使用 web developer 工具栏来检查其他网站使用的图像,我见过很多次这种情况。我猜它与定位单个图像有关。在阅读这篇文章之前,我从未如此清晰地理解过这个概念。我一定会将它应用到我的博客设计中。
好文章。喜欢这个书签小程序,非常酷。
就我个人而言,我不想将所有背景图像都做成精灵图,因为这会使网站维护变得很麻烦。尤其是在你可能想要更改元素大小以及背景图像大小的情况下——然后你必须重建你的精灵图像,并逐一修复许多元素上的定位。这让我想到我在一个使用此技术的网站上使用的解决方法,只需给每个项目留出足够的空间,以便调整任何给定元素的大小都不需要影响其他元素。(ask.com 的精灵图在很大程度上就是这样设置的)。
我发现没有提到的一件事(可能是因为每个人都知道它)。那就是对于悬停元素,这是一种必须使用的技术。如果不使用某种形式的精灵图技术来实现悬停效果,用户第一次将鼠标悬停在元素上时,悬停效果往往无法正常工作。除非你预加载图形,否则悬停图像出现之前会有一段延迟。当用户去使用你的导航系统时,他们不会等待你的半加载导航系统完成加载。
哦,是的,我没有阅读所有评论(只读了大约一半),但有人提到了 Fireworks 的 PNG8 格式及其 4 位透明度,你要求提供更多关于此的信息,但回复内容不够详细。
我更喜欢使用 Fireworks PNG8 来创建透明图像,因为它们几乎可以在所有浏览器中工作,虽然你不会在 IE6 中获得 Alpha 透明度,但至少它们的降级效果很好。
我在 Photoshop 中创建我的图像,并确保任何半透明元素都是真正的半透明。这意味着我确保阴影没有任何部分超过 100%,并且我确保具有抗锯齿效果的元素首先具有清晰的非抗锯齿版本,并且抗锯齿效果是分开的,没有任何部分是不透明的。我通过将元素分解成图层,然后将阴影/抗锯齿/其他半透明效果图层的透明度设置为 98% 来做到这一点。这样我就能确切地知道 IE6 中哪些部分会消失。然后,我在 Fireworks 中打开 Photoshop 文件并将其导出为具有 Alpha 透明度的 PNG8。我尝试过使用其他一些 PNG 工具将 PNG24 转换为这种格式,但结果往往非常不可预测且无法控制。Fireworks 是唯一可以以精确方式执行此操作的工具。
使用这种类型的 PNG8,IE6 会将小于 100% 的任何像素显示为 0%,因此它基本上会显示为具有 1 位透明度的常规 PNG8。因此,所有阴影/抗锯齿/等在 IE6 中都会消失。因此,你会得到一些没有阴影等的锯齿状图像。但至少你不会看到大的灰色框,也不需要使用任何 PNG 透明度修复。我尝试过许多 PNG 透明度修复(也许所有修复),但通常我发现它们都有问题和/或不可靠,这意味着它在 IE6 中看起来可能运行良好,但随后我在朋友的电脑上使用 IE6 查看它,由于某种原因,它完全损坏了一半。我更喜欢避免使用 JS 来设置样式/外观,只将其用于功能。因此,即使没有 Java,你也可以正常查看网站,但如果你想使用某些功能,可能需要使用 JS。
至于在 IE6 中看起来有点锯齿状……就我个人而言,只要布局没有损坏,并且没有到处都是大的灰色框,我就不在乎。
不过,需要提醒的是:这种技术最适合精通 Photoshop 并且对基于光栅的图形有深入了解的人使用,因为如果没有刻意且精确地控制图形中的透明度级别,结果可能会非常不可预测且难看。
建议:我曾在 90 年代为 Doom/Doom2 和 Marathon 游戏的模型修改工作,这些游戏只支持 1 位透明度。Win95/98 的图标也只能具有 1 位透明度。如果你仔细观察并手动调整边缘像素,可以创建外观相当清晰的边缘,并最大程度地减少 1 位透明度图形的锯齿状外观。但我还没有看到任何可以自动完成此工作的应用程序。如果你在 Photoshop 中导入 Illustrator 文件并在导入选项中关闭抗锯齿,你会得到一个非常难看的锯齿状图像,但如果你花一两个小时调整边缘像素,可以使其看起来相当清晰。当然,半透明或特定背景颜色的抗锯齿效果会看起来更清晰,但通过以一种精心控制的方式将所有这些结合起来,我们可以使用半透明 PNG,使其在 IE6(我认为甚至 5.5)中降级效果非常好,而无需使用 JavaScript 修复或 AlphaLoader(速度非常慢)。
大多数 PNG 修复程序的问题在于,它们大多依赖于 JS 和 AlphaLoader 或旧的 VRML 功能,所有这些都会增加客户端系统的负担。当然,在我现在使用的这个系统上没什么大不了的,但是我用来测试 IE6 的那台破旧的旧电脑会被这些修复程序拖慢到无法忍受的程度,我使用那台破旧的系统来测试 IE6 的原因是我认为它代表了大多数使用 IE6 的人可能拥有的系统类型。
你可以找到其他关于使用具有 4 位 Alpha 透明度的 PNG8 的教程,以及可以将 PNG24 转换为这种格式的其他一些工具,但这些教程没有介绍你将遇到的各种怪癖。要获得真正好的结果,不仅仅是转换图形那么简单,但如果你仔细考虑一下,进行一些实验,并使用 Fireworks 而不是其他转换工具之一,你可以通过这种方式获得极好的效果。而且文件比 PNG24 小得多。不过,由于颜色调色板有限,并且 4 位 Alpha 会进一步减少颜色调色板,因此某些图形无法以这种方式显示出良好的效果,例如大型渐变区域。
我太喜欢查克·诺里斯的名言了——写得好!
我是 CSS 新手,所以请耐心等待。
我可以通过将背景图像放在类定义中来使其正确加载,如下所示
.item-video {
background-image: url(‘images/video-nav.gif’);
}
… 但前提是我将该类应用于 li 元素。如果我将该类应用于锚元素,则 gif 不会显示。当我将类应用于 li 元素时,gif 显示出来,但锚元素中的 href 链接无法工作。
我认为这是因为 li 和 a HTML 元素实际上没有任何内容……只是一个背景图形,所以我很迷茫。在 Chris 上面的“之后”示例中,他似乎在锚元素中包含了 Item 1、Item 2、Item 3 等文本元素,但是什么在浏览器中创建了围绕文本和背景元素的实际框,使其“可见”为链接呢?
任何帮助将不胜感激。
精灵图很酷,但我希望能够更多地控制如何创建它们,我尝试了一个名为 Tonttu 的 Air 应用程序,但我无法从中导出任何内容,如果可以导出,那就完美了。
有没有人成功使用过它,或者我应该放弃它?
Tonttu 实际上工作得非常好。不过,我认为 Spriteme 更多地考虑了你的 CSS,使其成为两者中更好的选择。
嗨,Zander,
立即尝试 spriteme.org,它非常好。
很棒的帖子!我想知道这样做是否更快,结果发现,它确实更好更快!感谢你的建议!
是啊,我以前总是想知道它们是如何工作的。作者的解释非常好。如果我们能够简单地将单个图像拆分为各种对象,那么它确实很好且很快。
此致
我认为这是一个好主意,但我有时还没有尝试过!
我从未想过引用Chuck会如此深刻。
很棒的文章……以及优化网站的好方法。
好文章!如果您认为所有图像都将放在一个精灵图中,并且精灵图图像会很大(宽度 x 高度),并且用于大约 50 个元素,这对某些浏览器来说会不会很慢?
谢谢。
我听说过,甚至尝试在我的网站上使用精灵图,但我从未想过它可以如此全局地实现。感谢这篇文章。收藏了 :)
我不知道是否有人已经发布了此建议,但如果按钮分成 3 层是否会更快加载网站:普通背景、悬停背景和按钮图像。您只需加载一次普通 bcg 和悬停 bcg(2 个 HTTP 请求),然后加载按钮图像(5 个 HTTP 请求)。这提供了 7 个 HTTP 请求,并且图像的大小应该非常小。
您对此想法有何看法?
好主意,感谢您撰写这篇文章。
我刚刚从 welovecss.com 的朋友那里了解到精灵图。我想使用除 javascript 之外的其他东西,尽管这有点超出我的能力,但这很好,我喜欢它!
感谢您撰写这篇非常有益的文章。
我一直都在查看 Facebook 和 Google 的表情符号(我第一次在那里看到)。我当时在想他们是怎么做到的。:o 非常简单。:p
这是一篇很棒且有用的文章。感谢与我们分享。
一切顺利。
我为 Mac 创建了一个名为 Sprite Master Web 的应用程序,以帮助开发人员自动创建精灵图和 CSS 代码。
您可以在 mobinodo.com/spritemasterweb 上找到它
嗨,Chris,我终于明白了 CSS 精灵图的确切含义。谢谢!
很棒的改进文章!
我刚刚接手了一个广泛使用精灵图的项目。以下工具有助于减轻更新某些图标(即使在大小方面)的痛苦
http://www.spritecow.com
另一种方法是只创建 textNodes 或空元素,而不是创建透明图像。这样,您只需使用一张图像,即精灵图。
我更喜欢使用这种方法而不是 textnodes,更容易
有没有办法使用 SVG 来做到这一点?
http://www.smashingmagazine.com/2014/03/05/rethinking-responsive-svg/
非常有用的文章。
我正在寻找类似的东西,但我也想将背景图像定位在 UL LI 的右侧中心。图像的宽度和高度与我用作背景(图标)的 UL LI 不相同。
因此我需要使用:background-position: right center; 但然后我无法使用它来定位精灵图,它会显示整个精灵图图像。
精彩的帖子!我们正在对大型目录使用精灵图,它们工作得非常好。最重要的是它大大减少了对服务器的调用——对于台式机或移动设备——它只需立即显示加载时间的提高。但这当然是在您优化整个精灵图图像的情况下。除此之外,精灵图是 css 最伟大的发明——在我看来,;)
我迫不及待地想要 SVG 能够得到广泛支持并针对 Web 性能进行优化。CSS 精灵图在消除 HTTP 请求方面走了很长一段路,但如今我们需要在响应式网站和具有更高像素密度(视网膜)的设备上以多种尺寸显示我们的图标。因此,矢量是进化的下一个合乎逻辑的步骤。
我正在处理的网站最近一直在遭受加载缓慢的问题,这主要归因于我的代码和图像没有得到尽可能的优化 :)
我添加了一个需要相当多图像的页面,但希望确保加载速度不受过度影响。之前读过关于精灵图的信息,碰巧快速搜索就让我来到了这里。哇!让我大开眼界。我已经在这里 PIL Leaflets 实施了这项技术,它运行得非常好。
一个细微的调整是我想要一个通用背景,我已经通过 css 添加到包含的 div 中,精灵图应用于自身覆盖此背景的 img。这将主要精灵图保持在最小尺寸。与我以前的工作方法相比,我认为它节省了 4-6 秒的加载时间。我相信通过一些调整,它可以进一步减少。
而且把它组合在一起也相当有趣!感谢这篇文章,它帮助很大 :)