Probleme mit Cumulative Layout Shift (CLS) finden und beheben

So findest und behebst du alle Cumulative-Layout-Shift-Probleme mit RUM-Daten, Chrome DevTools und gezielten CSS- und HTML-Fixes

Arjen Karel
Aktualisiert am · 10 Min. Lesezeit
Teilen

Probleme mit Cumulative Layout Shift (CLS) finden und beheben

Diese Seite ist Teil unserer Reihe zu Cumulative Layout Shift (CLS). Der CLS misst die visuelle Stabilität deiner Seite, indem er unerwartete Verschiebungen von Inhalten erfasst. Ein guter CLS-Wert liegt unter 0,1. Werte über 0,25 sind schlecht. Wenn CLS neu für dich ist, starte auf der CLS-Übersichtsseite für Formel, Schwellenwerte und die Funktionsweise der Session-Windows.

Unter den Core Web Vitals schneidet der CLS am besten ab. Laut dem Web Almanac 2025 bestehen weltweit 72 % der Websites den CLS. Das klingt gut – bis du merkst, dass die meisten Entwickler CLS-Probleme auf dem eigenen Rechner nie sehen. Die Verschiebungen treffen Erstbesucher mit langsamer Verbindung. Wenn du in den DevTools mit aufgewärmtem Cache nachschaust, sieht alles gut aus. Genau deshalb ist CLS so tückisch zu debuggen.

Dieser Leitfaden basiert auf genau dem Prozess, den ich bei CLS-Beratungen nutze. Zuerst CrUX- und RUM-Daten, dann in Chrome validieren und schließlich den Fix schreiben.

Zuletzt überprüft von Arjen Karel im März 2026

CLS-TIPP: Der CLS wird in Session-Windows gemessen, nicht als Gesamtsumme. Der Browser fasst Layout-Verschiebungen in Sessions zusammen (maximal 5 Sekunden, 1 Sekunde Pause zwischen Verschiebungen). Dein CLS-Wert entspricht der schlechtesten Session. Schon eine einzige Häufung von Verschiebungen beim Laden der Seite kann deinen CLS durchfallen lassen – selbst wenn der restliche Besuch völlig stabil bleibt.

Schritt 1: CLS in der Search Console prüfen

Bevor du etwas änderst, stelle sicher, dass du wirklich ein CLS-Problem hast. Melde dich in der Google Search Console an, navigiere zu den Core Web Vitals und prüfe sowohl Mobilgeräte als auch Desktop.

Markiert Google URLs mit „CLS-Problem: mehr als 0,25“ oder „CLS-Problem: mehr als 0,1“, hast du die Bestätigung aus dem Chrome User Experience Report (CrUX): Echte Nutzer erleben auf deiner Website Layout-Verschiebungen.

Anders als bei LCP und INP, wo es auf Rechenleistung und Netzwerk-Geschwindigkeit ankommt, sind CLS-Probleme oft geräte- oder bildschirmabhängig. Wenn das gleiche Problem Mobilgeräte und Desktop betrifft (Bilder ohne Maße, Font-Swaps, dynamisch eingefügte Inhalte), meldet Desktop wegen der Bildschirmgröße oft einen deutlich höheren CLS-Wert. Der Grund: Ein größerer Teil des sichtbaren Viewports verschiebt sich. Die Search Console fasst URLs zusammen. Sie zeigt dir also, welche Seitentypen betroffen sind – aber nicht, welche Elemente sich verschieben. Dafür brauchst du Real User Monitoring.

Google Search Console showing INP issue: longer than 200ms (mobile) with 2.07M affected URLs

Schritt 2: CLS-Probleme mit RUM-Daten identifizieren

Die Search Console bestätigt zwar, dass das Problem existiert, liefert dir aber kaum Ansatzpunkte. Du musst herausfinden, welche Elemente sich verschieben – auf welchen Seiten und unter welchen Bedingungen. Dafür brauchst du ein RUM-Tool.

Ich habe CoreDash gebaut, um genau diese Fragen zu beantworten. Du bindest ein einziges Script-Tag ein, und das Tool sammelt CLS-Attributionsdaten von jedem echten Besucher. Der entscheidende Datenpunkt beim CLS-Debugging ist das sich verschiebende Element: der eigentliche DOM-Knoten, der sich bewegt hat. Ohne diese Information debuggst du blind.

