您知道 CSS 精灵 吗? 当您知道要应用它们的元素的高度和宽度时,它们非常有用,因为您可以创建一个非常紧凑的精灵图像并使用非常精确的坐标来精确地显示您想要的位。
当您知道元素的宽度或高度时,精灵也非常有用。 在这种情况下,您将所有精灵在已知方向上对齐。 假设您知道宽度 - 您可以通过其 X 坐标和宽度引用它们,但不必担心未知/可变高度意外显示其他图像。
当您想在无法知道宽度或高度的元素上使用精灵时,精灵就会“失败”。 考虑一个段落 (<p></p>
) 元素。 您可能有一个流体布局,因此您无法依赖宽度1,并且段落可以包含任意数量的词语,因此您无法依赖高度。 但您仍然希望能够在上面使用精灵中的图像。
在这种情况下,您需要的是一个元素,您可以在该元素内对段落强制执行宽度/高度/两者以将精灵应用到该元素。 你可能会想
<p>
<span class="star"></span>
Lorem ipsum...
</p>
然后我们可以使用 span 来应用星号。
.star {
/* Size of star within sprite */
width: 24px;
height: 24px;
/* Sprite */
background: url(sprite.png) -24px 0 no-repeat;
/* Position/Spacing */
float: left;
margin: 0 10px 2px 0;
}
但是我们试图应用的这个星号纯粹是美观的,因此最好避免为此专门使用标记。 让我们放弃它并使用伪元素! 当您需要一个元素在页面上工作但又不想添加额外的标记时,伪元素是 完美的答案。
让我们将类名放在段落上(可能更具语义)
<p class="star">
Lorem ipsum...
</p>
并使用 CSS 伪元素 (:before) 添加一个具有已知宽度和高度的元素,以便在其中应用图像
.star:before {
/* Empty content, but required for pseudo element to display */
content: "";
/* Size of star within sprite */
width: 24px;
height: 24px;
/* Sprite */
background: url(sprite.png) -24px 0 no-repeat;
/* Position/Spacing */
float: left;
margin: 0 10px 2px 0;
}
还有其他方法吗?
处理未知高度/宽度情况的另一种可能方法是将精灵对角排列(我第一次从 Aaron Barker 那里看到了这种技术)。 这样,您就可以在父元素具有未知宽度和高度的情况下切出一个单独的精灵。
这很聪明,但它有一些相当显著的缺点
- 精灵的尺寸(以及可能的文件大小)保证大于单行中的精灵,或者更好的是,压缩成一个紧凑的正方形。
- 上面显示的对角线如果要将图像定位在左上角或右下角将起作用,但不能定位在右上角或左下角(或任何其他地方)。
伪元素方法没有这些缺点。
相关
伟大的思想家思维一致。 Rick Harris 有一篇类似的文章:Sprites 和 CSS 伪元素。
1 即使您可以依赖段落的宽度,将精灵的间距设为段落宽度也不切实际,并且违背了精灵的核心理念:效率。
很棒的文章。 准确地阐明了我最近越来越多地发现自己所做的事情。 伪元素有什么做不到的吗?
在 IE<8 中工作
通过 Webkit 中的 CSS 过渡进行动画处理。
太棒了,谢谢!
如果您需要使用精灵作为右上角或左下角,那么您只需将图标放置在另一个对角线上(从左上角到右下角)。
很好地利用了伪元素……如果有人有兴趣阻止文本换行,可以进行一些修改/添加!
我一直使用对角线精灵来实现这个目的。 如果您对不是图像设置大小的元素进行精灵化(例如 s),您必须考虑内容以意外的方式换行或扩展。
当我看到我的静态模板被拉入具有 CMS 的暂存站点,而这些站点具有客户内容,这会暴露传统精灵的局限性时,我想出了这种技术。 在您遇到它之前,您通常不会意识到对更好的精灵的需求。
嘿,贝恩顿! 世界真小……
嗯,应该是“(例如 li’s)”
https://css-tricks.cn/9189-browser-support-pseudo-elements/
亲爱的圣诞老人。 我今年圣诞节想要无限的伪元素。 谢谢。
在那里很好地使用,为这场战斗而战,保持标记的简洁。
这是一个非常棒的想法,感谢你的这篇!
对角线精灵在某些情况下也很酷。
一个非常棒的例子。
要记住的一点是——不要对对角线精灵中的图标数量过分执着。 所有精灵图像都存在内存问题,因为浪费了空白空间,但在对角线精灵中,它被平方了。
在示例中,图标为 24×24,因此生成的(未压缩的)精灵将为 24*24*n*n px。 假设每个 px 为 4 字节(RGBa - 虽然我没有自己进行测试 [1])20 个图标可能需要您近 1 Mb 的 RAM。 40 个图标将花费您近 4 Mb 的 RAM。 再添加 10 个图标,您可能会有效地杀死 iPhone 的 Safari [2]
注意:我不反对使用精灵。 我只是说不要对对角线精灵过分执着;)
[1] http://blog.vlad1.com/2009/06/22/to-sprite-or-not-to-sprite/
[2] http://cubiq.org/testing-memory-usage-on-mobile-safari
是的,我发现这种技术如果不想或不需要使用空
span
元素会非常方便。 我将这种技术包含在关于 CSS 背景图像技巧的文章中——http://nicolasgallagher.com/css-background-image-hacks/克里斯没有为这种技术给你署名真是太逊了。
是的,尼古拉绝对是第一个。 我真的没有看到(或者至少不记得是否看到)他的文章包含这种技术。 嘿,至少我以一种不同且原创的方式写了它,并且对这种超级有用的技术有了更多的了解。
是的,我经常使用这种技术。 尤其适用于非关键的美学装饰,如果它们没有出现在不支持伪元素的旧浏览器中,也不会破坏或禁用布局。
不过要说明一点。 如果您使用的是使用 ::after 元素和 visibility:none 的 clearfix 方法,您可能需要覆盖该 visibility 声明,否则您将根本看不到该元素。 那个问题几个月前差点让我发疯!
我写了一篇关于类似内容的文章,并为 Internet Explorer 提供了一个技巧
http://coding.smashingmagazine.com/2011/03/19/styling-elements-with-glyphs-sprites-and-pseudo-elements/
每次使用这种效果时调用 background: url 会影响性能吗?
我认为精灵最好的部分是您只需要调用它一次,并在其余部分使用 background-position?
感谢您对此分享任何智慧。
此技术的优势之一是应用于 RTL 语言的样式表。在 RTL 样式表上,实现雪碧图几乎不可能,或者非常困难。使用伪元素可以非常轻松地实现。
感谢 Chris!
我刚刚在 30 分钟内学习了 CSS 雪碧图方法和伪雪碧图方法。我无法相信我一直忽略了学习它们,特别是 CSS 雪碧图…… 我一定会开始使用它们。
Charbs
有趣……我一直都这么做,认为这只是常识。
有趣的文章。现在,雪碧图还是数据 URI…… 决策,决策 :-)
足够大的改进,可以为不支持 IE7 或需要为其提供 polyfill 的情况提供正当理由!
我们还可以使用 CSS Clip 属性来精确地定位雪碧图中所需的图像。
clip: { shape | auto | inherit } ;
好文章:http://www.ibloomstudios.com/articles/misunderstood_css_clip/
哇!非常有用!这就是我一直面临的 span 语法问题,关于如何定位项目符号或图标与文本框文本的对齐方式,你帮我解决了这个问题,因为有了这个漂亮的技巧,非常感谢。
今年最好的文章!
我喜欢这个?确实非常棒。只是想起我过去创建的大量雪碧图,在上述情况下使用雪碧图的唯一方法是将它放在左上角并使用非常大的负位置背景。
巧妙地利用了伪元素,非常喜欢它!
昨天我第一次使用了雪碧图,并在 Smashing Network 上找到了这篇文章。
很高兴我找到了这篇文章,因为我不喜欢使用额外的无意义 span :)
性能和语义,算我一个!!!;)
我们之前改变了所有雪碧图…… 这有助于提高页面速度。
更适合程序员而不是设计师!
如果有一个像“no-repeat”这样的“background”修饰符来弥补这种限制并避免使用这种技巧,那将很有趣。
示例
background: url(sprite.png) -24px 0 no-repeat crop;
裁剪区域周围的所有区域都可以填充“background-color”。
很棒的教程,做得很好,谢谢
很棒的工作。正在寻找其他 CSS 教程。感谢分享。
我在雪碧图方面遇到了一些问题,真的无法理解某些事情。我看到的教程内容丰富,我知道雪碧图的背景,为什么它们有益等等。但我仍然对一些事情感到困惑,但主要的是:雪碧图如何替换现有的菜单?我看到的教程都创建了新的菜单,位于页面的顶部和左侧(或右侧)。我没有看到任何教程调整现有网站,用新的雪碧图导航菜单替换当前导航菜单。
非常感谢任何帮助。你们所有人都在从经验丰富的角度说话,对你们来说,这简直是小菜一碟,但对于像我这样新手、充满热情和雄心勃勃的设计师来说,你能否指点我一个对新手友好的方向。非常感谢!
我忘记提了,我几乎总是使用 WP。这与他们提供的基本布局(或任何布局)如何协同工作?使用 WP 创建雪碧图导航菜单与使用 DW 或类似软件有什么不同吗?
这是一个很棒的技术。我喜欢它的工作方式,它使使用雪碧图变得更加简单。