Ответ 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