Skumulowana zmiana układu (CLS)

Co mierzy Skumulowana zmiana układu, jak obliczany jest wynik (wpływ × odległość), okna sesji, progi, typowe przyczyny oraz jak je naprawić i debugować.

Opublikowano po raz pierwszy: 26 cze 2026 · Ostatnia aktualizacja: 11 sie 2026 · Advanced
Języki

Skumulowana zmiana układu (CLS) to podstawowa metryka internetowa dotycząca stabilności wizualnej — ile widocznych treści nieoczekiwanie się przesuwa podczas korzystania ze strony. Jest to wynik bezwymiarowy (ułamek wpływu × ułamek odległości na przesunięcie), a od czerwca 2021 r. jest to największe okno sesji przesunięć, a nie suma w całym okresie życia. Dobry wynik to ≤ 0,1 na 75. percentylu danych terenowych; 0,1–0,25 wymaga poprawy; > 0,25 jest słaby. Typowymi winowajcami są obrazy/reklamy/iframy/osadzenia bez rozmiarów, czcionki internetowe i treści wstrzykiwane powyżej linii zagięcia — napraw je, rezerwując miejsce (szerokość/wysokość lub aspect-ratio), dostrajając font-display i animując za pomocą transform. Lighthouse często odczytuje blisko 0, ponieważ nie wchodzi w interakcję ze stroną ani nie uruchamia pełnego cyklu życia strony — dane terenowe (CrUX) są tym, na czym Google faktycznie opiera ranking.

TL;DR — CLS to Core Web Vital dla stabilności wizualnej. Każde przesunięcie jest oceniane jako impact fraction × distance fraction; sam wskaźnik to największe okno sesji przesunięć (≤ 1 s między przesunięciami, okno ≤ 5 s) — a nie suma całkowita, co było przed czerwcem 2021. Dobry wynik to ≤ 0,1, wymaga poprawy ≤ 0,25, słaby > 0,25, na 75. percentylu danych terenowych. Liczą się tylko przesunięcia widoczne w viewporcie; przesunięcia w ciągu 500 ms od dyskretnego wejścia są wykluczone (przewijanie nie jest). Przyczyny to obrazy/filmy/reklamy/iframe/osadzone elementy bez rozmiarów, czcionki internetowe i treści wstrzykiwane nad istniejącą treścią; naprawy to rezerwowanie miejsca, font-display/size-adjust i animacja tylko z transform. Pułapka do uniknięcia: Lighthouse (laboratorium) zwykle odczytuje blisko 0, ponieważ nie wchodzi w interakcję ze stroną ani nie uruchamia pełnego cyklu życia — dane terenowe (CrUX) to to, co Google faktycznie mierzy.

Co mierzy CLS

Ujęcie Google: “Cumulative Layout Shift (CLS) is a stable Core Web Vital metric. It’s an important, user-centric metric for measuring visual stability because it helps quantify how often users experience unexpected layout shifts.” (tłumaczenie) „Skumulowane przesunięcie układu (CLS) to stabilny wskaźnik Core Web Vitals. To ważny, skoncentrowany na użytkowniku wskaźnik pomiaru stabilności wizualnej, ponieważ pomaga określić, jak często użytkownicy doświadczają nieoczekiwanych przesunięć układu.” Kluczowe słowo to nieoczekiwane — treść, która przesuwa się sama, a nie dlatego, że użytkownik coś zrobił.

Znajduje się w trio Core Web Vitals obok Largest Contentful Paint (ładowanie) i Interaction to Next Paint (responsywność). Podczas gdy LCP i INP są mierzone w milisekundach, CLS jest wyjątkiem: bezwymiarowy wynik proporcji. To często wprowadza ludzi w błąd. CLS wynoszące 0,05 to nie 50 ms. Nie ma w ogóle jednostki czasu.

Wzór: wpływ × odległość

Dla każdego przesunięcia Google definiuje to jako:

layout shift score = impact fraction × distance fraction
  • Frakcja wpływu mierzy, jak niestabilne elementy wpływają na obszar widoku między dwiema klatkami — łączny widoczny obszar zajmowany przez przesuwające się elementy (przed i po), jako udział w rzutni.
  • Frakcja odległości to największa pozioma lub pionowa odległość, o jaką niestabilny element przesunął się w klatce, podzielona przez większy wymiar obszaru widoku — szerokość albo wysokość.

Obie te wielkości mają znaczenie niezależnie. Mały element, który przemieszcza się po większości ekranu, i duży element, który ledwo się przesuwa, mogą uzyskać bardzo różne wyniki. Przykład z web.dev: frakcja wpływu 0.75 i frakcja odległości 0.25 dają wynik przesunięcia układu 0.1875.

One shift scores the visible area affected multiplied by the farthest movement relative to the viewport. Źródło: web.dev

