由于 IE7 和 IE8 不支持伪元素的双冒号表示法(例如::after
or ::first-letter
),并且由于现代浏览器支持单冒号表示法(例如:after
)以实现向后兼容性,我应该只使用单冒号表示法吗? IE8 的市场份额下降到可以忽略不计的水平返回并在我的代码库中查找/替换?或者我应该包括两者:
.foo:after,
.foo::after { /*styles*/ }
如果我关心 IE8 用户(可怜的亲爱的),单独使用 double 似乎很愚蠢。
由于 IE7 和 IE8 不支持伪元素的双冒号表示法(例如::after
or ::first-letter
),并且由于现代浏览器支持单冒号表示法(例如:after
)以实现向后兼容性,我应该只使用单冒号表示法吗? IE8 的市场份额下降到可以忽略不计的水平返回并在我的代码库中查找/替换?或者我应该包括两者:
.foo:after,
.foo::after { /*styles*/ }
如果我关心 IE8 用户(可怜的亲爱的),单独使用 double 似乎很愚蠢。
不要将两者与逗号结合使用。符合 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*/ }
另一方面,这比必要的更冗长。现在,您可以坚持使用一个冒号表示法。
这个 :: 符号是由当前文档引入的,以便在伪类和伪元素之间建立区分。
为了与现有样式表兼容,用户代理还必须接受之前在 CSS 级别 1 和 2 中引入的伪元素的单冒号表示法(即 :first-line、:first-letter、:before 和 :after)。本规范中引入的新伪元素不允许
这种兼容性。
似乎你对 CSS2.1 中已经存在的伪元素使用(仅)一个冒号表示法是安全的,因为 UA 必须向后兼容。
关于考虑使用一个冒号“安全”,我绝对不同意@mddw 和@FelipeAls。
这种“即使它已被弃用,我也会使用它”的心态正是基于浏览器的技术在进步和进步方面如此缓慢的原因。
是的,我们希望保持与旧标准的兼容性。让我们面对现实吧,这是我们被处理的那手牌。但是,这并不意味着您可以通过忽略当前标准来支持已弃用的标准,从而在开发中偷懒。
最终目标应该是保持与当前标准的合规性,同时尽可能多地支持旧标准。
:
如果在 CSS2 和CSS3 中使用伪元素::
,我们不应该使用其中一个;我们应该同时使用两者。
为了完全回答最初提出的问题,以下是支持最新 CSS 实现(版本 3)的最合适方法,同时保留对版本 2 的旧支持。
.foo:after {
/* styles */
}
.foo::after {
/* same styles as above. */
}
然而,为新的 javascript 和 CSS 使用polyfill变得越来越流行,因此您可能只想坚持使用较新的双冒号 ( ::
) 语法,并为旧浏览器维护一个 polyfill,只要这是必要的。
根据浏览器统计数据,IE 8.0 在美国的价值在过去一年中下降到不到 1%。
2015 年 12 月,IE 8.0 占据了2.92%的市场份额。2016 年 12 月,IE 8.0 的市场份额为0.77%。
以这样的下降速度停止支持旧版本的 IE 并开始使用 :: 表示伪元素并不是最糟糕的主意。
包括这两种表示法当然更安全,但我看不到任何浏览器长时间放弃单一表示法,所以只有一个就可以了(它是有效的 CSS2。)
个人而言,我只使用单冒号表示法,主要是出于习惯。