CLS Cumulative Layout Shift vermeiden
Technisches SEO 12 Min. Lesezeit

CLS vermeiden: Stabile Layouts für Stuttgarter Unternehmenswebsites

Layout-Shifts kosten Conversions und Rankings. Praxisleitfaden für mittelständische Sites in Stuttgart und der Region — mit konkreten Lösungen für Bilder, Fonts, Werbung und dynamische Inhalte.

Arnold Wender

Arnold Wender

SEO-Experte & Gründer

Aktualisiert: 8. Mai 2026
Inhaltsverzeichnis

Stellen Sie sich vor, ein Einkäufer eines Daimler-Zulieferers will gerade den „Datenblatt anfordern”-Button auf Ihrer B2B-Site klicken — und im letzten Moment springt das Layout, weil ein Produktbild nachlädt. Genau diese Frustmomente misst der Cumulative Layout Shift (CLS). Auch im Jahr 2026 zählt CLS zu den drei harten Ranking-Faktoren der Core Web Vitals — und beeinflusst direkt, ob aus einem Besuch eine Anfrage wird.

Nur 0%

aller Websites bestehen alle Core Web Vitals

Quelle: NitroPack 2026

0%

mehr Traffic-Verlust bei langsamen Seiten vs. schnellen Konkurrenten

Quelle: Dataslayer Research

0

ist der CLS-Grenzwert für 'Gut' (75. Perzentil)

Quelle: Google Search Central

Was steckt hinter CLS?

Cumulative Layout Shift quantifiziert, wie stark sich sichtbare Elemente während des Seitenladens unerwartet verschieben:

CLS = Summe aller unerwarteten Layout-Verschiebungen

CLS-Bewertung

CLS-WertBewertung
≤ 0.1Gut (grün)
0.1 - 0.25Verbesserungsbedürftig (orange)
> 0.25Schlecht (rot)

Warum sich Investitionen in CLS auszahlen

  1. User Experience: weniger Fehlklicks, weniger Frust — gerade auf Konfigurator-Seiten mit hoher Klickdichte
  2. Core Web Vitals: harter Ranking-Faktor seit 2021
  3. Conversion: instabile Layouts senken die Anfragenrate messbar — im B2B-Vertrieb ein direkter Umsatzhebel
  4. Barrierefreiheit: für Screenreader-Nutzer und Menschen mit motorischen Einschränkungen besonders relevant

CLS messen — die fünf belastbaren Wege

1. PageSpeed Insights

https://pagespeed.web.dev/

Liefert sowohl Lab- als auch Field-Daten — wichtig, weil reale Nutzer-Geräte (Service-Tablets, Werks-Laptops, ältere Smartphones) andere Werte produzieren als ein gutes Entwickler-MacBook.

2. Chrome DevTools

  1. DevTools öffnen (F12)
  2. Performance-Tab wählen
  3. Aufnahme starten und Seite neu laden
  4. „Layout Shift”-Einträge auswerten

3. Web Vitals Extension

Die Chrome-Erweiterung blendet CLS direkt im Browser ein — ideal für die schnelle Plausibilitätsprüfung beim Stakeholder-Meeting.

4. Search Console

Der Core-Web-Vitals-Bericht zeigt aggregiert, welche URL-Cluster Probleme machen.

5. JavaScript API für eigenes Monitoring

new PerformanceObserver((entryList) => {
  for (const entry of entryList.getEntries()) {
    if (!entry.hadRecentInput) {
      console.log('Layout Shift:', entry.value);
    }
  }
}).observe({ type: 'layout-shift', buffered: true });

Häufige CLS-Ursachen — und wie Sie sie systematisch beheben

1. Bilder ohne Dimensionsangaben

Problem:

<!-- SCHLECHT - keine Dimensionen -->
<img src="bild.jpg" alt="Beispiel">

Das Bild lädt asynchron nach und drückt nachfolgenden Content nach unten — ein Klassiker auf älteren Sites mittelständischer Maschinenbauer.

Lösung:

<!-- GUT - mit Dimensionen -->
<img src="bild.jpg" alt="Beispiel" width="800" height="600">

<!-- BESSER - mit aspect-ratio -->
<img src="bild.jpg" alt="Beispiel"
     style="aspect-ratio: 4/3; width: 100%; height: auto;">

CSS-Alternative:

.image-container {
  aspect-ratio: 16 / 9;
  background-color: #f0f0f0; /* Placeholder */
}

.image-container img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

2. Videos und Iframes

Problem:

<!-- SCHLECHT -->
<iframe src="https://youtube.com/embed/..."></iframe>

Auf Karriereseiten von Stuttgarter Unternehmen sieht man häufig YouTube-Embeds für Recruiting-Videos — ohne Container ein direkter CLS-Treiber.

Lösung:

<div class="video-container">
  <iframe src="https://youtube.com/embed/..."
          width="560" height="315"
          loading="lazy"></iframe>