Sich verschiebende Elemente finden

Gruppiere deine CLS-Daten zuerst nach Elementen. Navigiere in CoreDash zur CLS-Seite und sortiere die Datentabelle nach „CLS by Element“. So siehst du, welche Elemente über alle Besucher hinweg die meisten Layout-Verschiebungen verursachen. Klicke auf den schlechtesten Eintrag, um alle Metriken auf die Seiten zu filtern, auf denen sich genau dieses Element verschoben hat.

CoreDash showing CLS scores broken down by shifting element.

Betroffene Seiten finden

Prüfe nach dem Filtern nach dem folgenschwersten Element die URL-Aufschlüsselung. CLS-Probleme können die gesamte Website oder nur bestimmte Templates betreffen. Jetzt sehen wir, ob sich der CLS auf bestimmten Seitentypen häuft: Produktseiten mit Bildergalerien, Blogbeiträge mit Werbeplätzen oder Landingpages mit Hero-Animationen. Wenn du weißt, welche Seiten durchfallen, weißt du, worauf du dich konzentrieren musst.

Erstbesucher vs. wiederkehrende Besucher prüfen

Diesen schnellen Check mache ich immer – und er ist wichtiger, als die meisten denken. CLS durch Font-Swaps tritt nur auf, wenn der Web-Font nicht gecacht ist. CLS durch width: auto bei Bildern entsteht nur, wenn das Bild nicht im Browser-Cache liegt. Ist dein CLS bei Erstbesuchern deutlich schlechter, hast du es mit einer cache-abhängigen Verschiebung zu tun. Als Entwickler siehst du sie auf deinem Rechner nie, außer du deaktivierst den Cache (Tipp: Deaktiviere in Chrome immer den Cache ... aber das ist eine andere Geschichte).

Gerätetypen und Viewport-Größen prüfen

Beim CLS zeigt sich zwischen Mobilgeräten und Desktop meist ein anderes Muster als bei LCP und INP. Responsive Layouts können Verschiebungen verursachen, die nur bei ganz bestimmten Viewport-Breiten und -Höhen auftreten. Ein Werbeplatz, der auf dem Desktop Probleme macht, liegt mobil vielleicht gar nicht im Viewport. Ein Navigationsmenü animiert bei kleineren Breakpoints möglicherweise anders. Gruppiere deine CLS-Daten nach Gerätetyp, um zu sehen, wo die Verschiebungen auftreten.

Schritt 3: CLS mit Chrome debuggen

Deine RUM-Daten haben dir gezeigt, welche Elemente sich verschieben und warum. Jetzt reproduzierst du das Problem lokal und findest die Ursache.

Den Core Web Vitals Visualizer nutzen

Layout-Verschiebungen siehst du am schnellsten mit der Chrome-Erweiterung Core Web Vitals Visualizer. Lade die Seite, klicke auf das Icon der Erweiterung und lade neu. Jede Layout-Verschiebung wird farbig hervorgehoben – du siehst genau, was sich wie weit bewegt hat. Ich nutze das immer als ersten Schritt, noch bevor ich das Performance-Panel öffne, weil es sofort ein visuelles Ergebnis liefert.

Core Web Vitals Visualizer showing layout shifts highlighted on the page.

Bedingungen in Chrome nachstellen und Netzwerk-Screenshots prüfen

Mit aufgewärmtem Cache sind CLS-Probleme oft unsichtbar. Öffne die DevTools, deaktiviere den Cache im Network-Tab und drossle die Verbindung auf „Slow 4G“ (mein Favorit: das deckt CLS durch Race-Conditions auf). Klicke nun auf das Zahnrad-Symbol und deaktiviere das Caching (bei geöffneten DevTools). Das simuliert die Bedingungen von Erstbesuchern. Aktiviere im Network-Tab die Screenshots. Lade die Seite neu und achte auf Verschiebungen.

Chrome DevTools Network tab with screenshots showing request timing for CLS analysis

Das Performance-Panel in Chrome nutzen

