CSS伪类可以命名空间吗?

4

在CSS中使用命名空间时,您可以使用命名空间类型选择器选择“任何或无命名空间”中的任何div元素:

*|div

在CSS中,为伪类添加命名空间是否有效?例如:

*|:first-child

似乎在基于WebKit的浏览器中可以工作,但在IE9(以下版本根本不支持命名空间)和Firefox中似乎无法工作。我不关心它在哪些浏览器上能否工作,我只需要知道它是一个有效的结构还是无效的结构。
这里是一个演示: 这是一个演示
从我所理解的CSS语法中,它是无效的。但我可能误读了语法。

请不要混淆伪类和伪元素 - 它们是两个不同的东西。 - BoltClock
哦,对不起,我确实理解区别了(注意问题确实说的是“伪类”,我只是标题写错了!) - James Allardice
1
我刚看到你的错误报告 :) https://bugs.webkit.org/show_bug.cgi?id=89748 - BoltClock
1个回答

6
作为文档语言的一部分,命名空间不直接应用于伪类或伪元素,因为它们是在CSS中定义而不是文档语言(例如XML)中定义的。然而,元素类型和属性是在文档语言中定义的,而不是在CSS中定义的,这就是为什么它们可以命名空间化的原因。因此,在一系列简单选择器中,通用选择器特别指代“任何类型”。
当没有命名空间时,通用选择器仅对其他简单选择器和伪元素隐含使用(这就是为什么像.foo、#target、[type="text"]、:first-child和::before这样的选择器是有效的,并且通常与像HTML这样的语言一起使用,其中CSS最常用于样式)。来自spec的信息:
如果一个通用选择器由*(即没有命名空间前缀)表示,并且不是一系列简单选择器选择器的唯一组成部分,或者紧接着是伪元素,则可以省略*,并暗示通用选择器的存在。
因此,在您的示例中,选择器无效,因为在|:之间既没有通用选择器也没有类型选择器。
/* These are all invalid */
*|:first-child
ns|::first-letter
|::before

如果您指定了命名空间,而不是选择特定类型,则必须指定通用选择器。
*|*:first-child
*|*::before

在选择ns命名空间中的元素时同样适用:
ns|*:first-child
ns|*::before

或者当选择不在命名空间中的元素时:

|*:first-child
|*::before

所以 WebKit 弄错了?这就是我想的,感谢澄清 :) - James Allardice
你能提供源代码链接吗? :-) - Matsemann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接