</div>
.video-container {
  position: relative;
  padding-bottom: 56.25%; /* 16:9 */
  height: 0;
  overflow: hidden;
}

.video-container iframe {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}

3. Web Fonts (FOUT/FOIT)

Problem: Flash of Unstyled Text oder Invisible Text — gerade bei Corporate-Schriften aus dem CD-Manual ein häufiges Phänomen.

Lösung 1: font-display

@font-face {
  font-family: 'CustomFont';
  src: url('font.woff2') format('woff2');
  font-display: optional; /* oder: swap */
}
font-displayVerhalten
autoBrowser entscheidet
blockUnsichtbar, dann Custom
swapSystem-Font, dann Custom
fallbackKurz unsichtbar, System wenn zu langsam
optionalCustom nur wenn gecacht

Lösung 2: Preload

<link rel="preload" href="/fonts/font.woff2"
      as="font" type="font/woff2" crossorigin>

Lösung 3: Metriken anpassen

@font-face {
  font-family: 'CustomFont';
  src: url('font.woff2') format('woff2');
  font-display: swap;
  size-adjust: 105%;
  ascent-override: 90%;
  descent-override: 20%;
}

4. Werbeflächen und Affiliate-Banner

Problem: Ads laden nachträglich und schieben den Hauptcontent — kritisch für Fachpublikationen aus dem Stuttgarter Verlagswesen.

Lösung: Platzhalter mit fester Mindesthöhe

<div class="ad-container" style="min-height: 250px;">
  <!-- Ad wird hier eingefügt -->
</div>
.ad-container {
  min-height: 250px; /* Standard Ad-Höhe */
  background: #f5f5f5;
  display: flex;
  align-items: center;
  justify-content: center;
}

.ad-container::before {
  content: 'Werbung';
  color: #999;
  font-size: 12px;
}

Problem: Der Banner erscheint und schiebt den Hauptcontent nach unten — typisches Resultat halbherziger Consent-Implementierungen.

Lösung: Overlay statt Push

/* SCHLECHT - schiebt Content */
.cookie-banner {
  position: relative;
}

/* GUT - Overlay */
.cookie-banner {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  z-index: 9999;
}

6. Per JavaScript nachgeladener Content

Problem: Skeleton-Loader fehlen, der Platz wird erst beim Eintreffen der Daten reserviert.

Lösung: Skeleton-Pattern mit fester Mindesthöhe

<div class="dynamic-content" style="min-height: 200px;">
  <div class="skeleton-loader"></div>
</div>
.skeleton-loader {
  background: linear-gradient(
    90deg,
    #f0f0f0 25%,
    #e0e0e0 50%,
    #f0f0f0 75%
  );
  background-size: 200% 100%;
  animation: shimmer 1.5s infinite;
}

@keyframes shimmer {
  0% { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}

7. Tabs und Akkordeons

Problem: Tab-Inhalte unterschiedlicher Länge produzieren Layout-Sprünge — etwa in Konfiguratoren mit „Technische Daten | Lieferumfang | Optionen”-Tabs.

Lösung: Feste Mindesthöhe

.tab-content {
  min-height: 300px; /* Höhe des größten Tabs */
}

Oder: Transform statt Display

/* SCHLECHT */
.tab-panel { display: none; }
.tab-panel.active { display: block; }

/* GUT - kein Layout Shift */
.tab-panel {
  position: absolute;
  opacity: 0;
  visibility: hidden;
}
.tab-panel.active {
  position: relative;
  opacity: 1;
  visibility: visible;
}

8. Infinite Scroll und „Mehr laden”-Buttons

Problem: Neuer Content schiebt Footer und Navigation — auf E-Commerce-Shops mit Tausenden Artikeln im Schwabenland ein Dauerthema.

Lösung:

// Content unter dem Viewport einfügen, nie über
function addContent(items) {
  const container = document.querySelector('.content');
  const lastItem = container.lastElementChild;

  items.forEach(item => {
    // Am Ende einfügen, nicht am Anfang
    container.appendChild(item);
  });
}

CLS bei responsiven Layouts

Problem: Unterschiedliche Layouts auf Mobile und Desktop

/* Mobile */
.sidebar { display: none; }

/* Desktop */
@media (min-width: 768px) {
  .sidebar { display: block; }
}

Lösung: Container-Queries oder CSS clamp()

.content {
  width: clamp(300px, 70%, 800px);
}

Problem: Responsive Bilder mit srcset

<img srcset="small.jpg 400w,
             medium.jpg 800w,
             large.jpg 1200w"
     sizes="(max-width: 400px) 100vw, 800px"
     width="800" height="600"
     alt="Beispiel">

Wichtig: Alle Varianten müssen das identische Seitenverhältnis aufweisen — sonst springt das Layout zwischen Breakpoints.

JavaScript-basierte Lösungen

ResizeObserver für dynamische Inhalte

const observer = new ResizeObserver(entries => {
  for (const entry of entries) {
    // Höhe anpassen bevor Layout-Shift passiert
    entry.target.style.minHeight =
      `${entry.contentRect.height}px`;
  }
});

observer.observe(document.querySelector('.dynamic-content'));

IntersectionObserver für Lazy Loading

const imageObserver = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const img = entry.target;
      img.src = img.dataset.src;
      imageObserver.unobserve(img);
    }
  });
}, { rootMargin: '200px' }); // Früh genug laden

