Was ist das Box-Modell?
Das CSS Box-Modell ist das grundlegende Konzept hinter jedem Layout im Web. Es beschreibt, wie jedes HTML-Element als rechteckige Box mit vier verschiedenen Ebenen gerendert wird: Content, Padding, Border und Margin. Egal, ob Sie einen einfachen Absatz stylen oder ein komplexes Dashboard erstellen – das Box-Modell bestimmt, wie viel Platz ein Element einnimmt und wie es zu seinen Nachbarelementen steht.
Stellen Sie es sich wie einen Bilderrahmen vor. Das Bild selbst ist der Content. Der Passepartout-Rand darum herum ist das Padding. Der Rahmen ist die Border. Und der Abstand zwischen diesem Rahmen und dem nächsten an der Wand ist die Margin. Jedes Element auf einer Webseite funktioniert genau so – verschachtelte Boxen in verschachtelten Boxen.
Die vier Ebenen
Content (Inhalt) ist die innerste Ebene – der Text, das Bild, das Video oder andere Medien, die das Element enthält. Die Größe wird mit width und height festgelegt (oder durch den Inhalt selbst, falls diese nicht spezifiziert sind).
Padding (Innenabstand) liegt zwischen dem Content und dem Border. Es schafft innerhalb des Elements Freiraum, damit der Text nicht an den Rändern klebt. Padding ist standardmäßig transparent, sodass die Hintergrundfarbe oder das Hintergrundbild des Elements hindurchscheint.
Border (Rahmen) umschließt das Padding und den Content. Er besitzt eine Breite, einen Stil und eine Farbe. Borders können dekorativ oder strukturell sein – sie bilden die sichtbare Kante, die das Element von der Außenwelt trennt.
Margin (Außenabstand) ist die äußerste Ebene. Sie drückt andere Elemente weg. Im Gegensatz zum Padding ist der Margin immer transparent und liegt außerhalb des Borders des Elements. Margins sind das primäre Werkzeug, um die Abstände zwischen Elementen zu steuern.
box-sizing: content-box vs border-box
Die Eigenschaft box-sizing ändert die Art und Weise, wie der Browser width und height interpretiert.
Beim Standardwert content-box beziehen sich die festgelegte Breite und Höhe nur auf den Inhaltsbereich. Padding und Border werden zusätzlich obenauf addiert. Ein div mit width: 200px, padding: 20px und einem 4px Border wird also tatsächlich mit einer Breite von 248px gerendert. Das ist kontraintuitiv und die häufigste Ursache für Layout-Fehler bei Anfängern.
Bei border-box beinhalten Breite und Höhe das Padding und den Border. Das gleiche div mit width: 200px, padding: 20px und einem 4px Border bleibt exakt 200px breit – der Inhaltsbereich verkleinert sich entsprechend, um Platz zu schaffen. So erwarten die meisten Entwickler, dass die Dimensionierung funktioniert, und genau deshalb ist ein globaler Reset wie dieser Standardpraxis:
/* reset.css */
*,
*::before,
*::after {
box-sizing: border-box;
}
Border-box macht Layouts vorhersehbar. Du legst eine Breite fest, und das Element hält sich daran. Es ist kein Kopfrechnen mehr nötig, um herauszufinden, warum deine Spalten breiter sind als erwartet. Nutze es überall und erspare dir die Kopfschmerzen.
Block vs inline vs inline-block
Jedes Element hat ein Standard-Display-Verhalten, das steuert, wie es am Layout teilnimmt.
Block-Elemente beginnen in einer neuen Zeile und dehnen sich aus, um die volle Breite ihres Elternelements auszufüllen. Sie stapeln sich vertikal. Beispiele hierfür sind div, p, h1 bis h6, section, article, header, footer und ul. Block-Elemente akzeptieren width, height, margin auf allen Seiten sowie padding auf allen Seiten.
Inline-Elemente fließen innerhalb des Textes, ohne den Zeilenumbruch zu erzwingen. Sie nehmen nur so viel Breite ein, wie ihr Inhalt benötigt. Beispiele hierfür sind span, a, strong, em, img und code. Inline-Elemente ignorieren width und height, und vertikale margin und padding beeinflussen das umliegende Layout nicht – sie verschieben sich zwar visuell, drücken aber andere Elemente nicht weg.
Inline-block-Elemente sind ein Hybrid. Sie fließen wie Text inline, verhalten sich intern jedoch wie Blöcke – sie akzeptieren width, height, margin und padding auf allen Seiten. Navigationslinks, Badges und Tags sind klassische Anwendungsfälle. Sie bleiben im Textfluss, geben dir aber die volle Kontrolle über Größe und Abstände.
| Eigenschaft | Block | Inline | Inline-block |
|---|---|---|---|
| Beginnt in neuer Zeile | Ja | Nein | Nein |
| Breite/Höhe | Ja | Nein | Ja |
| Vertikaler Margin/Padding | Ja | Nein (nur visuell) | Ja |
| Horizontaler Margin/Padding | Ja | Ja | Ja |
Die display-Eigenschaft
Die display-Eigenschaft ist das mächtigste Layout-Tool in CSS. Sie steuert nicht nur das Verhalten des Box-Modells, sondern auch, wie ein Element an Layout-Algorithmen teilnimmt.
Die gängigsten Werte:
block— Box über die volle Breite, wird vertikal gestapelt.inline— fließt mit dem Text, keine Dimensionierung über das Box-Modell.inline-block— Inline-Fluss mit Dimensionierung über das Box-Modell.none— entfernt das Element vollständig aus dem Layout. Es nimmt keinen Platz ein und wird nicht gerendert.flex— macht das Element zu einem Flex-Container. Die Kinder werden zu Flex-Items mit eindimensionaler Layout-Steuerung.grid— macht das Element zu einem Grid-Container. Die Kinder werden in einem zweidimensionalen Grid platziert.inline-flex— Flex-Container, der im Inline-Fluss steht.inline-grid— Grid-Container, der im Inline-Fluss steht.
Modernes CSS bietet Ihnen flex und grid für das Layout, aber das Verständnis von Block und Inline ist nach wie vor essenziell, da sie das Fundament bilden, auf dem Flex und Grid aufbauen. Jedes Element ohne expliziten display-Wert fällt je nach Elementtyp auf Block oder Inline zurück.
Berechnungen von Breite und Höhe
Wie Breite und Höhe berechnet werden, hängt vollständig von box-sizing ab.
Bei content-box:
Actual width = width + padding-left + padding-right + border-left + border-right
Actual height = height + padding-top + padding-bottom + border-top + border-bottom
Bei border-box:
Actual width = width (padding and border are included)
Actual height = height (padding and border are included)
Eine praktische Konsequenz: Bei content-box führt das Setzen von width: 100% bei einem Element mit Padding oder Border zu einem horizontalen Overflow. Bei border-box funktioniert es wie erwartet. Dies ist eines der stärksten Argumente dafür, immer border-box zu verwenden.
Beachten Sie bei der Größenbestimmung innerhalb eines Containers, dass sich Prozentangaben für width auf die Inhaltsbreite des Elternelements beziehen (selbst bei border-box), während Prozentangaben für height voraussetzen, dass das Elternelement eine explizite Höhe hat – andernfalls wird der Prozentwert als auto behandelt.
Overflow und Scrolling
Wenn Inhalte größer als ihr Container sind, bestimmt die overflow-Property, was passiert.
overflow: visible(Standard) — der Inhalt läuft über den Rand der Box hinaus. Er bleibt sichtbar, kann aber benachbarte Elemente überlagern.overflow: hidden— der Inhalt wird an der Box-Kante abgeschnitten. Es gibt keinen Scrollbalken und keine Möglichkeit, den Rest zu sehen.overflow: scroll— ein Scrollbalken wird angezeigt, unabhängig davon, ob er benötigt wird oder nicht.overflow: auto— ein Scrollbalken erscheint nur dann, wenn der Inhalt tatsächlich überläuft. Dies ist in der Regel die beste Wahl.overflow-xundoverflow-yermöglichen es, den horizontalen und vertikalen Overflow unabhängig voneinander zu steuern.
Overflow ist besonders wichtig bei Containern mit fester Breite, Modals, Code-Blöcken und allen Elementen, deren Inhalt wachsen könnte. Ohne die entsprechende Konfiguration treten häufig unerwartete horizontale Scrollbalken auf der Seite auf.
Margin Collapse
Vertikale Margins haben eine Eigenheit, die fast jeden Anfänger überrascht: sie kollabieren. Wenn zwei vertikale Margins aufeinandertreffen, gewinnt die größere von beiden, anstatt dass beide addiert werden.
/* style.css */
.box-a { margin-bottom: 30px; }
.box-b { margin-top: 20px; }
/* The gap between them is 30px, not 50px */
Margin Collapse tritt in drei Situationen auf:
- Benachbarte Geschwister-Elemente — die untere Margin des einen und die obere Margin des nächsten verschmelzen.
- Parent und erstes Child — die obere Margin des Parents kollabiert mit der oberen Margin seines ersten Childs (sofern der Parent keine Border, kein Padding oder keinen Content hat, die beide trennen).
- Parent und letztes Child — wie oben, nur für den unteren Bereich.
Margin Collapse passiert niemals bei:
- Horizontalen Margins.
- Flex- und Grid-Items (das Box-Modell ist innerhalb dieser Container anders).
- Elementen, bei denen
overflowauf etwas anderes alsvisiblegesetzt ist. - Elementen mit
borderoderpadding, die die Margins voneinander trennen.
Das Verständnis von Margin Collapse verhindert das Problem „Warum hat dieser Abstand die falsche Größe?“, das Entwickler oft dazu treibt, willkürliches Padding oder negative Margins hinzuzufügen.
Positionierung: static, relative, absolute, fixed, sticky
Die Eigenschaft position nimmt ein Element aus dem normalen Dokumentenfluss heraus oder modifiziert dessen Position darin.
static ist der Standardwert. Das Element befindet sich im normalen Fluss, und top, right, bottom, left sowie z-index haben keine Auswirkung.
relative behält das Element im Fluss bei, erlaubt es Ihnen jedoch, es mit top, right, bottom und left zu verschieben. Der ursprüngliche Platz bleibt reserviert – es ist so, als würde man das Element visuell verschieben, während sein Platz im Layout erhalten bleibt.
absolute nimmt das Element vollständig aus dem Fluss heraus. Es wird relativ zu seinem nächsten positionierten Vorfahren platziert – also jedem Vorfahren, bei dem position auf relative, absolute, fixed oder sticky gesetzt ist. Wenn kein solcher Vorfahren existiert, wird der Viewport verwendet. Absolute Elemente beeinflussen das Layout von Geschwisterelementen oder Elternelementen nicht.
fixed nimmt das Element ebenfalls aus dem Fluss heraus, positioniert es jedoch relativ zum Viewport. Es bleibt an derselben Stelle, wenn die Seite gescrollt wird. Verwenden Sie dies für fixierte Header, Floating Action Buttons und Modals, die sichtbar bleiben müssen.
sticky ist ein Hybrid. Das Element scrollt normal, bis es einen Schwellenwert erreicht (top, right, bottom oder left), und „klebt“ dann an dieser Position fest. Es ist der moderne Ersatz für JavaScript Scroll-Listener. Navigationsleisten, die beim Scrollen am oberen Rand fixiert bleiben, sind der klassische Anwendungsfall.
/* style.css */
.sticky-nav {
position: sticky;
top: 0;
z-index: 10;
}
Z-index und Stacking Context
Wenn sich Elemente überlagern, bestimmt z-index, welches davon oben erscheint. Dies funktioniert nur bei positionierten Elementen – also solchen, bei denen position auf einen Wert anders als static gesetzt ist.
Doch z-index ist keine einfache globale Zahl. Er erzeugt oder ist Teil eines Stacking Contexts. Ein Stacking Context ist eine in sich geschlossene Ebene, die ihre Kindelemente kapselt. Ein Kindelement mit z-index: 9999 innerhalb eines Stacking Contexts mit z-index: 1 wird niemals über einem Element mit z-index: 2 im übergeordneten Kontext erscheinen.
Stacking Contexts werden erzeugt durch:
- Elemente mit
positionundz-indexanders alsauto. - Elemente mit
opacitykleiner als 1. - Elemente mit
transform,filter,backdrop-filteroderperspective. - Elemente mit
isolation: isolate. - Elemente innerhalb eines Flex- oder Grid-Containers mit einem
z-index.
Das Verständnis von Stacking Contexts ist der Schlüssel zur Lösung von Problemen, bei denen der „z-index nicht funktioniert“. Die Lösung ist fast nie eine größere Zahl – sondern das Verständnis, in welchem Stacking Context sich Ihr Element befindet.
Best Practices für das Layout
- Verwende
box-sizing: border-boximmer global. Das eliminiert eine ganze Klasse von Sizing-Bugs. - Vermeide
width: 100%in Kombination mit Padding bei Content-Box-Elementen. Nutze stattdessen border-box. - Bevorzuge
max-widthgegenüberwidthfür Inhalte, die nicht zu breit gestreckt werden sollen. - Nutze
margin: autofür die horizontale Zentrierung innerhalb von Block-Containern. - Verwende
overflow: autoanstelle vonoverflow: hidden, wenn du Scrollbars für überlaufende Inhalte möchtest. - Vermeide feste
heightfür Container mit dynamischen Inhalten – lass sie stattdessen mit dem Inhalt wachsen. - Achte bei vertikalen Abständen auf Margin Collapse. Nutze stattdessen gap in flex/grid oder Padding am Parent-Element.
- Verwende niemals
position: absolutefür das allgemeine Layout – es unterbricht den Dokumentenfluss und erschwert das responsive Design. - Nutze
position: stickyanstelle von JavaScript für Header und Sidebars, die auf das Scrollen reagieren sollen. - Halte Stacking-Kontexte flach. Überlappende
z-index-Werte über tief verschachtelte Komponenten hinweg führen zu Verwirrung. - Teste Layouts in verschiedenen Breiten. Das Box-Modell verhält sich anders, wenn der Viewport schrumpft.
Häufige Fehler
- Das Vergessen von
box-sizing: border-box, was zu unerwarteten Breiten führt. - Die Verwendung von
widthbei Inline-Elementen und die Verwunderung darüber, dass sich nichts ändert. - Das Anwenden von
marginauf Inline-Elemente, wodurch die erwarteten Abstände nicht entstehen. - Die Nutzung von
position: absoluteohne ein positioniertes Elternelement, wodurch Elemente in die Ecke des Viewports springen. - Verwirrung, wenn
z-indexnicht funktioniert – meistens liegt ein Problem mit dem Stacking Context vor. - Überraschung über das Margin Collapse zwischen Eltern- und Kindelementen.
- Das Festlegen einer fixen Höhe für einen Container, wodurch Inhalte unsichtbar überlaufen.
- Die Verwendung von
overflow: hidden, um das Layout zu “fixen”, obwohl das eigentliche Problem eine falsche Dimensionierung ist.
Wann man das Box-Modell vs. Flexbox oder Grid verwendet
Das Box-Modell ist kein eigenständiges Layout-System – es ist das Fundament, auf dem alle CSS-Layouts aufbauen. Flexbox und Grid ersetzen das Box-Modell nicht; sie nutzen es. Jedes Flex-Item und jede Grid-Zelle besitzt weiterhin Content, Padding, Border und Margin.
Verwenden Sie das Box-Modell direkt für:
- Die Steuerung von Abständen innerhalb und um einzelne Elemente.
- Das Festlegen expliziter Größen für Cards, Buttons, Inputs und Container.
- Das Verständnis dafür, warum Elemente überlaufen oder nicht in ihre Parent-Elemente passen.
Verwenden Sie Flexbox, wenn Sie Elemente entlang einer Achse ausrichten und verteilen müssen – zum Beispiel bei Navigationsleisten, Card-Reihen oder zum Zentrieren von Inhalten.
Verwenden Sie Grid, wenn Sie ein zweidimensionales Layout mit Zeilen und Spalten benötigen – zum Beispiel für Page-Shells, Dashboards oder Bildergalerien.
Die besten CSS-Entwickler greifen zuerst auf das Box-Modell zurück, um zu verstehen, was passiert, und setzen dann Flexbox oder Grid für das übergeordnete Layout darüber. Das Erlernen des Box-Modells ist nicht getrennt vom Erlernen moderner Layout-Techniken – es ist die Voraussetzung, die alles andere erst sinnvoll macht.