Zmniejsz zakres i złożoność obliczeń dotyczących stylu

Zmiany wizualne są często wywoływane przez JavaScript. Czasami wprowadza te zmiany bezpośrednio przez manipulowanie stylem, a czasami przez obliczenia, które powodują zmiany wizualne, takie jak wyszukiwanie lub sortowanie danych. Złanie zsynchronizowany lub długo działający kod JavaScript może być częstą przyczyną problemów z wydajnością. W miarę możliwości staraj się minimalizować jego wpływ.

Obliczanie stylu

Zmiana DOM przez dodawanie i usuwanie elementów, zmianę atrybutów lub klas albo odtwarzanie animacji powoduje ponowne obliczanie stylów elementów i w wielu przypadkach układu części lub całości strony. Ten proces nazywa się obliczeniem stylu.

Przeglądarka zaczyna obliczać style, tworząc zestaw pasujących selektorów, aby określić, które klasy, pseudoselektory i identyfikatory mają zastosowanie do danego elementu. Następnie przetwarza reguły stylów z odpowiednich selektorów i określa, jakie style końcowe ma element.

Rola ponownego obliczania stylów w opóźnieniu interakcji

Interakcja do kolejnego wyrenderowania (INP) to dane o wydajności w czasie działania, które służą do oceny ogólnej responsywności strony na dane wprowadzane przez użytkownika. Mierzy czas oczekiwania na interakcję od momentu, w którym użytkownik wchodzi w interakcję ze stroną, do wyrenderowania następnej klatki przez przeglądarkę i pokazania odpowiednich aktualizacji interfejsu.

Ważnym elementem interakcji jest czas potrzebny na wyrenderowanie następnego kadru. Przetwarzanie wykonywane w celu wyświetlenia następnej klatki składa się z wielu części, w tym obliczenia stylów stron, które występują tuż przed układem, malowaniem i kompozycją. Ten przewodnik skupia się na kosztach obliczania stylów, ale skrócenie dowolnej części łącznego czasu renderowania interakcji powoduje również skrócenie łącznego czasu oczekiwania.

Zmniejsz złożoność selektorów

Upraszczanie selektorów CSS może przyspieszyć obliczenia stylów na stronie. Najprostsze selektory odwołują się do elementu w CSS tylko za pomocą nazwy klasy:

.title {
  /* styles */
}

W miarę rozwoju projektu może on wymagać bardziej złożonego kodu CSS, a Ty możesz skończyć z selektorami, które wyglądają tak:

.box:nth-last-child(-n+1) .title {
  /* styles */
}

Aby określić, jak te style mają być stosowane na stronie, przeglądarka musi zapytać: „Czy jest to element z klasą title, którego element nadrzędny ma klasę box i jest elementem podrzędnym minus-nth-plus-1 elementu nadrzędnego?”. Przeanalizowanie tego może zająć przeglądarce trochę czasu. Aby to uprościć, możesz zmienić selektor na bardziej szczegółową nazwę klasy:

.final-box-title {
  /* styles */
}

Te nazwy klas zastępczych mogą wydawać się dziwne, ale znacznie ułatwiają pracę przeglądarce. W poprzedniej wersji, aby na przykład przeglądarka mogła stwierdzić, że element jest ostatnim tego typu, musi najpierw wiedzieć wszystko o wszystkich innych elementach, aby określić, czy jakieś elementy występujące po nim mogą być nth-last-child. Może to być dużo bardziej kosztowne pod względem obliczeniowym niż dopasowanie selektora do elementu na podstawie wyłącznie nazwy klasy.

Zmniejsz liczbę elementów z określaniem stylu

Kolejną kwestią związaną z wydajnością – i często ważniejszą niż złożoność selektora – jest ilość pracy, która musi zostać wykonana po zmianie elementu.

Ogólnie rzecz biorąc, najgorszy koszt obliczenia stylu elementów obliczeniowych to liczba elementów pomnożona przez liczbę selektorów, ponieważ przeglądarka musi sprawdzić każdy element co najmniej raz w porównaniu z każdym stylem, aby sprawdzić, czy pasuje.

Obliczenia stylu mogą dotyczyć bezpośrednio kilku elementów, zamiast unieważniać całą stronę. W przypadku nowoczesnych przeglądarek problem ten jest zazwyczaj słabszy, ponieważ przeglądarka nie zawsze musi sprawdzać wszystkie elementy, na które może wpłynąć dana zmiana. Starsze przeglądarki nie zawsze są zoptymalizowane pod kątem takich zadań. Jeśli to możliwe, zmniejsz liczbę nieważnych elementów.

Pomiar kosztu ponownego obliczania stylów

