只是一些最初和后来的想法。我可能还想再补充一些。
填充/背景
好处):
- 适用于 IE6-7(即旧版浏览器)。
- 如果想要将图标与文本重叠,特别是如果 centered,这将更容易实现。
缺点:
- 实施需要更多的思考(必须计算一些因素)。
- 对于较旧的浏览器,仅支持一种背景,因此如果需要另一种背景,则需要解决冲突。
- 如果浏览器设置为不打印背景图像,则打印文本中仍将存在填充的“间隙”,但不会存在图像。这可以通过印刷媒体 css 解决。
伪元素
好处):
- 更容易实现(无需计算)。
- 如果需要,它可以有自己的
padding
, border
,opacity
等应用,就好像它是一个真实的元素一样。
- 与 #2 相关,如果需要或需要,它实际上可以移动到元素之外。
- 从语义上讲,它正在以更合适的方式实施。图标并不是真正的“背景”,但它也不是内容
img
可能是 html 的重要组成部分,因此伪元素适合增强演示文稿的功能,但如果丢失也不会引起问题(在较旧的浏览器)。
- 在 CSS3 浏览器(可能还有 CSS2)中,通常可以使用更少的代码在右对齐或左对齐图标之间切换(参见下面的“关于代码长度的讨论”)。
缺点:
- 每个元素只允许一个(每种类型),所以如果元素上的其他东西需要它,那么你可能会发生冲突。
- 旧浏览器不支持。
- 某些元素(替换元素)不能采用伪元素,因此这甚至不是一个选项。
关于代码长度的讨论
EHLOVader在对该问题的评论中指出,他的部分担忧是伪元素可能需要额外的编码,而不是如果想要切换到左侧图标的背景/填充。他给出了这个 codepen 的例子。但是,可以用更少的代码来做一个伪元素。假设.iconleft
是一个用于将图标放在左边而不是右边.iconit
的类,以及完全设置图标的类,那么下面的代码简洁地使得使用选择器的 CSS3 浏览器:not()
发生这种情况(这里是小提琴,使用的原始.pseudo
类OP用于图标):
.iconit:not(.iconleft):after,
.iconit.iconleft:before {
content: url('http://www.jasonapollovoss.com/web/wp-content/uploads/2010/09/pdf_icon_small.png');
vertical-align: sub;
}
如果一个类用于显式地将图标设置在右侧或左侧(那时不需要类) ,CSS2 浏览器也可以这样做:iconright
iconleft
iconit
.iconright:after,
.iconleft:before {
content: url('http://www.jasonapollovoss.com/web/wp-content/uploads/2010/09/pdf_icon_small.png');
vertical-align: sub;
}