Inhaltsverzeichnis
Ein Disponent am Innenhafen will auf den “Sendung verfolgen”-Button tippen — und im selben Moment lädt das Hafenwetter-Widget nach und schiebt den Button drei Zentimeter nach unten. Statt der Sendung öffnet sich die Wetterdetailansicht. Genau diese Frustration misst der Cumulative Layout Shift (CLS), und sie bleibt auch 2026 ein harter Ranking-Faktor — gerade für Hafenlogistiker, Stahlhändler und Industrie-Plattformen, die mit dynamischen Modulen und Live-Daten arbeiten.
Was ist CLS?
CLS misst, wie viel sich sichtbare Elemente während des Seitenladens unerwartet verschieben:
CLS = Summe aller unerwarteten Layout-Verschiebungen
CLS-Bewertung
| CLS-Wert | Bewertung |
|---|---|
| ≤ 0.1 | Gut (grün) |
| 0.1 - 0.25 | Verbesserungsbedürftig (orange) |
| > 0.25 | Schlecht (rot) |
Warum CLS für Industrie-Plattformen besonders relevant ist
- Vermeidet Fehlklicks auf Buttons wie “Angebot anfordern” oder “Verfügbarkeit prüfen”
- Core Web Vitals als Ranking-Faktor seit 2021
- Conversions sinken auf instabilen B2B-Anfrageformularen drastisch
- Barrierefreiheit — kritisch für ältere Disponenten, die Lupenfunktion oder Screenreader nutzen
CLS messen
1. PageSpeed Insights
https://pagespeed.web.dev/
Zeigt CLS für Lab- und Field-Daten — also auch echte Werte aus Chrome-User-Daten Ihrer Disponenten und Kunden.
2. Chrome DevTools
- DevTools öffnen (F12)
- Performance-Tab
- Aufnahme starten und Seite neu laden
- “Layout Shift”-Einträge im Timeline suchen
3. Web Vitals Extension
Chrome-Erweiterung zeigt CLS in Echtzeit beim Surfen — sehr praktisch für tägliche QA-Checks.
4. Search Console
Core Web Vitals Bericht zeigt betroffene URL-Gruppen Ihrer Domain.
5. JavaScript API
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 beheben
1. Bilder ohne Dimensionen
Klassiker auf Referenz-Seiten: Drohnenfoto vom Innenhafen-Terminal lädt nach und schiebt die Case-Study nach unten.
Problem:
<!-- SCHLECHT — keine Dimensionen -->
<img src="terminal-innenhafen.jpg" alt="Containerterminal Duisburg">
Lösung:
<!-- GUT — mit Dimensionen -->
<img src="terminal-innenhafen.jpg" alt="Containerterminal Duisburg" width="1600" height="900">
<!-- BESSER — mit aspect-ratio -->
<img src="terminal-innenhafen.jpg" alt="Containerterminal Duisburg"
style="aspect-ratio: 16/9; width: 100%; height: auto;">
CSS-Alternative:
.referenz-bild {
aspect-ratio: 16 / 9;
background-color: #f0f0f0; /* Platzhalter */
}
.referenz-bild img {
width: 100%;
height: 100%;
object-fit: cover;
}
2. Videos und Iframes
Imagefilm einer Stahl-Walzstraße als YouTube-Embed:
Problem:
<!-- SCHLECHT -->
<iframe src="https://youtube.com/embed/walzstrasse-witten"></iframe>
Lösung:
<div class="video-container">
<iframe src="https://youtube.com/embed/walzstrasse-witten"
width="560" height="315"
loading="lazy"
title="Walzstraße ThyssenKrupp Witten"></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
Lösung 1: font-display
@font-face {
font-family: 'CorporateFont';
src: url('font.woff2') format('woff2');
font-display: optional; /* oder: swap */
}
| font-display | Verhalten |
|---|---|
auto | Browser entscheidet |
block | Unsichtbar, dann Custom-Font |
swap | System-Font, dann Custom-Font |
fallback | Kurz unsichtbar, System wenn zu langsam |
optional | Custom 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: 'CorporateFont';
src: url('font.woff2') format('woff2');
font-display: swap;
size-adjust: 105%;
ascent-override: 90%;
descent-override: 20%;
}
4. Dynamische Werbe- oder Partner-Banner
Ein Branchenportal für Hafenlogistik blendet Partner-Banner ein, die mit Verzögerung aus dem AdServer nachgeladen werden:
Lösung: Platzhalter reservieren
<div class="partner-banner" style="min-height: 250px;">
<!-- Banner wird hier eingefügt -->
</div>
.partner-banner {
min-height: 250px;
background: #f5f5f5;
display: flex;
align-items: center;
justify-content: center;
}
.partner-banner::before {
content: 'Partner-Anzeige';
color: #999;
font-size: 12px;
}
5. Cookie-Banner und Notifications
DSGVO-Banner sind ein klassischer CLS-Übeltäter — und ein juristisches Muss in NRW unter LDI-Aufsicht.
Lösung: Overlay statt Push
/* SCHLECHT — schiebt Content nach unten */
.cookie-banner {
position: relative;
}
/* GUT — schwebt über dem Content */
.cookie-banner {
position: fixed;
bottom: 0;
left: 0;
right: 0;
z-index: 9999;
}
6. Dynamisch nachgeladener Content
Live-Daten wie aktuelle Schiffspositionen oder Verfügbarkeitsanzeigen aus dem Lager:
Lösung: Platzhalter mit Skeleton-Loader
<div class="live-tracking" 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 in Produktdetailseiten
Stahl-Datenblätter mit Tabs für “Technische Daten”, “Lieferzeiten”, “Sicherheitshinweise”:
Lösung: Feste Mindesthöhe
.produktdaten-tab {
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”
Auf Produktlisten eines Recycling-Anbieters aus Bottrop:
Lösung:
// Content unten anhängen, nicht oben einfügen
function appendItems(items) {
const container = document.querySelector('.produktliste');
items.forEach(item => container.appendChild(item));
}
CLS bei responsiven Layouts
Problem: Unterschiedliche Layouts bei Desktop und Mobile
/* Mobile: Sidebar versteckt */
.sidebar { display: none; }
/* Desktop: Sidebar sichtbar */
@media (min-width: 768px) {
.sidebar { display: block; }
}
Lösung: clamp() oder Container-Queries
.content {
width: clamp(300px, 70%, 800px);
}
Problem: Responsive Bilder mit srcset
<img srcset="produkt-400.jpg 400w,
produkt-800.jpg 800w,
produkt-1200.jpg 1200w"
sizes="(max-width: 400px) 100vw, 800px"
width="800" height="600"
alt="Industriedichtung Witten 200mm DN200">
Alle Bilder müssen dasselbe Seitenverhältnis haben!
JavaScript-basierte Lösungen
Resize Observer für dynamische Inhalte
const observer = new ResizeObserver(entries => {
for (const entry of entries) {
entry.target.style.minHeight =
`${entry.contentRect.height}px`;
}
});
observer.observe(document.querySelector('.live-tracking'));
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' });
document.querySelectorAll('img[data-src]').forEach(img => {
imageObserver.observe(img);
});
CLS-Debugging Workflow
1. Problem identifizieren
// In der Browser-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. Verursachendes 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
| Element | Typische Ursache | Lösung |
|---|---|---|
<img> | Keine Dimensionen | width/height setzen |
<iframe> | Keine Dimensionen | Container mit aspect-ratio |
| Text | Font-Loading | font-display: optional |
| Div | Dynamischer Content | min-height setzen |
| Banner | Push statt Overlay | position: fixed |
CLS optimieren: Checkliste
Bilder & Medien
- Alle Bilder haben width und height
- Videos und Iframes mit aspect-ratio-Container
- Lazy-loaded Bilder haben Platzhalter
Fonts
- font-display: swap oder optional
- Critical Fonts preloaded
- Fallback-Fonts mit ähnlichen Metriken
Dynamischer Content
- Banner und Werbung mit reserviertem Platz
- Live-Daten mit min-height
- Skeleton-Loader für asynchrone Inhalte
Layout
- Cookie-Banner als fixed-Overlay
- Tabs mit fester Mindesthöhe
- Infinite Scroll hängt unten an, statt oben einzufügen
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;
}
Will-change (sparsam einsetzen)
.animated-element {
will-change: transform;
}
Fazit für Duisburger Industrie- und Logistik-Plattformen
CLS-Optimierung ist keine Hexerei — die meisten Probleme lassen sich mit expliziten Dimensionen und reserviertem Platz lösen. Investieren Sie in stabile Layouts, und Ihre Disponenten, Einkäufer und Lager-Mitarbeiter werden es Ihnen danken — und Ihre Rankings im Hafenlogistik- und Industrie-Cluster Duisburg ebenfalls.
Für eine umfassende Core Web Vitals-Optimierung und ein Audit Ihrer technischen SEO-Basis stehen wir bereit. Sehen Sie sich auch unseren Leitfaden zur LCP-Optimierung an oder vergleichen Sie regionale Performance-Strategien in Bochum, Essen und Mülheim. Performance-Spezialisten finden Sie auch im Schwesternetz unter seo-essen.com und webagentur-halle.de.
FAQ
Warum ist mein CLS auf Desktop gut, aber Mobile schlecht?
Unterschiedliche Layouts, Viewport-Größen und Ladezeiten. Fonts und Bilder verhalten sich auf Mobile anders, und Werbe-Banner laden über die mobile Datenleitung langsamer nach. Testen Sie beide Versionen separat in PageSpeed Insights.
Zählen animierte Elemente zum CLS?
Nur, wenn sie andere Elemente verschieben. CSS-Transforms (translate, scale) verursachen keinen Layout Shift. Änderungen an width, height oder margin schon.
Wie finde ich heraus, welches Element den Shift verursacht?
Chrome DevTools → Performance → Layout Shift Einträge anklicken. Oder die Performance API nutzen und entry.sources auswerten.
Ist CLS wichtiger als LCP oder INP?
Alle drei Core Web Vitals sind gleichwertig. Seit März 2024 hat INP (Interaction to Next Paint) den alten FID-Wert ersetzt und misst die Interaktivität strenger. CLS betrifft aber die gesamte Nutzersession, nicht nur den Ladevorgang — daher gerade auf Plattformen mit Live-Daten besonders relevant. Für Top-Rankings sollten alle drei Metriken im grünen Bereich liegen: LCP ≤ 2,5s, INP ≤ 200ms, CLS ≤ 0,1.