Zum Inhalt springen
Core Web Vitals Spezialisten
Alle Artikel Performance

Critical CSS: Sichtbarer Bereich in Millisekunden

13 Min. Lesezeit
Critical CSSCSSLCPFrontendAbove the Fold

CSS ist eine Render-Blocking Resource: Der Browser rendert keinen einzigen Pixel, solange die CSS-Dateien nicht vollständig geladen und geparst sind. Bei einem typischen Online-Shop mit 200–400 KB CSS (unkomprimiert) bedeutet das: Der Nutzer starrt auf einen weißen Bildschirm, während der Browser stylesheets herunterlädt, die zu 85–95 % für den aktuell sichtbaren Bereich irrelevant sind (Quelle: HTTP Archive, 2025). Critical CSS löst dieses Problem, indem nur die CSS-Regeln, die für den sichtbaren Bereich (Above the Fold) benötigt werden, inline im HTML-Head eingebettet werden. Der Rest wird asynchron nachgeladen. Das Ergebnis: Der sichtbare Bereich rendert in Millisekunden statt Sekunden, der LCP-Wert verbessert sich typischerweise um 40–60 % und der First Contentful Paint fällt unter eine Sekunde (Projekterfahrung). Dieser Artikel erklärt den gesamten Prozess von der Extraktion über die Implementierung bis zur Automatisierung.

Critical CSS: Above-the-Fold Rendering PipelineOhne Critical CSSHTML geladen - warte auf CSS...Render-Blocking: styles.css (180 KB)Render-Blocking: vendor.css (95 KB)Blockiert 1.8sLCP: 3.2sFCP: 2.4sWeisser Bildschirm bis CSS vollstaendig geladenMit Critical CSSInline Critical CSS (8 KB im HTML-Head)Header, Hero, Navigation, Typografie, LayoutSofortiges Rendering des sichtbaren BereichsRest-CSS async nachladen: media=print, onload=this.media=allLCP: 1.4sFCP: 0.6sSofort sichtbarer Inhalt, Rest laedt im HintergrundErgebnis: 56% schnellerer LCP | 75% schnellerer FCP1. ExtrahierenCritical-Path-CSS fuer denViewport identifizierenPenthouse, Critical, Critters2. InlinenCritical CSS als style-Tagim HTML-Head einbettenMax. 14 KB (TCP Window)3. Defer RestVollstaendiges CSS asyncnachladen nach Renderingmedia=print + onload TrickHaeufige Fehler vermeidenZu viel CSS inlinedWeb-Fonts vergessenFOUC nicht getestetKein Fallback-Styling

Warum CSS das Rendering blockiert

Um zu verstehen, warum Critical CSS so wirkungsvoll ist, muss man den Rendering-Prozess des Browsers kennen. Wenn der Browser ein HTML-Dokument empfängt, baut er den DOM-Baum (Document Object Model) auf. Parallel dazu lädt er die referenzierten CSS-Dateien und baut den CSSOM-Baum (CSS Object Model) auf. Erst wenn beide Bäume vollständig aufgebaut sind, kann der Browser den Render Tree konstruieren – die Kombination aus DOM und CSSOM, die bestimmt, welche Elemente sichtbar sind und wie sie dargestellt werden. Solange der CSSOM nicht vollständig ist, rendert der Browser nichts.

Dieses Verhalten ist beabsichtigt: Der Browser wartet auf das CSS, um einen Flash of Unstyled Content (FOUC) zu vermeiden – das kurze Aufblitzen von ungestyltem HTML, bevor das CSS geladen ist. Ohne diese Blockierung würde der Nutzer zunächst rohen Text ohne Layout, Farben oder Typografie sehen, der dann plötzlich in das gestylte Design umspringt. Das ist eine schlechte Nutzererfahrung, die der Browser durch das Render-Blocking verhindert.

Das Problem entsteht, wenn die CSS-Dateien groß sind und lange zum Laden brauchen. Eine typische Shopware-Installation lädt 150–300 KB CSS (unkomprimiert), ein WordPress-Theme mit mehreren Plugins 200–500 KB. Selbst mit Brotli-Kompression auf 40–80 KB dauert der Download auf einer 3G-Mobilverbindung 300–800 Millisekunden – Zeit, in der der Nutzer einen weißen Bildschirm sieht. Critical CSS reduziert die Render-Blocking-Zeit auf die Dauer, die der Browser zum Parsen von 5–14 KB Inline-CSS benötigt: typischerweise unter 50 Millisekunden.

Was genau ist Critical CSS?