Three cards form the equation. Impact fraction is 0.75: the visible viewport area affected between two frames. Distance fraction is 0.25: the farthest movement divided by the viewport's largest dimension. Multiplying them produces a unitless individual layout-shift score of 0.1875. CLS ultimately keeps the largest session-window total, not a lifetime sum of every shift.

© Patrick Stox LLC · CC BY 4.0 ·

Okna sesji: część, którą wszyscy rozumieją źle

Oto najczęściej błędnie przedstawiany fakt dotyczący CLS i ten, który najbardziej chcę, abyś zapamiętał. CLS nie jest sumą wszystkich przesunięć w ciągu życia strony. Kiedyś tak było — to się zmieniło w czerwcu 2021.

Dziś CLS mierzy największą serię wyników nieoczekiwanych przesunięć układu występujących w całym cyklu życia strony. Seria to okno sesji: co najmniej jedno przesunięcie występujące szybko po poprzednim, z odstępem krótszym niż 1 sekunda i maksymalnym czasem całego okna wynoszącym 5 sekund. CLS to wynik największego takiego okna — nie suma, nie średnia.

Evidence for this claim CLS uses the largest session window of unexpected layout shifts, with gaps under one second and a maximum five-second window; recent discrete input can exclude a shift. Scope: Current CLS session-window and recent-input rules. Confidence: high · Verified: web.dev: Cumulative Layout Shift

Dlaczego ta zmiana? Stara definicja sumowania wszystkiego po cichu karała długo żyjące strony. Aplikacja jednostronicowa lub kanał z nieskończonym przewijaniem gromadziły więcej CLS tylko przez istnienie przez dłuższy czas, nawet jeśli każde pojedyncze przesunięcie było małe i dobrze rozłożone w czasie. Zespół Chrome Speed Metrics przeszedł na maksymalne okno sesji, aby przestać karać czas trwania, i wybrał maksimum zamiast średniej, aby uniknąć wypaczonego wyniku, w którym naprawienie małego, pobocznego przesunięcia mogłoby pogorszyć Twój wynik. Gdy zmiana została wdrożona, żadna domena nie uzyskała gorszego wyniku, większość nie odnotowała zmian, a część stron z wolnym interfejsem i nieskończonym przewijaniem poprawiła się. Jeśli czytasz starszy post, który nadal mówi „suma wszystkich przesunięć”, jest nieaktualny.

Co się liczy — a co nie

Trzy wykluczenia decydują o tym, co faktycznie trafia do Twojego wyniku:

  • Poniżej linii zagięcia się nie liczy. Liczone są tylko przesunięcia treści widocznej w bieżącym oknie przeglądarki. Przesunięcie na dole długiej strony, do której użytkownik nigdy nie przewinie, nie ma wpływu. W praktyce oznacza to, że naprawianie przesunięć w widocznym obszarze jest prawie zawsze bardziej opłacalne niż ściganie przesunięć daleko w dół strony.
  • Przesunięcia inicjowane przez użytkownika mają 500 ms taryfy ulgowej. “Przesunięcia układu, które występują w ciągu 500 milisekund od wprowadzenia danych przez użytkownika, będą miały ustawioną flagę hadRecentInput, więc mogą być wykluczone z obliczeń.” Stanowisko Google: przesunięcia “które występują w odpowiedzi na interakcje użytkownika… są zazwyczaj w porządku, o ile przesunięcie występuje wystarczająco blisko interakcji, aby związek był jasny dla użytkownika.” Otwórz akordeon, rozwiń menu — taki ruch jest oczekiwany, więc jest wybaczony.
  • Ale przewijanie nie jest darmową przepustką. Wykluczenie 500 ms dotyczy tylko dyskretnych zdarzeń — dotknięcia, kliknięcia, naciśnięcia klawisza. Ciągłe gesty (przewijanie, powiększanie palcami) nie uruchamiają okna wykluczenia. Jeśli treść przesuwa się podczas przewijania, to nadal się liczy. To rozróżnienie jest błędne w wielu publikacjach; zrób to dobrze.
Evidence for this claim A layout shift occurring within 500 milliseconds of a qualifying recent user input has hadRecentInput set and is excluded from CLS. Scope: field and lab Confidence: high · Verified: Cumulative Layout Shift (CLS)

Progi i skąd pochodzi wynik

“Aby zapewnić dobrą jakość obsługi, strony powinny dążyć do wyniku CLS na poziomie 0,1 lub mniej,” mierzonego na “75. percentylu ładowań stron, podzielonym na urządzenia mobilne i stacjonarne.” Pełne przedziały:

