2012-06-21 107 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