Может ли псевдокласс CSS иметь пространство имен?

При использовании пространств имен в CSS вы можете выбрать, например, любой элемент div в «любом пространстве имен или без него», используя селектор типа пространства имен:

*|div

Допустимо ли CSS для пространства имен псевдокласса? Например:

*|:first-child

Кажется, он работает в браузерах на основе WebKit и, похоже, не работает в IE9 (ниже IE9 вообще не поддерживает пространства имен) и Firefox. Мне все равно, в каких браузерах это работает/не работает, мне просто нужно знать, является ли это допустимой конструкцией.

Вот скрипка.

Из того, что я могу разглядеть в грамматике CSS, это недопустимо. Но я могу ошибаться в грамматике.


person James Allardice    schedule 21.06.2012    source источник
comment
Пожалуйста, не путайте псевдоклассы и псевдоэлементы — это разные вещи.   -  person BoltClock    schedule 21.06.2012
comment
О да, извините, я понимаю разницу (обратите внимание, что вопрос действительно говорит о псевдоклассе, я просто неправильно понял название!)   -  person James Allardice    schedule 21.06.2012
comment
Я только что наткнулся на ваш отчет об ошибке :) bugs.webkit.org/show_bug.cgi?id =89748   -  person BoltClock    schedule 29.12.2012


Ответы (1)


Пространства имен как часть языка документа не применяются напрямую к псевдоклассам или псевдоэлементам, поскольку они определены в CSS, а не в языке документа (например, XML). Однако типы и атрибуты элементов определяются на языке документа, а не в CSS, поэтому они могут иметь пространство имен. Следовательно, в последовательности простых селекторов универсальный селектор конкретно означает «любой тип».

Универсальный селектор подразумевается только для других простых селекторов и псевдоэлементов при использовании без пространства имен (поэтому такие селекторы, как .foo, #target, [type="text"], :first-child и ::before, допустимы и обычно используются с такими языками, как HTML, где чаще всего используется CSS). для стайлинга). Из спецификации:

Если универсальный селектор, представленный * (т. е. без префикса пространства имен), не является единственным компонентом последовательности простых селекторов или сразу за ним следует псевдоэлемент, то * можно опустить и подразумевать наличие универсального селектора.

Поэтому в вашем примере селектор недействителен, потому что между | и : нет ни универсального селектора, ни селектора типа:

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

Если вы указываете пространство имен, вы должны указать универсальный селектор, если вы не выбираете конкретный тип:

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

То же самое происходит при выборе элементов в пространстве имен ns:

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

Или при выборе элементов, которые не находятся в пространстве имен:

|*:first-child
|*::before
person BoltClock    schedule 21.06.2012
comment
Значит, WebKit ошибся? Я так и думал, спасибо за разъяснения :) - person James Allardice; 21.06.2012
comment
Не могли бы вы дать ссылку на источник? :-) - person Matsemann; 21.06.2012