Dlaczego przeglądarki dopasowują selektory CSS od prawej do lewej?

Selektory CSS są dopasowane przez silniki przeglądarki od prawej do lewej. Więc najpierw znajdują dzieci, a następnie sprawdzają rodziców, czy pasują do reszty zasad.

    Dlaczego tak jest? Czy to dlatego, że spec mówi?
  1. czy ma to wpływ na ostateczny układ, jeśli został oceniony od lewej do prawej?

Dla mnie najprostszym sposobem jest użycie selektorów z najmniejszą liczbą elementów. Więc najpierw identyfikatory (jak powinny być tylko return 1 element). Następnie może klasy lub element, który ma najmniejszą liczbę węzłów - np. może być tylko jeden Zakres na stronie, więc przejdź bezpośrednio do tego węzła z dowolną regułą, która odwołuje się do zakresu.

Oto kilka linków potwierdzających moje twierdzenia

  1. http://code.google.com/speed/page-speed/docs/rendering.html
  2. https://developer.mozilla.org/en/Writing_Efficient_CSS

Wygląda na to, że robi się to w ten sposób, aby uniknąć patrzeć na wszystkie dzieci rodzica (których może być wiele), a nie na wszystkich rodziców dziecka, które musi być jednym. Nawet jeśli DOM jest głęboki, to będzie patrzeć tylko na jeden węzeł na poziom, a nie na wiele w dopasowaniu RTL. czy łatwiej/szybciej ocenić selektory CSS LTR lub RTL?

Author: Community, 2011-04-27

3 answers

Należy pamiętać, że gdy przeglądarka dopasowuje selektor, ma jeden element (ten, dla którego próbuje określić styl) i wszystkie Twoje reguły i ich selektory i musi znaleźć, które reguły pasują do elementu. To różni się od zwykłej rzeczy jQuery, powiedzmy, gdzie masz tylko jeden Selektor i musisz znaleźć wszystkie elementy, które pasują do tego selektora.

Jeśli masz tylko jeden Selektor i tylko jeden element do porównania z tym selektorem, to od lewej do prawej sprawia, że więcej sens w niektórych przypadkach. Ale to zdecydowanie nie sytuacja przeglądarki. Przeglądarka próbuje renderować Gmaila lub cokolwiek innego i ma ten <span>, który próbuje stylizować i 10 000 + reguł Gmail umieszcza w swoim arkuszu stylów(nie wymyślam tego numeru).

W szczególności, w sytuacji, gdy przeglądarka patrzy na większość selektorów, rozważa nie pasują do danego elementu. Problemem staje się więc decyzja, że selekcjoner nie pasuje tak szybko jak możliwe; jeśli wymaga to trochę dodatkowej pracy w przypadkach, które pasują, nadal wygrywasz ze względu na całą pracę, którą oszczędzasz w przypadkach, które nie pasują.

Jeśli zaczniesz od dopasowania prawej części selektora do swojego elementu, to są szanse, że nie będzie pasował i gotowe. Jeśli pasuje, musisz wykonać więcej pracy, ale tylko proporcjonalnie do głębokości drzewa, która w większości przypadków nie jest tak duża.

Z drugiej strony, jeśli zaczniesz od dopasowania lewej części selektor... z czym go porównujesz? Musisz zacząć chodzić po DOM, szukając węzłów, które mogą pasować do niego. Odkrycie, że nic nie pasuje do tej lewej części może chwilę potrwać.

Tak więc przeglądarki dopasowują się od prawej strony; daje to oczywisty punkt wyjścia i pozwala bardzo szybko pozbyć się większości selektorów kandydatów. Niektóre dane można zobaczyć na http://groups.google.com/group/mozilla.dev.tech.layout/browse_thread/thread/b185e455a0b3562a/7db34de545c17665 (choć notacja jest myląca), ale wynik jest taki, że w Gmailu, w szczególności dwa lata temu, dla 70% par (rule, element) można było zdecydować, że reguła nie pasuje po prostu sprawdzając części tag / class / id w prawym selektorze reguły. Odpowiadająca jej Liczba dla pakietu testowego pageload firmy Mozilla wyniosła 72%. Więc naprawdę warto spróbować aby pozbyć się tych 2/3 wszystkich zasad tak szybko, jak to możliwe, a następnie tylko martwić się o dopasowanie pozostałych 1/3.

Zauważ również, że istnieją już inne optymalizacje, które przeglądarki robią, aby uniknąć nawet prób dopasowania reguł, które na pewno nie pasują. Na przykład, jeśli selektor po prawej stronie ma id i ten id nie pasuje do identyfikatora elementu, to nie będzie prób dopasowania selektora do tego elementu w Gecko: zestaw "selektorów z ID", które są próbowane pochodzi z wyszukiwanie hashtable NA ID elementu. Więc jest to 70% reguł, które mają całkiem spore szanse na dopasowanie, że nadal nie pasują po rozważeniu tylko tagu/class/id prawego selektora.

 773
Author: Boris Zbarsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-07 12:20:56

Parsowanie od prawej do lewej, zwane również analizowaniem od dołu do góry jest wydajne dla przeglądarki.

Rozważ, co następuje:

#menu ul li a { color: #00f; }

Przeglądarka najpierw sprawdza, czy a, wtedy li, wtedy ul, i wtedy #menu.

Dzieje się tak dlatego, że gdy przeglądarka skanuje stronę, musi po prostu spojrzeć na bieżący element/węzeł i wszystkie poprzednie węzły/elementy, które zeskanowała.

Należy zauważyć, że Przeglądarka rozpoczyna przetwarzanie w momencie uzyskania kompletnego znacznika / węzła i nie musi czekać na całą stronę, z wyjątkiem sytuacji, gdy znajdzie skrypt, w którym to przypadku tymczasowo wstrzymuje się i kończy wykonywanie skryptu, a następnie przechodzi do przodu.

Jeśli zrobi to odwrotnie, będzie to nieefektywne, ponieważ przeglądarka znalazła element, który skanowała przy pierwszym sprawdzeniu, ale była zmuszona kontynuować przeglądanie dokumentu w poszukiwaniu wszystkich dodatkowych selektorów. W tym celu przeglądarka musi mieć cały html i może być konieczne skanowanie całej strony przed rozpoczęciem malowania css.

Jest to sprzeczne z tym, jak większość libs parsuje dom. Tam dom jest skonstruowany i nie musi skanować całej strony, po prostu znajdź pierwszy element, a następnie dopasuj inne wewnątrz niego .
 23
Author: aWebDeveloper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-14 07:51:30

Pozwala na kaskadowe przechodzenie od bardziej specyficznego do mniej specyficznego. Umożliwia również zwarcie w aplikacji. Jeśli bardziej szczegółowa reguła ma zastosowanie we wszystkich aspektach, do których ma zastosowanie reguła nadrzędna, wszystkie reguły nadrzędne są ignorowane. Jeśli w rodzicu znajdują się inne bity, są one stosowane.

Jeśli poszedłeś w drugą stronę, sformatowałeś według rodzica, a następnie nadpisałeś za każdym razem, gdy dziecko ma coś innego. Na dłuższą metę jest to o wiele więcej pracy niż ignorowanie pozycji w regulaminie, które są już załatwione.

 19
Author: Gregory A Beamer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-26 22:13:01