Browser Internals

Browser & Rendering

Ein Browser verwandelt HTML, CSS und JavaScript in Pixel. Das Verständnis von Parsing, dem DOM, dem Critical Rendering Path und Reflows macht Performance-Optimierung weitaus weniger mysteriös.

intermediate15 min readUpdated 15. Sept. 2026
index.html
html
<!-- index.html -->
<link rel="preload" href="/fonts/inter.woff2"
      as="font" type="font/woff2" crossorigin />
<link rel="stylesheet" href="/styles.css" />
<script src="/app.js" defer></script>
Engines
Blink, Gecko, WebKit
Parsing
HTML zu DOM
Styles
CSS zu CSSOM
Layout
Geometrie und Position
Paint
Pixel zu Layern
Thread
Main thread führt JS aus

Warum es wichtig ist

Warum Browser-Internals wichtig sind

Eine Runtime, kein Dokument

Der Browser ist eine Ausführungsumgebung mit einem DOM, APIs, Storage, Networking und einer JavaScript-Engine.

Der Critical Path

HTML, CSS und blockierendes JavaScript entscheiden darüber, wann die ersten Pixel erscheinen können.

Layout ist teuer

Das Neuberechnen der Geometrie zwingt den Browser, Arbeit zu wiederholen, weshalb das Batching von DOM-Änderungen wichtig ist.

Das Gesamtbild

Die drei Phasen des Renderings

Markup parsen, Boxen anordnen, dann Pixel malen und zusammensetzen.

Parse

Baum aufbauen

HTML wird zum DOM, CSS wird zum CSSOM, und zusammen bilden sie den Render Tree.

Layout

Platzieren

Der Browser berechnet die Größe und Position jeder Box.

Paint

Zeichnen

Boxen werden in Layer gemalt und zum finalen Frame zusammengesetzt (Compositing).

Rendering im Überblick

Die Kernkonzepte

HTML-Parsing

Der Parser baut das DOM auf, während das Dokument gestreamt wird.

CSSOM

Stylesheets werden in einen Baum aus Regeln und berechneten Styles geparst.

Render Tree

Nur sichtbare Elemente mit Styles gelangen in den Render Tree.

Layout

Auch Reflow genannt – die Berechnung der Geometrie jeder Box.

Paint und Composite

Das Füllen von Pixeln und das Kombinieren von Layern auf der GPU.

Der Main Thread

JavaScript, Layout und Paint teilen sich einen Thread, sodass lange Tasks alles blockieren.

Eine kurze Geschichte

Von einzelnen Engines zu einer gemeinsamen Plattform

  1. 1993

    Mosaic

    Der erste weit verbreitete grafische Browser bringt Bilder ins Web.

    93
  2. 1995

    JavaScript

    Scripting verwandelt statische Dokumente in Anwendungen.

    95
  3. 2008

    Chrome und V8

    Eine schnelle Engine und eine Multi-Prozess-Architektur setzen neue Performance-Standards.

    08
  4. 2013

    Blink

    Chrome forkt WebKit, und Blink wird zur dominanten Engine.

    13
  5. Heute

    Eine Standards-Plattform

    Engines konvergieren bei Web-Standards, und Browser werden zur universellen App-Runtime.

    Heute

Der vollständige Leitfaden

Browser & Rendering: Alles was Sie wissen müssen

Was macht ein Browser eigentlich genau?

Ein Browser ist eine Ausführungsumgebung und nicht bloß ein Dokumentenbetrachter. Er parst HTML und CSS in Bäume, führt JavaScript aus, stellt APIs für Networking und Storage bereit und rendert das Ergebnis in Pixel. Wenn man diese Pipeline versteht, wird Performance-Optimierung von bloßem Raten zu echtem Engineering.

Die Browser-Hersteller liefern drei Haupt-Engines aus: Blink (Chrome, Edge, Opera), Gecko (Firefox) und WebKit (Safari). Diese implementieren dieselben Standards, sodass die hier beschriebenen Konzepte überall gelten, auch wenn die Details variieren mögen.

HTML in das DOM parsen

Wenn der Browser HTML empfängt, parst er es in das DOM: einen Baum aus Objekten, die jedes Element, Attribut und Textstück repräsentieren. Der Parser arbeitet als Stream, sodass er mit dem Aufbau des Baums beginnen kann, noch bevor das gesamte Dokument eingetroffen ist.