document.querySelectorAll('img[data-src]').forEach(img => {
  imageObserver.observe(img);
});

CLS-Debugging-Workflow

1. Problem identifizieren

// In der Konsole ausführen
new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    if (!entry.hadRecentInput) {
      console.log('CLS Entry:', entry);
      console.log('Element:', entry.sources);
    }
  }
}).observe({ type: 'layout-shift', buffered: true });

2. Element finden

Die sources-Property zeigt das verschiebende Element:

entry.sources.forEach(source => {
  console.log('Node:', source.node);
  console.log('Previous Rect:', source.previousRect);
  console.log('Current Rect:', source.currentRect);
});

3. Ursache beheben

ElementTypische UrsacheLösung
<img>Keine Dimensionenwidth/height setzen
<iframe>Keine DimensionenContainer mit aspect-ratio
TextFont-Loadingfont-display: optional
DivDynamischer Contentmin-height setzen
BannerPush statt Overlayposition: fixed

CLS optimieren — die kompakte Checkliste

Bilder & Medien

  • Alle Bilder haben width und height
  • Videos haben Container mit aspect-ratio
  • Lazy-loaded Bilder haben Platzhalter

Fonts

  • font-display: swap oder optional
  • Critical Fonts preloaded
  • Fallback-Fonts mit ähnlichen Metriken

Dynamischer Content

  • Ads haben reservierten Platz
  • Lazy-loaded Content hat min-height
  • Skeleton-Loader für async Content

Layout

  • Banner/Modals als Overlay
  • Tabs mit fester Mindesthöhe
  • Kein Content über dem Viewport eingefügt

Testing

  • PageSpeed Insights zeigt grünes CLS
  • Search Console ohne CLS-Warnungen
  • Real User Monitoring implementiert

Fortgeschrittene Techniken

CSS contain

.widget {
  contain: layout; /* Isoliert Layout-Berechnungen */
}

content-visibility

.offscreen-section {
  content-visibility: auto;
  contain-intrinsic-size: 0 500px; /* Geschätzte Höhe */
}

will-change (sparsam einsetzen)

.animated-element {
  will-change: transform;
}

Fazit

CLS-Optimierung ist kein Hexenwerk: explizite Dimensionen, reservierter Platz und ein paar bewusste Architekturentscheidungen lösen die meisten Probleme. Wer im Großraum Stuttgart B2B-Sites, Konfiguratoren oder Zulieferer-Portale betreibt, schützt mit stabilen Layouts gleichzeitig Conversion-Rate und Ranking — eine der seltenen Optimierungen, bei der UX-Verbesserung und SEO-Wirkung im selben Atemzug entstehen.

Für eine umfassende Core Web Vitals Optimierung prüfen wir gerne Ihre Website Seite für Seite.


FAQ

Warum ist mein CLS auf Desktop gut, aber Mobile schlecht?

Mobile Geräte haben andere Viewports, langsamere Netze und teilweise andere Layouts. Schriften und Bilder verhalten sich auf Mobile anders. Testen Sie beide Versionen separat — und ziehen Sie Real-User-Daten den Lab-Werten vor.

Zählen animierte Elemente zum CLS?

Nur dann, wenn sie andere Elemente verschieben. CSS-Transforms (translate, scale) verursachen keinen Layout Shift. Änderungen an width/height/margin schon — diese Unterscheidung wird in der Praxis oft übersehen.

Wie finde ich heraus, welches Element den Shift auslöst?

Chrome DevTools → Performance → Layout-Shift-Einträge anklicken. Alternativ über die JavaScript Performance API die sources-Property auswerten und gezielt das verantwortliche Element identifizieren.

Ist CLS wichtiger als LCP oder INP?

Alle drei Core Web Vitals sind gleichgewichtet. Seit März 2024 ersetzt INP (Interaction to Next Paint) den alten FID-Wert und misst Interaktivität strenger. CLS betrifft die gesamte Nutzersession, nicht nur den initialen Ladevorgang — daher besonders relevant für die User Experience. Zielwerte: LCP ≤ 2,5s, INP ≤ 200ms, CLS ≤ 0,1.

Arnold Wender, SEO-Experte

SEO-Experte & Gründer

Arnold Wender ist Gründer und Geschäftsführer der SEO-Agentur Stuttgart. Mit über 19 Jahren Erfahrung in der Suchmaschinenoptimierung hilft er Unternehmen, ihre Online-Sichtbarkeit nachhaltig zu verbessern.

Profil anzeigen