115

由于 IE7 和 IE8 不支持伪元素的双冒号表示法(例如::afteror ::first-letter),并且由于现代浏览器支持单冒号表示法(例如:after)以实现向后兼容性,我应该只使用单冒号表示法吗? IE8 的市场份额下降到可以忽略不计的水平返回并在我的代码库中查找/替换?或者我应该包括两者:

.foo:after,
.foo::after { /*styles*/ }

如果我关心 IE8 用户(可怜的亲爱的),单独使用 double 似乎很愚蠢。

4

6 回答 6

73

不要两者与逗号结合使用。符合 CSS 2.1(不支持 CSS3)的用户代理将忽略整个规则:

当用户代理无法解析选择器(即,它不是有效的 CSS 2.1)时,它也必须忽略选择器和以下声明块(如果有)。

CSS 2.1 为选择器中的逗号 (,) 赋予了特殊含义。但是,由于不知道逗号在未来的 CSS 更新中是否会获得其他含义,因此如果选择器中的任何地方出现错误,则应该忽略整个语句,即使选择器的其余部分在 CSS 2.1 中看起来很合理。

http://www.w3.org/TR/CSS2/syndata.html#rule-sets

但是,您可以使用

.foo:after { /*styles*/ }
.foo::after { /*styles*/ }

另一方面,这比必要的更冗长。现在,您可以坚持使用一个冒号表示法。

于 2012-04-16T21:25:06.983 回答
63

CSS3 选择器 REC

这个 :: 符号是由当前文档引入的,以便在伪类和伪元素之间建立区分。
为了与现有样式表兼容,用户代理还必须接受之前在 CSS 级别 1 和 2 中引入的伪元素的单冒号表示法(即 :first-line、:first-letter、:before 和 :after)。本规范中引入的新伪元素不允许
这种兼容性。

似乎你对 CSS2.1 中已经存在的伪元素使用(仅)一个冒号表示法是安全的,因为 UA 必须向后兼容。

于 2012-04-16T21:17:48.127 回答
23

关于考虑使用一个冒号“安全”,我绝对不同意@mddw 和@FelipeAls。

这种“即使它已被弃用,我也会使用它”的心态正是基于浏览器的技术在进步和进步方面如此缓慢的原因。

是的,我们希望保持与旧标准的兼容性。让我们面对现实吧,这是我们被处理的那手牌。但是,这并不意味着您可以通过忽略当前标准来支持已弃用的标准,从而在开发中偷懒。

最终目标应该是保持与当前标准的合规性,同时尽可能多地支持旧标准。

:如果在 CSS2 和CSS3 中使用伪元素::,我们不应该使用其中一个;我们应该同时使用两者

为了完全回答最初提出的问题,以下是支持最新 CSS 实现(版本 3)的最合适方法,同时保留对版本 2 的旧支持。

.foo:after {
  /* styles */
}
.foo::after {
  /* same styles as above. */
}
于 2013-11-19T21:35:24.557 回答
2

然而,为新的 javascript 和 CSS 使用polyfill变得越来越流行,因此您可能只想坚持使用较新的双冒号 ( ::) 语法,并为旧浏览器维护一个 polyfill,只要这是必要的。

于 2016-06-16T03:01:43.890 回答
1

根据浏览器统计数据,IE 8.0 在美国的价值在过去一年中下降到不到 1%。

http://gs.statcounter.com/browser-version-partially-combined-market-share/desktop/united-states-of-america/#monthly-201512-201612

2015 年 12 月,IE 8.0 占据了2.92%的市场份额。2016 年 12 月,IE 8.0 的市场份额为0.77%

以这样的下降速度停止支持旧版本的 IE 并开始使用 :: 表示伪元素并不是最糟糕的主意。

于 2017-01-26T16:12:44.167 回答
0

包括这两种表示法当然更安全,但我看不到任何浏览器长时间放弃单一表示法,所以只有一个就可以了(它是有效的 CSS2。)

个人而言,我只使用单冒号表示法,主要是出于习惯。

于 2012-04-16T21:08:16.460 回答