Przesuwanie się layoutu (CLS)
Diagnostyka i naprawa problemów z Cumulative Layout Shift
Czym jest CLS (Cumulative Layout Shift)?
Cumulative Layout Shift (CLS) to metryka Core Web Vitals, która mierzy stabilność wizualną strony. CLS wskazuje, jak bardzo elementy strony przesuwają się podczas ładowania, co może być frustrujące dla użytkowników.
CLS jest obliczane poprzez sumowanie wszystkich nieoczekiwanych przesunięć layoutu podczas życia strony. Im wyższa wartość CLS, tym większe przesunięcia i gorsze doświadczenie użytkownika.
Najczęstsze przyczyny CLS
1. Obrazy bez wymiarów
Obrazy bez atrybutów width i height powodują przesunięcia, gdy przeglądarka rezerwuje przestrzeń dopiero po załadowaniu obrazu.
❌ Źle:
<img src="image.jpg" alt="Description" />
✅ Dobrze:
<img src="image.jpg" alt="Description" width="800" height="600" loading="lazy" />
2. Fonty bez font-display
Fonty bez font-display: swap mogą powodować FOIT (Flash of Invisible Text) lub FOUT (Flash of Unstyled Text), co prowadzi do przesunięć layoutu.
@font-face {
font-family: 'CustomFont';
src: url('font.woff2') format('woff2');
font-display: swap; /* Pokazuje fallback podczas ładowania */
}3. Dynamically injected content
Treść dodawana dynamicznie (reklamy, widgety, komentarze) może przesuwać istniejącą treść.
- Reklamy wstawiane przez JavaScript
- Widgety społecznościowe
- Komentarze ładowane asynchronicznie
- Embedded content (YouTube, mapy)
4. Animacje i transitions
Animacje, które zmieniają rozmiar lub pozycję elementów, mogą powodować przesunięcia layoutu.
✅ Używaj transform i opacity:
/* Dobrze - nie powoduje reflow */
.element {
transform: translateX(10px);
opacity: 0.8;
}
/* Źle - powoduje reflow */
.element {
top: 10px;
left: 10px;
}Diagnostyka
Krok 1: Sprawdź CLS w PageSpeed Insights
- Wejdź na PageSpeed Insights
- Sprawdź wartość CLS w sekcji Core Web Vitals
- Przejrzyj wizualizację przesunięć layoutu
Krok 2: Użyj Chrome DevTools
- Otwórz Chrome DevTools (F12)
- Przejdź do zakładki "Performance"
- Włącz "Web Vitals" overlay
- Nagraj ładowanie strony
- Sprawdź sekcję "Experience" - zaznaczone elementy to miejsca przesunięć
Krok 3: Web Vitals Extension
- Zainstaluj Web Vitals Extension
- Otwórz stronę i sprawdź wartość CLS w czasie rzeczywistym
- Scrolluj stronę, aby zobaczyć wszystkie przesunięcia
Naprawa
1. Dodaj wymiary do obrazów
Zawsze dodawaj atrybuty width i height do obrazów:
<img src="image.webp" alt="Description" width="800" height="600" loading="lazy" />
Dla responsywnych obrazów użyj aspect-ratio w CSS:
img {
width: 100%;
height: auto;
aspect-ratio: 16 / 9; /* Zachowuje proporcje */
}2. Rezerwuj miejsce dla dynamicznej treści
Dla reklam, widgetów i embedded content zarezerwuj miejsce w CSS:
/* Rezerwuj miejsce dla reklamy */
.ad-container {
min-height: 250px; /* Standardowa wysokość reklamy */
background-color: #f0f0f0;
}
/* Rezerwuj miejsce dla widgetu */
.social-widget {
min-height: 400px;
}3. Użyj font-display: swap
Zawsze używaj font-display: swap dla fontów:
@font-face {
font-family: 'MainFont';
src: url('/fonts/main-font.woff2') format('woff2');
font-display: swap;
}4. Preload krytycznych fontów
<link rel="preload" href="/fonts/main-font.woff2" as="font" type="font/woff2" crossorigin="anonymous" />
5. Unikaj animacji zmieniających layout
Używaj transform i opacity zamiast zmiany top/left/width/height:
❌ Źle:
.element {
animation: move 1s;
}
@keyframes move {
from { left: 0; }
to { left: 100px; }
}✅ Dobrze:
.element {
animation: move 1s;
}
@keyframes move {
from { transform: translateX(0); }
to { transform: translateX(100px); }
}Checklista optymalizacji CLS
Obrazy
- Dodaj width i height do wszystkich obrazów
- Użyj aspect-ratio dla responsywnych obrazów
- Unikaj obrazów bez określonych wymiarów
Fonty
- Użyj font-display: swap dla wszystkich fontów
- Preload krytycznych fontów
- Ustaw fallback font podobny do głównego
Dynamiczna treść
- Rezerwuj miejsce dla reklam i widgetów
- Użyj min-height dla kontenerów dynamicznej treści
- Unikaj wstawiania treści powyżej istniejącej treści