Critical CSS (auch Critical-Path CSS oder Above-the-Fold CSS) ist die minimale Teilmenge der gesamten CSS-Regeln einer Seite, die für das Rendering des sichtbaren Bereichs (Viewport) benötigt wird. Dazu gehören alle CSS-Regeln, die auf Elemente angewendet werden, die beim initialen Seitenaufruf sichtbar sind: Header, Navigation, Hero-Bereich, erste Textabschnitte und deren Layout, Typografie, Farben und Abstände.

Die Extraktion von Critical CSS ist konzeptionell einfach: Man bestimmt, welche HTML-Elemente im initialen Viewport sichtbar sind, sammelt alle CSS-Regeln, die auf diese Elemente angewendet werden (inklusive Media Queries, Pseudo-Elemente und vererbte Styles) und entfernt alles andere. In der Praxis ist dieser Prozess komplex, weil er vom Viewport abhängt (Mobile vs. Desktop), von dynamischen Inhalten (JavaScript-gerenderte Elemente) und von CSS-Spezifitäten (eine Regel für ein Element unterhalb des Folds kann Styles für ein Element oberhalb des Folds beeinflussen).

Die ideale Größe des Critical CSS liegt bei unter 14 KB (komprimiert). Dieser Wert ist nicht willkürlich: Das TCP-Protokoll verwendet ein Initial Congestion Window von typischerweise 10 TCP-Segmenten (ca. 14.600 Bytes). Alles, was in dieses erste Fenster passt, wird in einem einzigen Netzwerk-Roundtrip übertragen. Wenn das HTML-Dokument inklusive Critical CSS unter 14 KB bleibt, kann der Browser den sichtbaren Bereich bereits nach dem ersten Roundtrip rendern – ohne auf weitere Datenpakete warten zu müssen (Quelle: Google, 2024).

Critical CSS extrahieren: Tools und Methoden

Die Extraktion von Critical CSS kann manuell oder automatisiert erfolgen. Die manuelle Extraktion ist für kleine Websites mit wenigen Template-Typen praktikabel: Die Chrome DevTools Coverage-Funktion (Ctrl+Shift+P, "Coverage") zeigt für jede CSS-Datei, welche Regeln auf der aktuellen Seite verwendet werden und welche nicht. Die nicht-verwendeten Regeln werden entfernt, die verwendeten Regeln für den Above-the-Fold-Bereich identifiziert und in ein separates Critical-CSS-File extrahiert.

Für größere Websites und automatisierte Workflows gibt es spezialisierte Tools. Penthouse (Node.js) öffnet die Seite in einem headless Chrome, bestimmt den Viewport und extrahiert alle CSS-Regeln für sichtbare Elemente. Critical (npm-Paket von Addy Osmani) baut auf Penthouse auf und bietet zusätzlich die Möglichkeit, das Critical CSS direkt in das HTML zu inlinen und das Rest-CSS async nachzuladen. Critters (Google, Webpack-Plugin) verfolgt einen anderen Ansatz: Statt die Seite zu rendern, analysiert es die CSS-Selektoren statisch und erkennt, welche Elemente im HTML vorhanden sind.

Jedes Tool hat Stärken und Schwächen. Penthouse und Critical liefern die präzisesten Ergebnisse, weil sie die Seite tatsächlich rendern – sie berücksichtigen JavaScript-generierte Inhalte, Media Queries und dynamische Styles. Der Nachteil: Sie benötigen einen headless Browser und sind langsamer (1–5 Sekunden pro Seite). Critters ist deutlich schneller, kann aber JavaScript-generierte Elemente nicht erkennen. Für die meisten Projekte empfehlen wir Critical als Build-Zeit-Tool, das in den Frontend-Optimierungsprozess integriert wird.

Identifizieren

Chrome DevTools Coverage-Funktion zeigt ungenutzte CSS-Regeln. Typisch: 85-95 Prozent des geladenen CSS wird auf der aktuellen Seite nicht verwendet.

Extrahieren

Spezialisierte Tools wie Penthouse oder Critical analysieren den Viewport und extrahieren nur die CSS-Regeln, die fuer sichtbare Elemente relevant sind.

Inline einbetten

Critical CSS wird als style-Tag im HTML-Head eingebettet. Ziel: unter 14 KB komprimiert, um im ersten TCP Congestion Window zu bleiben.

Rest async laden

Das vollstaendige CSS wird mit media=print und onload-Handler asynchron nachgeladen, ohne das initiale Rendering zu blockieren.

Automatisieren

Build-Prozess-Integration ueber Webpack, Vite oder Gulp generiert Critical CSS automatisch fuer jeden Seitentyp bei jedem Deployment.

Validieren

Lighthouse-Score, LCP-Messung und visueller Vergleich stellen sicher, dass Critical CSS korrekt funktioniert und kein FOUC auftritt.

Inline vs. External: Die richtige Einbindungsstrategie

Critical CSS kann auf zwei Wegen eingebunden werden: als Inline-