Koszt ponownego obliczania stylów w przeglądarce możesz mierzyć na kilka sposobów. Każdy z nich zależy od tego, czy chcesz mierzyć czas w przeglądarce w środowisku programistycznym, czy chcesz mierzyć czas trwania tego procesu w przypadku rzeczywistych użytkowników w Twojej witrynie.

Pomiar kosztu ponownego obliczenia stylu w Narzędziach deweloperskich w Chrome

Jednym ze sposobów pomiaru kosztu ponownych obliczeń stylów jest użycie panelu wydajności w Narzędziach deweloperskich w Chrome. Aby rozpocząć, wykonaj te czynności:

  1. Otwórz Narzędzia deweloperskie.
  2. Otwórz kartę Skuteczność.
  3. Zaznacz pole wyboru Statystyki selektora (opcjonalnie).
  4. Kliknij Nagrywaj.
  5. Wejdź w interakcję ze stroną.

Gdy zatrzymasz nagrywanie, zobaczysz obraz podobny do tego:

Narzędzia deweloperskie pokazujące obliczenia stylu.
Raport Narzędzi deweloperskich pokazujący obliczenia stylów.

Pasek u góry to miniaturowa krzywa płomienia, która również przedstawia liczbę klatek na sekundę. Im bliżej dołu paska znajduje się dana aktywność, tym szybciej przeglądarka wyświetla klatki. Jeśli widzisz, że wykres płomienia jest wyrównany u góry i powyżej niego znajdują się czerwone paski, oznacza to, że zadanie powoduje długi czas trwania klatek.

Powiększenie obszaru problemowego w Narzędziach deweloperskich w Chrome w podsumowaniu aktywności w wypełnionym panelu wydajności w Narzędziach deweloperskich w Chrome.
Długie ramki w podsumowaniu aktywności w Narzędziach deweloperskich

Warto przyjrzeć się klatkom, które są wyświetlane przez dłuższy czas podczas interakcji, np. przewijania. Jeśli widzisz duży fioletowy blok, powiększ widok aktywności i wybierz dowolne zadanie o nazwie Przelicz styl, aby uzyskać więcej informacji o potencjalnie kosztownej pracy związanej z przeliczaniem stylu.

Uzyskiwanie szczegółów długotrwałych obliczeń stylu, w tym ważnych informacji, takich jak liczba elementów, na które wpływa ponowne obliczanie stylu.
Przedłużone przeliczanie stylu trwające w podsumowaniu w Narzędziach deweloperskich nieco ponad 25 ms.

Kliknięcie zdarzenia powoduje wyświetlenie jego stosu wywołań. Jeśli to renderowanie zostało spowodowane interakcją użytkownika, wywoływany jest kod JavaScript, który spowodował zmianę stylu. Pokazuje też liczbę elementów, których dotyczy zmiana (w tym przypadku ponad 900 elementów), oraz czas obliczenia stylu. Na podstawie tych informacji możesz spróbować znaleźć poprawkę w kodzie.

Jeśli przed przeprowadzeniem śledzenia zaznaczysz pole wyboru Statystyki selektora w ustawieniach Panelu skuteczności, na dole panelu śledzenia pojawi się dodatkowa karta o tej samej nazwie.

Tabela statystyk selektora CSS, jaką znajdziesz w panelu wydajności w Narzędziach deweloperskich w Chrome Ta tabela zawiera nagłówki i odpowiednie dane, takie jak upłynięty czas, próby dopasowania, liczba dopasowań, odsetek niepasujących węzłów, selektory oraz arkusz stylów, w którym można je znaleźć.
Tabela statystyk selektora w panelu wydajności w Narzędziach deweloperskich w Chrome.

Ten panel zawiera przydatne dane o względnym koszcie każdego selektora, dzięki czemu możesz zidentyfikować kosztowne selektory arkusza CSS.

Więcej informacji znajdziesz w dokumentacji dotyczącej statystyk selektora CSS.

Mierz koszt ponownego obliczenia stylu dla rzeczywistych użytkowników

Jeśli chcesz się dowiedzieć, ile czasu zajmuje ponowne obliczanie stylów przez prawdziwych użytkowników Twojej witryny, interfejs Long Animation Frames API udostępnia narzędzia potrzebne do tego celu. Dane z tego interfejsu API zostały dodane do biblioteki JavaScript web-vitals, w tym czas ponownego obliczania stylów.

Jeśli podejrzewasz, że opóźnienie wyświetlania interakcji jest głównym czynnikiem wpływającym na INP strony, musisz określić, ile z tego czasu jest poświęcane na ponowne obliczanie stylów na stronie. Więcej informacji znajdziesz w artykule o tym, jak mierzyć w terenie czas ponownego obliczania stylu.

Zasoby