Приоритет комбинатора CSS?

Есть ли приоритет для комбинаторов вроде

a > b ~ c d

(Обратите внимание, что пробел между c и d является комбинатором потомков)

Или это просто прочитано слева направо, например

((a > b) ~ c) d

?

Ответы

Ответ 1

Нет, в комбинаторах нет понятия о приоритете. Однако существует понятие порядка элементов в сложном селекторе.

Любой сложный селектор можно читать в любом направлении, которое имеет для вас смысл, но это не означает, что комбинаторы distributive или commutative, так как они указывают связь между двумя элементами, например ancestor descendant и previous + next). Вот почему порядок элементов имеет значение.

В соответствии с Google, однако, браузеры реализуют свои механизмы выбора, чтобы они оценивали сложные селектора справа налево:

Двигатель [Gecko] оценивает каждое правило справа налево, начиная с самого правого селектора (называемого "ключ" ) и перемещаясь через каждый селектор, пока не найдет совпадение или не сбросит правило.

Статья Mozilla, Написание эффективного CSS для использования в пользовательском интерфейсе Mozilla содержит раздел, описывающий, как их механизм CSS оценивает селекторы. Это XUL-специфический, но тот же механизм компоновки используется как для пользовательского интерфейса Firefox, так и для страниц, отображаемых в окне просмотра Firefox.

Как описано Google в приведенной выше цитате, селектор ключей просто ссылается на самую правую селекторную последовательность, поэтому снова он справа налево:

Система стиля соответствует правилам, начиная с селектора ключей, а затем перемещаясь влево (поиск любых предков в селекторе правил). Пока поддерево селекторов продолжает проверяться, система стиля продолжает перемещаться влево, пока она не будет соответствовать правилу, или откажется из-за несоответствия.

Помните о двух вещах:

  • Они документируются на основе деталей реализации; в самом сердце, селектор является селектором, и все, что он намерен сделать, - это сопоставить элемент, который удовлетворяет определенному условию (выложенному компонентами селектора). В каком направлении оно считывается до реализации; как указано другим ответом, спецификация ничего не говорит о том, какой порядок оценивать селектор в или о приоритете комбинатора.

  • Ни одна из статей не означает, что каждый простой селектор оценивается слева направо в своей простой последовательности селекторов (см. этот ответ, почему я считаю, что это не случай). Что говорится в статьях, так это то, что движок браузера оценит последовательность селектора ключей, чтобы выяснить, соответствует ли его рабочий элемент DOM, а затем, если это произойдет, перейдите к следующей последовательности селекторов, следуя комбинатору и проверяя любые элементы, соответствующие этому последовательности, затем промыть и повторить до тех пор, пока не закончите или не сработаете.


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

Итак, селектор:

a > b ~ c d

означало бы:

Выберите любой элемент dкоторый является потомком элемента c
который является потомком и приходит после, a b element
это дочерний элемент (прямой потомок) элемента a.

Ответ 2

Это не имеет значения.

a > b c 

будет соответствовать тем же элементам, независимо от того, сделаете ли вы это

(a > b) c

или

a > (b c)

Я думаю, что браузеры идут справа налево.

Ответ 3

спецификация не упоминает ничего о приоритете (что я могу найти), но я считаю, что это строго левая-правая оценка