Evidence for this claim CLS is good at 0.1 or less and poor above 0.25, assessed at the 75th percentile of page loads. Scope: Current web.dev CLS field thresholds. Confidence: high · Verified: web.dev: Cumulative Layout Shift
  • Dobrze: ≤ 0,1
  • Wymaga poprawy: 0,1 – 0,25
  • Słabo: > 0,25
Evidence for this claim CLS is good at 0.1 or less and poor above 0.25, assessed at the 75th percentile of page loads. Scope: Current web.dev CLS field thresholds. Confidence: high · Verified: web.dev: Cumulative Layout Shift

Linia 0,1 nie jest przypadkowa. Badania użytkowników Google wykazały, że “poziomy przesunięcia od 0,15 i wyższe były konsekwentnie postrzegane jako uciążliwe, podczas gdy przesunięcia 0,1 i niższe były zauważalne, ale nie nadmiernie uciążliwe.” Zdecydowano się na 0,1 zamiast czegoś bardziej rygorystycznego częściowo dlatego, że osadzone elementy zewnętrzne (reklamy, media społecznościowe) tak często powodują przesunięcia, że ostrzejszy próg byłby niepraktyczny dla prawdziwej sieci.

Część “75. percentyl danych terenowych” jest kluczowa, co prowadzi nas do największej pułapki pomiarowej.

Laboratorium a pole: dlaczego liczby się różnią

To tutaj większość ludzi się przejeżdża. Lighthouse i inne narzędzia laboratoryjne często podają CLS bliskie 0,0, podczas gdy dane terenowe — i Google — pokazują coś znacznie gorszego. Różnica nie wynika z nieuczciwości narzędzi; to kwestia zakresu. Uruchomienie laboratoryjne to pojedyncze, krótkie, skryptowane ładowanie strony: nie przewija, nie klika i nie zostaje, więc rejestruje tylko przesunięcia przy początkowym ładowaniu. Dane terenowe (CrUX) agregują prawdziwe wizyty wielu użytkowników, urządzeń i nawigacji w ruchomym oknie, a CLS jest definiowane w całym cyklu życia strony — otwieranie menu, leniwe ładowanie treści podczas przewijania, późne wypełnianie reklam, niezależnie od tego, jak długo trwania sesja. Krótkie uruchomienie laboratoryjne strukturalnie nie może zobaczyć większości tego.

Zatem praktyczna zasada jest taka: używaj danych laboratoryjnych do debugowania konkretnego przesunięcia, a danych terenowych do poznania swojego prawdziwego wyniku. Google rankinguje na podstawie terenowych danych z raportu Chrome User Experience Report (CrUX), widocznych w PageSpeed Insights i Search Console. Jeśli Lighthouse pokazuje 0,0, ale PageSpeed Insights pokazuje 0,18, traktuj liczbę terenową jako tę, która odzwierciedla rzeczywistych użytkowników — następnie odtwórz przesunięcie w laboratorium, wchodząc w interakcję ze stroną tak, jak zrobiłby to prawdziwy odwiedzający. Dwie kolejne luki w zakresie warto wiedzieć: większość narzędzi, w tym Lighthouse, nie propaguje przesunięć układu iframe do wyniku dokumentu nadrzędnego, nawet jeśli CrUX może je odzwierciedlać, a RUM oparty na interfejsie Layout Instability API dziedziczy tę samą ślepą plamkę iframe — więc własne monitorowanie rzeczywistych użytkowników może nie wyjaśniać wyniku CrUX, który wygląda gorzej niż to, co pokazuje atrybucja pierwszej strony.

Najczęstsze przyczyny

W przybliżonej kolejności, jak często je widuję:

  1. Obrazy i wideo bez wymiarów. Brak zarezerwowanej wysokości oznacza, że wszystko poniżej przeskakuje, gdy multimedia się ładują.
  2. Reklamy, elementy osadzone i iframe’y bez zarezerwowanego miejsca. Sieci reklamowe serwują dynamiczne rozmiary; elementy osadzone nie ogłaszają swojej wysokości przed załadowaniem.
  3. Dynamicznie wstrzykiwana treść nad istniejącą treścią. Banery cookie, paski powiadomień, widgety “powiązane”, późno ładujące się promocje — wszystko, co wypycha w dół to, co już jest na ekranie.
  4. Czcionki internetowe (FOIT/FOUT). Gdy niestandardowa czcionka zastępuje czcionkę zapasową, tekst przeskakuje, jeśli ich metryki się różnią.
  5. Animacje na właściwościach wyzwalających układ. Animowanie top, left, margin, box-shadow lub box-sizing zmusza przeglądarkę do ponownego układania strony w każdej klatce.

Rozwiązania