Die meisten Layout-Verschiebungen lassen sich leicht erkennen, wenn man weiß, wie. Manchmal entgehen sie einem trotzdem. Dann ist es Zeit, die Chrome DevTools zu öffnen (Strg+Umschalt+I) und für ein detailliertes Debugging ins Performance-Panel zu wechseln. Drücke Strg+Umschalt+E, um die Seite neu zu laden und aufzuzeichnen. Scrolle nach dem Laden ein paarmal hoch und runter. Stoppe die Aufzeichnung.

Suche nach der Spur „Layout Shifts“. Jede Verschiebung wird als farbiger Block dargestellt. Klicke auf eine Verschiebung, um folgende Details zu sehen:

  • Der verschobene Knoten: das DOM-Element, das sich bewegt hat
  • Der Shift-Score: Impact Fraction multipliziert mit Distance Fraction
  • hadRecentInput: ob der Verschiebung eine Nutzereingabe vorausging (Klicks und Taps haben eine Toleranzzeit von 500 ms, Scrollen nicht)

Achte darauf, wann die Verschiebungen auftreten. Verschiebungen beim Laden der Seite deuten auf Bilder ohne Maße, Font-Swaps oder CSS-Transitions hin. Verschiebungen beim Scrollen weisen auf scroll-gesteuerte Animationen mit Layout-Eigenschaften hin.

Chrome Performance panel showing layout shift entries during scrolling.

Schnelltest: Alle Transitions deaktivieren

CSS-Transitions, die Layout-Eigenschaften animieren, sind eine tückische CLS-Ursache: Sie verschieben Inhalte nur während der Ladephase und lassen sich schwer reproduzieren. Füge dieses Snippet in die Konsole ein, lade die Seite mit deaktiviertem Cache komplett neu (Hard Reload) und vergleiche den CLS:

document.head.insertAdjacentHTML('beforeend',
  '<style>*{transition-property:none!important}</style>');

Sinkt dein CLS nach dem Deaktivieren der Transitions, hast du die Ursache gefunden. Nutze den Leitfaden zum Debuggen von CSS-Transitions, um die verantwortlichen Transitions aufzuspüren.

CLS mit der Layout Instability API messen

Die Layout Instability API gibt dir in JavaScript direkten Zugriff auf jede Layout-Verschiebung. Das ist dieselbe API, die RUM-Tools unter der Haube nutzen:

const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    if (!entry.hadRecentInput) {
      console.log('Layout shift:', {
        value: entry.value,
        sources: entry.sources?.map(s => ({
          node: s.node,
          previousRect: s.previousRect,
          currentRect: s.currentRect
        }))
      });
    }
  }
});
observer.observe({ type: 'layout-shift', buffered: true });

Das Array sources zeigt, welche Elemente sich bewegt haben. hadRecentInput filtert erwartete Verschiebungen durch Klicks und Taps heraus. Für Messungen in der Produktion nutzt du CoreDash oder ein anderes RUM-Tool.

Schritt 4: CLS-Probleme beheben

Du weißt, welche Elemente sich verschieben und warum. Jetzt geht es an die Behebung. Der CLS hat keine aufeinanderfolgenden Phasen wie der LCP. Stattdessen lassen sich Layout-Verschiebungen in klare Ursachen unterteilen. Hier sind die häufigsten – in der Reihenfolge, wie sie mir bei Audits begegnen.

1. Bilder, Videos und Iframes ohne Maße

Das ist die häufigste Ursache für CLS im Web. Laut dem Web Almanac 2025 haben 62 % der mobilen Seiten mindestens ein Bild ohne Maße. Der Fix: Gib bei <img>-, <video>- und <iframe>-Tags immer die Attribute width und height an.

<img src="hero.jpg" width="800" height="450" alt="Description">

<style>
img {
    height: auto;
    max-width: 100%;
}
</style>

Pass bei width: auto in deinem CSS auf. Diese eine Deklaration überschreibt die Seitenverhältnis-Berechnung des Browsers und verursacht Layout-Verschiebungen – selbst wenn width und height im HTML korrekt gesetzt sind. Das habe ich auf Dutzenden Websites gesehen: Im Markup war alles richtig, aber eine globale CSS-Regel wie img { width: auto; height: auto; max-width: 100%; } hat alles zunichtegemacht. Die ausführliche Erklärung findest du unter Layout-Verschiebungen durch automatische Bildgrößen beheben. Einen umfassenden Leitfaden zu allen CLS-Ursachen bei Bildern und Medien (Videos, Iframes, Art Direction, responsive Bilder, lazy loading, Platzhalter) findest du unter Wie Bilder und Medien Layout-Verschiebungen verursachen.

