2012-06-21 101 views
3

当使用CSS命名空间,您可以选择,例如,通过使用一个名称空间的类型选择在“任何或没有命名空间”任何div元素:CSS伪类可以命名空间吗?

*|div 

它是有效的CSS来命名空间的伪类?例如:

*|:first-child 

似乎在基于WebKit的浏览器的工作,它似乎不是在IE9工作(以下IE9不支持在所有命名空间)和Firefox。我不在乎它所用的浏览器/不工作,我只需要知道它是否是一个有效的构造。

Here's a fiddle

从我可以在CSS grammar中得出的结论是无效的。但我可能会误读语法。

+0

请不要混淆伪类和伪元素 - 它们是两个不同的东西。 – BoltClock

+0

噢,对不起,我明白不同之处(注意这个问题确实会说“伪类”,我刚刚得到了错误的标题!) –

+0

我只是碰到了你的错误报告:) https://bugs.webkit。 org/show_bug.cgi?id = 89748 – BoltClock

回答

5

作为文档语言的一部分,名称空间不直接应用于伪类或伪元素,因为它们是用CSS定义的,而不是文档语言(例如XML)。但是,元素类型和属性是在文档语言中定义的,而不是CSS,这就是它们可以命名空间的原因。因此,在一系列简单的选择器中,通用选择器具体指“任何类型”。

没有命名空间中使用时(这是通用选择只暗示其他简单的选择和伪元素为什么选择像.foo#target[type="text"]:first-child::before是有效的,并且通常与语言一样使用HTML,其中CSS最常用于造型)。从spec

如果*(即,没有一个命名空间前缀)表示的通用选择不是一个sequence of simple selectors选择器的唯一部件或之后紧接着一个pseudo-element,则*可以被省略,并且普遍隐含选择器的存在。

因此,在你的榜样,选择是无效的,因为有没有一个普遍的选择或|:之间的类型选择:

/* These are all invalid */ 
*|:first-child 
ns|::first-letter 
|::before 

如果您指定一个命名空间,你必须指定通用选择,如果你不选择一个特定的类型,而不是:

*|*:first-child 
*|*::before 

ns选择元素时也是一样命名空间:

ns|*:first-child 
ns|*::before 

或选择不在一个命名空间元素时:

|*:first-child 
|*::before 
+0

因此WebKit错了吗?这是我的想法,所以谢谢澄清:) –

+0

你能链接到源? :-) – Matsemann

+0

@Matsemann:就在时间之谜 - 我总是忘记。 – BoltClock