Имейте в виду, что когда браузер выполняет сопоставление селектора, у него есть один элемент (тот, для которого он пытается определить стиль) и все ваши правила и их селекторы, и ему нужно найти, какие правила соответствуют элементу.Это отличается от обычной вещи jQuery, скажем, когда у вас есть только один селектор, и вам нужно найти все элементы, которые соответствуют этому селектору.
Если у вас был только один селектор и только один элемент для сравнения с этимСелектор, то слева направо имеет больше смысла в некоторых случаях.Но это решительно не ситуация браузера.Браузер пытается отобразить Gmail или что-то еще, и у него есть одно <span>
, которое он пытается стилизовать, и более 10000 правил, которые Gmail вставляет в свою таблицу стилей (я не придумываю это число).
В частности,в ситуации, когда браузер смотрит на большинство селекторов, он считает, что не не соответствует рассматриваемому элементу.Таким образом, проблема состоит в том, чтобы решить, что селектор не соответствует так быстро, как это возможно;если это требует немного дополнительной работы в соответствующих случаях, вы все равно выигрываете из-за всей работы, которую вы сохраняете в случаях, которые не совпадают.
Если вы начинаете с простого сопоставления самой правой частиселектор против вашего элемента, то есть вероятность, что он не будет совпадать, и все готово.Если он совпадает, вам придется выполнять больше работы, но только пропорционально глубине вашего дерева, которая в большинстве случаев не так велика.
С другой стороны, если вы начинаете с сопоставления самой левой частиселектор ... с чем ты сравниваешь?Вы должны начать ходить по DOM, ища узлы, которые могут ему соответствовать.Просто обнаружение, что ничто не соответствует этой самой левой части, может занять некоторое время.
Так что браузеры совпадают справа;это дает очевидную отправную точку и позволяет очень быстро избавиться от большинства кандидатов на выбор.Вы можете увидеть некоторые данные в http://groups.google.com/group/mozilla.dev.tech.layout/browse_thread/thread/b185e455a0b3562a/7db34de545c17665 (хотя обозначения сбивают с толку), но в результате получается, что для Gmail, в частности два года назад, для 70% пар (правило, элемент) вы могли решить, что правилоне совпадает только после проверки частей тега / класса / идентификатора крайнего правого селектора для правила.Соответствующий показатель для набора тестов производительности загрузки страниц Mozilla составил 72%.Так что действительно стоит попытаться избавиться от этих 2/3 всех правил как можно быстрее, а затем беспокоиться только о соответствии оставшимся 1/3.
Обратите внимание, что есть и другие оптимизации, которые браузеры уже делают дляизбегайте даже попыток соответствовать правилам, которые точно не будут соответствоватьНапример, если у крайнего правого селектора есть идентификатор, и этот идентификатор не совпадает с идентификатором элемента, то в Gecko вообще не будет попытки сопоставить этот селектор с этим элементом: набор «селекторов с идентификаторами», которые предпринимаютсяисходит из поиска по хеш-таблице идентификатора элемента.Так что это 70% правил, которые имеют довольно хорошие шансы на совпадение, что все еще не совпадают после рассмотрения только тега / класса / id самого правого селектора.