2. Web-Font-Swaps

Wenn ein Web-Font lädt und den Fallback-Font ersetzt, führt der Größenunterschied zu einer Layout-Verschiebung. Laut dem Web Almanac 2025 nutzen nur 11 % der Seiten ein Preloading für Web-Fonts. Die überwiegende Mehrheit der Websites ist daher anfällig für CLS durch Font-Swaps.

Der Fix besteht aus zwei Schritten. Passe zuerst den Fallback-Font über metrische Overrides an die Maße des Web-Fonts an:

<style>
@font-face {
    font-family: 'My Font Fallback';
    src: local('Arial');
    size-adjust: 105.2%;
    ascent-override: 93%;
    descent-override: 24%;
    line-gap-override: 0%;
}

@font-face {
    font-family: 'My Font';
    src: url('/fonts/myfont.woff2') format('woff2');
    font-display: swap;
}

body {
    font-family: 'My Font', 'My Font Fallback', sans-serif;
}
</style>

Nutze einen Fallback-Font-Generator, um die passenden Override-Werte für deine Schriftkombination zu ermitteln. Zweitens: Beschleunige die Auslieferung: Hoste deine Fonts selbst, lade kritische Font-Dateien per Preload und nutze WOFF2 mit Subsetting. Eine vollständige Strategie findest du unter Responsives Laden von Web-Fonts und Sicherstellen, dass Text beim Laden von Web-Fonts sichtbar bleibt.

3. CSS-Animationen und -Transitions

Laut dem Web Almanac 2025 laufen auf 40 % der mobilen Seiten Non-Composited Animations. Diese animieren Eigenschaften wie width, height, top, left, margin und padding, die bei jedem Frame eine Layout-Neuberechnung auslösen.

Der häufigste Übeltäter ist transition: all. Wer transition: all .3s ease schreibt, animiert jede Eigenschaftsänderung – auch Layout-Eigenschaften. Wenn Elemente beim Laden der Seite vom ungestylten in den gestylten Zustand übergehen, erzeugt das unregelmäßige Layout-Verschiebungen. Diese lassen sich kaum reproduzieren. Ich sehe dieses Muster ständig.

Der Fix: Ersetze layout-auslösende Eigenschaften durch Compositor-Eigenschaften.

  • Nutze transform: translateY() statt top/bottom
  • Nutze transform: translateX() statt left/right
  • Nutze transform: scale() statt width/height
  • Nutze opacity statt visibility in Kombination mit Höhenänderungen
  • Nutze niemals transition: all. Gib die genaue Eigenschaft an: transition: background-color .2s ease

transform und opacity laufen komplett auf dem Compositor-Thread und triggern niemals das Layout. Den kompletten Debugging-Prozess findest du unter Layout-Verschiebungen durch CSS-Transitions.

4. Anzeigen, Embeds und dynamisch eingefügte Inhalte

Anzeigen laden spät und schieben Inhalte nach unten. Cookie-Banner ploppen auf und verschieben die Seite. AJAX-Requests fügen neue Inhalte ein, ohne vorher Platz zu reservieren. Das ist immer dasselbe Problem: Auf der Seite erscheint etwas, von dem der Browser beim Rendern noch nichts wusste.

Die Lösung für all das: Platz reservieren. Setze für Werbeplätze ein min-height, das der erwarteten Anzeigengröße entspricht:

<style>
.ad-slot {
    min-height: 250px;
    contain: layout style;
}
@media (min-width: 600px) {
    .ad-slot { min-height: 90px; }
}
</style>

Die Deklaration contain: layout style isoliert den Werbecontainer vom Rest der Seite. Nutze für Cookie-Banner position: fixed als Overlay, statt Inhalte nach unten zu drücken. Reserviere für AJAX-Inhalte Platz mit min-height. Du musst die Größe nicht auf den Pixel genau erraten: Eine Abweichung von 50 Pixeln verursacht weit weniger CLS als eine 400-Pixel-Verschiebung ohne Platzreservierung.

