CSS комбинатор приоритет? - PullRequest
       9

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

42 голосов
/ 04 октября 2010

Есть ли приоритет у комбинаторов, таких как

a > b ~ c d

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

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

((a > b) ~ c) d

Ответы [ 3 ]

50 голосов
/ 04 октября 2010

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

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

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

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

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

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

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

Имейте в виду две вещи:

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

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


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

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

a > b ~ c d

будет означать:

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

2 голосов
/ 04 октября 2010

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

a > b c 

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

(a > b) c

или

a > (b c)

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

0 голосов
/ 04 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...