Может ли псевдосемейство CSS быть помещено в пространство имен?

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

*|div

Является ли это действительным CSS для пространства имен псевдокласса? Например:

*|:first-child

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

Здесь скрипка.

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

Ответ 1

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

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

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

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

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

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

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

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

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

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

|*:first-child
|*::before