Das HTML-Parsing ist von Haus aus fehlertolerant. Ein fehlender schließender Tag oder ein falsch platziertes Element stoppt die Seite nicht; der Parser erholt sich davon und macht weiter. Aus diesem Grund wird auch fehlerhaftes Markup dennoch gerendert – und genau deshalb ist die Validierung Ihres HTML für die Vorhersehbarkeit des Ergebnisses so wichtig.

CSS und das CSSOM

Stylesheets werden in das CSSOM geparst, einen Baum aus Regeln. Der Browser berechnet anschließend den finalen Style jedes Elements, indem er die Kaskade, Vererbung und Spezifität kombiniert.

CSS ist render-blocking: Der Browser führt kein Painting durch, bis er die benötigten Styles hat, da ein Painting mit falschen Styles zu einem sichtbaren Flackern führen würde. Aus diesem Grund verzögert ein großes Stylesheet im Head den First Paint, und weshalb das Inlining von kritischem CSS hilfreich ist.

Der Render Tree

Das DOM und das CSSOM verschmelzen zum Render Tree. Dieser enthält nur die Elemente, die tatsächlich angezeigt werden, jeweils zusammen mit ihren berechneten Styles. Elemente mit display: none werden ausgeschlossen; visibility: hidden-Elemente werden zwar aufgenommen, aber nicht gezeichnet.

An diesem Punkt weiß der Browser, was gezeichnet werden muss, aber noch nicht, wo.

Layout

Layout, auch als Reflow bezeichnet, berechnet die Größe und Position jeder Box im Render Tree. Dabei wird der Baum durchlaufen, um Breiten, Höhen, Margins, Padding und die Positionierung aufzulösen, woraus ein Box-Modell mit exakter Geometrie resultiert.

Layout ist rechenintensiv, da Änderungen kaskadieren können: Das Ändern der Größe eines Elements kann dessen Geschwisterelemente, das Elternelement und alles darunter verschieben. Das Auslesen von Eigenschaften wie offsetHeight zwingt den Browser dazu, sicherzustellen, dass das Layout aktuell ist. Wenn Lese- und Schreibzugriffe abwechselnd erfolgen, löst dies wiederholte Layout-Berechnungen aus.

Paint und Composite

Nach dem Layout paint (zeichnet) der Browser die Boxen in Layer und füllt Farben, Texte, Bilder, Rahmen und Schatten aus. Anschließend werden diese Layer composited (zusammengeführt), oft auf der GPU, um den finalen Frame zu erzeugen.

Einige Änderungen sind weniger rechenintensiv als andere:

  • Eine Farbänderung löst ein Paint aus.
  • Eine Größenänderung löst Layout und Paint aus.
  • Änderungen an transform oder opacity können vom Compositor verarbeitet werden, wodurch Layout und Paint komplett übersprungen werden.

Aus diesem Grund sollten Animationen auf Transforms und Opacity beschränkt bleiben. Siehe dazu den CSS Animations Guide und den Web Performance Guide.

Der Critical Rendering Path

Der Weg von HTML bis zu den ersten Pixeln sieht so aus:

  1. Parse: HTML wird in das DOM umgewandelt.
  2. Parse: CSS wird in das CSSOM umgewandelt.
  3. Combine: Beide werden zum Render Tree kombiniert.
  4. Layout: Die Boxen werden angeordnet.
  5. Paint und Composite: Der Frame wird gezeichnet und zusammengesetzt.

Die Verkürzung dieses Pfades ist der Kern der wahrgenommenen Performance: weniger blockierende Ressourcen, kleineres CSS und JavaScript, das den Prozess nicht behindert.

<!-- fast.html -->
<link rel="preload" href="/fonts/inter.woff2" as="font" type="font/woff2" crossorigin />
<style>/* critical, above-the-fold CSS */</style>
<script src="/app.js" defer></script>

preload startet wichtige Anfragen frühzeitig, inlined critical CSS vermeidet einen blockierenden Roundtrip und defer erlaubt es dem Parser, die Arbeit abzuschließen, bevor das Script ausgeführt wird.

Der Main Thread und JavaScript

