CLS - jak naprawić Cumulative Layout Shift

CLS (Cumulative Layout Shift) mierzy niestabilność wizualną strony - jak bardzo elementy przesuwają się podczas ładowania. Irytujące przeskoki layoutu nie tylko frustrują użytkowników, ale też negatywnie wpływają na SEO. Dobry CLS to poniżej 0.1.

Krótka odpowiedź

Główne przyczyny CLS to: obrazy bez wymiarów, reklamy i embedy bez zarezerwowanego miejsca, dynamicznie ładowane treści, web fonty powodujące FOIT/FOUT. Napraw przez: dodanie width/height do obrazów, rezerwację miejsca dla reklam, font-display: optional/swap, unikanie wstawiania treści nad istniejącą.

Czym jest CLS i jak jest mierzony

Cumulative Layout Shift sumuje wszystkie nieoczekiwane przesunięcia layoutu podczas całego życia strony.

Wzór:
CLS = Impact fraction × Distance fraction
- Impact fraction: % viewport zajęty przez przesuwający się element
- Distance fraction: jak daleko się przesunął (% viewport)

Progi oceny:
- Dobry: ≤ 0.1
- Wymaga poprawy: 0.1 - 0.25
- Słaby: > 0.25

Co NIE jest liczone jako layout shift:
- Przesunięcia w odpowiedzi na interakcję użytkownika (klik, scroll)
- Przesunięcia w ciągu 500ms od interakcji
- Elementy poza viewport

Co JEST liczone:
- Przesunięcia bez interakcji użytkownika
- Elementy zmieniające rozmiar (np. obrazy bez wymiarów)
- Dynamicznie wstawiane treści

Najczęstsze przyczyny złego CLS

1. Obrazy bez wymiarów:
Przeglądarka nie zna rozmiaru obrazu dopóki się nie załaduje. Tekst pod obrazem "skacze".
```html

...

...
```

2. Reklamy, embedy, iframes:
Dynamicznie ładowane elementy o nieznanym rozmiarze. Rozwiązanie: kontener z min-height.

3. Web fonty (FOIT/FOUT):
Font-display: swap powoduje przeskok gdy font się załaduje. Użyj font-display: optional lub dopasuj rozmiar fallback fontu.

4. Dynamicznie wstawiane treści:
Banery cookies, powiadomienia, chat widget wstawiane na górze strony.

5. Animacje zmieniające layout:
Animacje używające top/left/width/height zamiast transform.

Jak naprawić CLS - praktyczne rozwiązania

Obrazy i video:
- Zawsze dodawaj width i height
- Używaj aspect-ratio w CSS: `aspect-ratio: 16 / 9;`
- Placeholder (blur, solid color) przed załadowaniem

Reklamy i embedy:
```css
.ad-container {
min-height: 250px; /* lub dokładny rozmiar reklamy */
}
```

Fonty:
```css
@font-face {
font-family: 'MyFont';
font-display: optional; /* Lub swap z dopasowanym fallbackiem */
}
```
Użyj narzędzia Font Style Matcher do dopasowania metryki fallback fontu.

Dynamiczne treści:
- Wstawiaj na dole strony, nie na górze
- Rezerwuj miejsce z góry jeśli znasz rozmiar
- Używaj overlay zamiast wstawiania do DOM

Animacje:
```css
/* Źle - powoduje layout shift */
.element { left: 0; transition: left 0.3s; }
/* Dobrze - nie powoduje layout shift */
.element { transform: translateX(0); transition: transform 0.3s; }
```

Debugowanie CLS

Chrome DevTools > Performance:
1. Nagraj ładowanie strony
2. Zaznacz "Layout Shift Regions" w ustawieniach
3. Zobacz czerwone ramki wokół przesuwających się elementów

Web Vitals Extension:
Pokazuje CLS w czasie rzeczywistym. Kliknij, żeby zobaczyć szczegóły każdego shift.

Layout Shift Debugger (snippet):
```javascript
new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
console.log('Layout shift:', entry);
}
}).observe({type: 'layout-shift', buffered: true});
```

Search Console > Core Web Vitals:
Pokazuje URL-e z problemami CLS na danych rzeczywistych użytkowników.

Testuj na wolnym połączeniu:
Problemy CLS często ujawniają się dopiero przy wolnym internecie (np. 3G w DevTools).

Wspomniane narzędzia

Chrome DevTools PageSpeed Insights Web Vitals Extension Layout Shift Debugger

Najczęściej zadawane pytania

Czy CLS jest mierzony tylko podczas ładowania?
Nie, CLS jest mierzony przez całe życie strony. Przesunięcia po scrollowaniu, kliknięciu w tab, czy załadowaniu lazy content też są liczone (jeśli nie są odpowiedzią na bezpośrednią interakcję).
Jak naprawić CLS spowodowany przez reklamy AdSense?
Ustaw min-height na kontenerze reklamy równy typowemu rozmiarowi (np. 250px). Możesz też użyć CSS aspect-ratio. Dla responsywnych reklam trudniej - rozważ lazy loading reklam poniżej fold.
#cls#core-web-vitals#layout-shift#optymalizacja#ux

Potrzebujesz pomocy specjalisty?

Skorzystaj z naszych usług w największych miastach Polski