Nutze bei Drittanbieter-Embeds wie YouTube, Google Maps und Chat-Widgets das Facade-Pattern: Zeige einen statischen Platzhalter an und lade das echte Embed erst, wenn der Nutzer damit interagiert. Null CLS, null verschwendete Ressourcen.

5. Durch Scrollen ausgelöste Layout-Verschiebungen

Diese CLS-Ursache wird Lighthouse nie entdecken. Lighthouse scrollt die Seite nicht. Deshalb sind scroll-ausgelöste Layout-Verschiebungen in Lab-Tests völlig unsichtbar. Du findest sie nur über RUM-Daten oder indem du im Performance-Panel manuell beim Scrollen einen Trace aufzeichnest.

Das häufigste Beispiel ist ein Hide-on-Scroll-Header, der die Eigenschaft top animiert. Was die meisten Entwickler nicht wissen: Scrollen ist in der Layout Instability Specification keine ausgenommene Eingabe. Klicks und Taps haben eine Toleranzzeit von 500 ms. Scrollen nicht. Jede durch Scrollen ausgelöste Verschiebung fließt voll in deinen CLS-Wert ein.

Der Fix: Nutze bei jeder scroll-ausgelösten Animation transform: translateY() statt top. Das Gleiche gilt für Parallax-Effekte, schrumpfende Navigationsleisten und scroll-abhängige Fortschrittsbalken. Bewegt sich etwas beim Scrollen, animiere es mit transform. Eine ausführliche Anleitung mit Video-Beispielen findest du unter Wie scroll-ausgelöste Animationen CLS verursachen.

Checkliste für schnelle Fixes

CLS-Ursache Erkennung Fix
Bilder/Videos ohne Maße Lighthouse-Audit „unsized images“ width und height ergänzen; width: auto aus dem CSS entfernen
Web-Font-Swaps RUM: CLS nur beim ersten Besuch schlechter Font-Metric-Overrides; WOFF2 vorab laden (Preload); Fonts selbst hosten
CSS-Transitions Konsolen-Snippet, um alle Transitions aufzulisten transition: all durch spezifische Eigenschaften ersetzen; transform/opacity nutzen
Spät ladende Anzeigen RUM-Attribution zeigt Ad-Container-Elemente min-height für Ad-Slots; contain: layout style
Cookie-Consent-Banner CLS-Spitze beim Erstbesuch; Banner in Attributionsdaten position: fixed als Overlay nutzen, statt Inhalte zu verschieben
Scroll-Animationen Performance-Trace beim Scrollen; Field-CLS > Lab-CLS top/left/height durch transform ersetzen

Weiterführende Leitfäden

Eine vollständige Übersicht aller Core Web Vitals findest du im Core-Web-Vitals-Hub oder nutze die ultimative Core-Web-Vitals-Checkliste, um deine gesamte Website zu prüfen.

About the author

Arjen Karel is a web performance consultant and the creator of CoreDash, a Real User Monitoring platform that tracks Core Web Vitals data across hundreds of sites. He also built the Core Web Vitals Visualizer Chrome extension. He has helped clients achieve passing Core Web Vitals scores on over 925,000 mobile URLs.

Arjen Karel

Brauchst du eine schnellere Website?

Ich bin Arjen und mache seit 17 Jahren langsame Websites schnell. Wenn du auf Probleme stößt, die du nicht selbst lösen kannst, schick mir deine URL und wir reden darüber.

Schick mir deine URL
Arjen Karel
Arjen Karel, Web-Performance-Consultant seit 2009

Warum funktioniert unser Fix nicht?

Manchmal liefert das CDN noch das alte HTML aus, oder der Fix steckt im Desktop-Template und Mobilgeräte nutzen ein anderes. Schick mir deine URL und das Problem, dann antworte ich mit ein paar Terminvorschlägen. Ich prüfe zuerst deine Field Data, dann arbeiten wir eine Stunde an deiner Website, und innerhalb eines Tages hast du meine Notizen schriftlich. 350 € zzgl. MwSt.

Schick mir deine URL

Kein Entwickler für den Fix? Ich mache die Arbeit selbst, auf einer Kopie deiner Website.