Der Main Thread führt JavaScript, Layout, Paint und die Event-Verarbeitung aus. Da immer nur eine Sache gleichzeitig passiert, blockiert ein langwieriger Task die Eingaben und lässt die Seite eingefroren wirken.

  • Halten Sie Tasks kurz und teilen Sie rechenintensive Arbeit auf.
  • Verlagern Sie schwere Berechnungen in einen Web Worker, der in einem separaten Thread läuft.
  • Vermeiden Sie Layout Thrashing, indem Sie DOM-Reads und -Writes bündeln.
  • Geben Sie zwischen Arbeitspaketen die Kontrolle an den Browser zurück (Yielding).

Dies ist derselbe Event Loop, den Sie bereits im JavaScript-Guide kennengelernt haben – nur dass nun auch die Rendering-Aufgaben um denselben Thread konkurrieren.

Storage und Browser-APIs

Neben dem Rendering stellt der Browser verschiedene Storage- und Plattform-APIs bereit: Cookies, localStorage und sessionStorage, IndexedDB, die Cache API, Service Worker, WebSockets, WebRTC, die Clipboard-API, Notifications und mehr. Diese ermöglichen es einer Webseite, sich wie eine Anwendung zu verhalten. Der PWA-Guide befasst sich ausführlich mit Service Workern und Caching.

Best Practices

  • Halten Sie den critical path kurz: Binden Sie kritisches CSS inline ein und verzögern Sie das Laden von Scripts.
  • Verwenden Sie preload für Fonts und andere render-kritische Assets.
  • Animieren Sie transform und opacity, keine Layout-Properties.
  • Bündeln Sie DOM-Reads und -Writes, um Layout Thrashing zu vermeiden.
  • Halten Sie JavaScript-Tasks kurz; nutzen Sie Web Workers für rechenintensive Aufgaben.
  • Reservieren Sie Platz für Bilder und Embeds, um Layout Shifts zu vermeiden.
  • Testen Sie in verschiedenen Engines, insbesondere in Safari und auf mobilen Geräten.

Häufige Fehler

  • Die Annahme, dass das DOM identisch mit dem HTML-Quelltext ist.
  • Blockieren des Renderings durch große Stylesheets oder synchrone Scripte.
  • Auslesen von Layout-Properties innerhalb einer Schleife, was zu wiederholten Reflows führt.
  • Animieren von width oder top, was Ruckler (Jank) verursacht.
  • Ausführen rechenintensiver Operationen auf dem Main Thread.
  • Testen in nur einem einzigen Browser, wodurch Unterschiede zwischen den Engines übersehen werden.

Wie geht es weiter?

Die Browser-Internals erklären, warum Performance-Tipps überhaupt funktionieren. Setze dieses Wissen mit dem Web Performance Guide in die Praxis um, erstelle effiziente Animationen mit CSS Animations und manipuliere den Tree sicher mittels DOM Manipulation. Öffne anschließend die DevTools und beobachte die Rendering-Pipeline im Performance-Panel.

Skripte laden

Ein klassisches Skript im Head blockiert das Parsing. defer lädt parallel herunter und wird ausgeführt, nachdem das Dokument geparst wurde.

Bevorzugt
<head>
  <link rel="stylesheet" href="/styles.css" />
  <script src="/app.js" defer></script>
</head>
Vermeiden
<head>
  <script src="/app.js"></script>
  <!-- parser blocks until
       it downloads and runs -->
</head>

DOM aktualisieren

Lese- und Schreibvorgänge bündeln (Batching). Ein Wechsel zwischen beiden zwingt den Browser, das Layout wiederholt neu zu berechnen.

Bevorzugt
// read all, then write all
const height = el.offsetHeight;
const width = el.offsetWidth;

el.style.height = height + "px";
el.style.width = width + "px";
Vermeiden
// forces layout on every line
el.style.height = el.offsetHeight + "px";
el.style.width = el.offsetWidth + "px";

Häufig gestellte Fragen

Häufig gestellte Fragen

Keep learning

Related topics from the roadmap.

$ Lernen Sie jetzt

Bereit, Browsers & Rendering zu lernen?

Unser interaktives Tutorial führt Sie Schritt für Schritt durch Browsers & Rendering — mit Quizzen und echtem Code, den Sie im Browser ausführen können.