我应该对伪元素使用单冒号还是双冒号?

jin*_*ula 107 css css-selectors internet-explorer-8 internet-explorer-7 pseudo-element

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

.foo:after,
.foo::after { /*styles*/ }
Run Code Online (Sandbox Code Playgroud)

如果我关心IE8用户(可怜的亲戚),单独使用双重似乎很愚蠢.

use*_*621 69

千万不能同时使用用逗号组合.符合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*/ }
Run Code Online (Sandbox Code Playgroud)

另一方面,这比必要的更冗长; 现在,你可以坚持使用单结肠符号.

  • 感谢您在逗号和忽略上包含信息.这可能会让我(也许还有其他人)搔头一会儿.看起来最好的事情当99%的浏览器使用支持双冒号表示法时转移到使用它并且(因为没有人会放弃单个冒号支持并打破网络,所以以后找不到/甚至没有一点在那时替换旧代码). (7认同)
  • 这不是前进的方向.如果人们停止迎合antediluvian,破坏和弃用的浏览器,浏览器进度将被强制加速. (2认同)
  • @Gershom Maes:不幸的是,那不是你要说的.我认为很大一部分开发人员也希望如此,但这不会发生. (2认同)

Fel*_*Als 62

来自CSS3选择器REC:

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

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


Jos*_*rns 21

对于考虑使用一个冒号"安全",我绝对不同意@mddw和@FelipeAls.

这个"我会使用它,即使它被弃用"的心态正是为什么基于浏览器的技术在推进和前进方面如此缓慢的原因.

是的,我们希望保持与旧标准的兼容性.让我们面对现实,这是我们处理过的手.但是,这并不意味着你有借口在你的开发中懒惰,忽略了当前的标准而不赞成被弃用的标准.

目标应该是保持对当前标准的遵守,同时尽可能多地支持传统标准.

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

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

.foo:after {
  /* styles */
}
.foo::after {
  /* same styles as above. */
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你对我的回答"*绝对不同意",那么你在W3C推荐中绝对不同意*must*这个词."*目标应该是保持对现有标准的遵守,同时尽可能多地支持传统标准.*"是REC的这一部分正在解决的问题,它明确指出UA不得强迫作者使用两种符号都解释了这些UA必须如何完成.如果您对此不感兴趣,请随时联系CSS WG邮件列表(或在此工作组的Twitter @glazou联合主席上) (9认同)
  • @JoshuaBurns如果我的前任重复了大量代码以防止虚构的未来威胁,我会感到更加"搞砸". (8认同)
  • 我并不反对你的整个答案,只是将单个结肠用作"安全".**新的伪元素不允许兼容**意味着任何未来的伪元素只能在`::`中实现.根据你的方法,个人将开始混合使用`:`和`::`作为伪元素.明确地遵守旧标准(暂时可能支持)是一种固有的不良做法,应该在合理可能的情况下予以避免.如果您不同意该陈述,我们只是持有不同的观点. (4认同)
  • 如果兼容性是目标,那么坚持*明确兼容的*标准本身就不是*不好的做法.另一方面,使用两者都会导致重复的样式 - 并且正如编码了一段时间的人所知道的那样,重复的代码只是喜欢分歧. (4认同)
  • 我认为可以非常安全地假设浏览器供应商将继续无限期地支持旧的表示法,因为实际上永远不会更新他们希望浏览器"正确"呈现的代码量.另一方面,我认为保持风格的单独副本会引起DRY红旗.在IE7市场份额下降之前,我认为使用单结肠符号更加务实而不是懒惰.也就是说,我希望网络能像任何人一样前进! (3认同)
  • 如果你真的想要使用这两种符号,你可以将所有规则与旧的符号一起放入为IE8保留的单独样式表中,以及带有条件注释的旧样式表,因为这些是在此时仍然相关的唯一浏览器/版本写作支持旧的符号而不支持新的符号.从一个实用的立场来看,将两个符号包含在同一个样式表中是完全没有意义的,除非你是一个带有PE或GD的向导或任何带有CSS的向导,并且可以找到一种方法来使遗留的伪元素相关,即使CSS3功能是不支持. (2认同)