Każde rozwiązanie odpowiada swojej przyczynie:

  • Obrazy/wideo — zarezerwuj miejsce. Ustaw atrybuty width i height, aby przeglądarka obliczyła proporcje i utrzymała ramkę; połącz z img { height: auto; width: 100%; } dla zachowania responsywnego lub użyj właściwości CSS aspect-ratio. To pojedyncze rozwiązanie o największym wpływie na CLS na większości stron.
  • Reklamy/elementy osadzone/iframe’y — też zarezerwuj miejsce. Użyj min-height lub aspect-ratio na kontenerze; w przypadku slotów reklamowych wytyczne Google Publisher Tag są jednoznaczne: “Setting a fixed height and width directly on the ad slot div is the most effective way to do this.” (tłumaczenie) „Ustawienie stałej wysokości i szerokości bezpośrednio na div slotu reklamowego to najskuteczniejszy sposób, aby to osiągnąć.” Dla slotów o wielu rozmiarach zarezerwuj miejsce dla największego skonfigurowanego rozmiaru. Przesuń późno ładujące się treści niżej, aby ewentualne resztkowe przesunięcia były poniżej linii zagięcia.
  • Dynamiczna treść — nie wstawiaj do przepływu. Zarezerwuj placeholder, który odpowiada końcowemu rozmiarowi, lub nałóż treść zamiast ją wstrzykiwać. Szkielety ładujące pomagają tylko jeśli dokładnie odpowiadają końcowym wymiarom — szkielet nawet o kilka pikseli krótszy niż rzeczywista treść nadal powoduje przesunięcie. Preferuj ładowanie wyzwalane przez użytkownika (“Załaduj więcej”) zamiast niespodziewanych wstawek.
  • Czcionki — dopasuj metryki. font-display: optional to jedyna wartość o praktycznie zerowym ryzyku CLS; swap minimalizuje niewidoczny tekst, ale może powodować przesunięcie przy zamianie. Jeszcze lepiej, użyj CSS-owych nadpisań metryk — size-adjust, ascent-override, descent-override, line-gap-override — aby dopasować czcionkę zapasową do czcionki internetowej, dzięki czemu zamiana będzie płynna. Wstępnie ładuj krytyczne czcionki.
  • Animacje — tylko transform. Animuj za pomocą transform (translate, scale, rotate) zamiast top/left/margin. Animacje oparte na transform są kompozytowane i nie wyzwalają układu, więc niczego nie przesuwają.

Jak CLS wpływa na rankingi (zachowaj proporcje)

CLS to jeden z elementów sygnału page experience Google. Google twierdzi, że Core Web Vitals są czymś, czego używają jego systemy rankingowe — ale obecna dokumentacja Search nie publikuje dokładnej wagi CLS, zasady tiebreakera ani gwarancji rankingowej, więc traktuj każdy konkretny mechanizm (w tym “to tiebreaker”) jako robocze przybliżenie, a nie udokumentowany fakt. Moja stała rada we wszystkim, co piszę na temat Core Web Vitals: wejdź w pasmo “dobry” i idź dalej. Większość stron nie zobaczy znaczącego wzrostu rankingów ani biznesu ze schodzenia z 0,08 do 0,02, a pojedynczy wynik rzadko sam w sobie wyjaśnia przychody czy konwersje. CLS to stawka podstawowa — chcesz przekroczyć poprzeczkę, ale nie powinno to stać się centralnym punktem twojego programu SEO kosztem LCP, INP, czy, szczerze mówiąc, twojej rzeczywistej treści.

Dwie praktyczne uwagi, które oszczędzają wiele zamieszania:

  • CrUX opóźnia się o ~28 dni. To ruchome okno 28-dniowe, więc poprawka, którą wdrożysz dzisiaj, nie w pełni odzwierciedli się w PageSpeed Insights ani Search Console przez tygodnie. Nie panikuj, gdy liczba nie zmieni się następnego ranka.
  • Przypisany element często nie jest pierwotną przyczyną. Interfejs API Layout Shift Attribution mówi Ci, który element się przesunął, ale jak zauważa web.dev, “it’s possible that these elements are only indirectly related to the ‘root cause’ of layout instability.” (tłumaczenie) „Możliwe, że te elementy są tylko pośrednio związane z „pierwotną przyczyną” niestabilności układu.” Tekst, który podskoczył, jest zwykle ofiarą obrazu bez rozmiaru powyżej niego, który ładuje się późno — napraw przyczynę, nie objaw. Pracuj nad tym jako pętla od znacznika czasu do wyzwalacza: zanotuj czas rozpoczęcia przesunięcia, a następnie sprawdź, co jeszcze zmieniło się w tym samym oknie — zakończenie żądania sieciowego, pojawienie się obrazu lub czcionki, zmianę rozmiaru lub zmianę klasy/stylu — i traktuj przypisany węzeł jako trop, a nie dowód, dopóki nie dopasujesz go do tego wyzwalacza.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.