Есть ли приоритет для комбинаторов вроде
a > b ~ c d
(Обратите внимание, что пробел между c
и d
является комбинатором потомков)
Или это просто прочитано слева направо, например
((a > b) ~ c) d
?
Есть ли приоритет для комбинаторов вроде
a > b ~ c d
(Обратите внимание, что пробел между c
и d
является комбинатором потомков)
Или это просто прочитано слева направо, например
((a > b) ~ c) d
?
Нет, в комбинаторах нет понятия о приоритете. Однако существует понятие порядка элементов в сложном селекторе.
Любой сложный селектор можно читать в любом направлении, которое имеет для вас смысл, но это не означает, что комбинаторы distributive или commutative, так как они указывают связь между двумя элементами, например ancestor descendant
и previous + next
). Вот почему порядок элементов имеет значение.
В соответствии с Google, однако, браузеры реализуют свои механизмы выбора, чтобы они оценивали сложные селектора справа налево:
Двигатель [Gecko] оценивает каждое правило справа налево, начиная с самого правого селектора (называемого "ключ" ) и перемещаясь через каждый селектор, пока не найдет совпадение или не сбросит правило.
Статья Mozilla, Написание эффективного CSS для использования в пользовательском интерфейсе Mozilla содержит раздел, описывающий, как их механизм CSS оценивает селекторы. Это XUL-специфический, но тот же механизм компоновки используется как для пользовательского интерфейса Firefox, так и для страниц, отображаемых в окне просмотра Firefox.
Как описано Google в приведенной выше цитате, селектор ключей просто ссылается на самую правую селекторную последовательность, поэтому снова он справа налево:
Система стиля соответствует правилам, начиная с селектора ключей, а затем перемещаясь влево (поиск любых предков в селекторе правил). Пока поддерево селекторов продолжает проверяться, система стиля продолжает перемещаться влево, пока она не будет соответствовать правилу, или откажется из-за несоответствия.
Помните о двух вещах:
Они документируются на основе деталей реализации; в самом сердце, селектор является селектором, и все, что он намерен сделать, - это сопоставить элемент, который удовлетворяет определенному условию (выложенному компонентами селектора). В каком направлении оно считывается до реализации; как указано другим ответом, спецификация ничего не говорит о том, какой порядок оценивать селектор в или о приоритете комбинатора.
Ни одна из статей не означает, что каждый простой селектор оценивается слева направо в своей простой последовательности селекторов (см. этот ответ, почему я считаю, что это не случай). Что говорится в статьях, так это то, что движок браузера оценит последовательность селектора ключей, чтобы выяснить, соответствует ли его рабочий элемент DOM, а затем, если это произойдет, перейдите к следующей последовательности селекторов, следуя комбинатору и проверяя любые элементы, соответствующие этому последовательности, затем промыть и повторить до тех пор, пока не закончите или не сработаете.
Со всем сказанным, если бы вы попросили меня прочитать селекторов и описать то, что они выбрали на простом английском языке, я бы тоже читал их справа налево (не то, что я уверен, что это имеет отношение к деталям реализации, хотя!).
Итак, селектор:
a > b ~ c d
означало бы:
Выберите любой элемент
d
который является потомком элементаc
который является потомком и приходит после, ab
element
это дочерний элемент (прямой потомок) элементаa
.
Это не имеет значения.
a > b c
будет соответствовать тем же элементам, независимо от того, сделаете ли вы это
(a > b) c
или
a > (b c)
Я думаю, что браузеры идут справа налево.
спецификация не упоминает ничего о приоритете (что я могу найти), но я считаю, что это строго левая-правая оценка