CSS Box Model
In CSS ist jedes Element eine Box. Egal ob div, p, button
oder img – der Browser behandelt alles als rechteckige Box.
Vier Box-Schichten
Jede Box besteht aus vier Schichten – von innen nach aussen.
- Content Inhalt des Elements
- Padding Abstand zwischen Inhalt und Rahmen
- Border Rahmen um Inhalt und Innenabstand
- Margin Abstand zu anderen Elementen
1. Content (Inhalt)
Der Content-Bereich enthält den eigentlichen Inhalt: Text, Bilder, Videos etc.
div {
width: 200px;
height: 100px;
}
Wichtig:
Die width und height beziehen sich standardmässig nur auf den Content,
nicht auf Padding oder Border.
2. Padding (Innenabstand)
padding ist der Abstand zwischen Content und Border.
div { padding: 20px;}
Eigenschaften
- schafft Abstand zwischen Inhalt und Rahmen
- kann keine negativen Werte annehmen
Padding für alle vier Seiten
Der Innenabstand kann für jede Seite einzeln festgelegt werden.
padding-top
padding-right
padding-bottom
padding-left
3. Border (Rahmen)
Der border umschliesst Content + Padding.
div {
border: 2px solid black;
}
Eigenschaften
- umschliesst Content und Padding
- zählt zur Gesamtgrösse des Elements
Alle Boder definitionen findest du
unter Border
4. Margin (Aussenabstand)
margin ist der Abstand zu anderen Elementen.
div { margin: 30px; }
Eigenschaften
- liegt ausserhalb des Rahmens
- gehört nicht zur Grösse der Box
- kann negative Werte annehmen
Margin Collapsing
Zwei Absätze untereinander haben einen Abstand von 20px, nicht 40px. Das passiert nur vertikal, nicht horizontal und nicht bei Flexbox oder Grid.
p {
margin: 20px 0;
}
Horizontal zentrieren
Setzt man margin-left und margin-right auf auto, teilt der
Browser den verfügbaren Platz gleichmässig auf beide Seiten auf – die Box wird horizontal
zentriert. Voraussetzung: das Element braucht eine feste width, sonst nimmt es die
volle Breite ein und es bleibt kein Platz zum Verteilen.
div {
width: 300px;
margin: 0 auto;
}
Wichtig: Funktioniert im normalen Dokumentfluss nur horizontal – vertikales
Zentrieren mit margin: auto braucht zusätzlich Flexbox oder Grid auf dem
Elternelement.
Kurzschreibweise
Die Angaben werden im Uhrzeigersinn geladen und starten oben.
padding: 10px 20px; /* oben/unten | links/rechts */
padding: 1px 5px 15px; /* oben | links/rechts | unten */
padding: 10px 5px 15px 50px; /* oben | links | unten | rechts */
Logische Eigenschaften
Eigenschaften wie padding-top oder margin-left beziehen sich auf feste
Seiten einer Box. Logische Eigenschaften orientieren sich dagegen an der Schreib- und
Leserichtung.
Bei einer horizontalen Schreibrichtung von links nach rechts entsprechen die logischen Richtungen folgenden Seiten:
- blockAchse der untereinander angeordneten Inhalte (oben/unten)
- block-startAnfang der Blockachse (oben)
- block-endEnde der Blockachse (unten)
- inlineAchse innerhalb einer Textzeile (links/rechts)
- inline-startAnfang der Inlineachse (links)
- inline-endEnde der Inlineachse (rechts)
Innen- und Aussenabstände können für jede logische Seite einzeln festgelegt werden. Alle
logischen Seitenangaben funktionieren mit padding und margin.
padding-block-start: 2rem;
padding-block-end: 4rem;
padding-inline-start: 1rem;
padding-inline-end: 3rem;
Kurzschreibweise
Mit padding-block und padding-inline werden beide Seiten einer Achse
zusammengefasst.
padding-block: 2rem; /* oben und unten */
padding-inline: 1rem; /* links und rechts */
Bei zwei Werten steht der erste für den Anfang und der zweite für das Ende der jeweiligen Achse.
padding-block: 2rem 4rem; /* block-start | block-end */
padding-inline: 1rem 3rem; /* inline-start | inline-end */
Horizontal zentrieren
Mit margin-inline: auto kann eine Box horizontal zentriert werden.
div {
width: 300px;
margin-inline: auto;
}
Bei einer vertikalen Schreibrichtung, beispielsweise bei traditionellem Japanisch mit
writing-mode: vertical-rl, passen sich die logischen Richtungen automatisch an. Der
CSS-Code muss dafür nicht auf andere Seitenangaben umgeschrieben werden.
Dynamische Abstände mit clamp()
clamp() funktioniert nicht nur bei Schriftgrössen, sondern bei jedem Längenwert –
auch bei padding und margin. So skalieren die Abstände automatisch mit
der Bildschirmgrösse, ganz ohne Media Query.
div {
padding: clamp(1rem, 4vw, 3rem);
margin: clamp(1rem, 4vw, 3rem);
}
box-sizing
Standard: content-box
box-sizing: content-box;
- width & height gelten nur für den Content
- Padding & Border werden dazu addiert
div {
width: 200px;
padding: 20px;
border: 5px solid red;
}
Tatsächliche Breite
200 (content)
+ 40 (padding links + rechts)
+ 10 (border links + rechts)
= 250px
box-sizing: border-box (Best Practice)
box-sizing: border-box;
Bedeutung:
width & height beinhalten: Content, Padding und Border
div {
width: 200px;
padding: 20px;
border: 5px solid;
box-sizing: border-box;
}
Gesamtbreite bleibt 200px. Der Content wird automatisch kleiner gerechnet.
Warum fast alle border-box nutzen
- Layouts sind vorhersehbar
- Keine Überraschungen bei Breiten
- Perfekt für Responsive Design
- Weniger Rechenarbeit im Kopf
Global setzen (sehr verbreitet)
*,
*::before,
*::after {
box-sizing: border-box;
}
Box Model & Inline-Elemente
Das Box Model gilt auch für Inline-Elemente. Einige Eigenschaften beeinflussen das Layout jedoch anders als bei Block-Elementen.
Beispiel mit einem Inline-Element wie <span>:
span {
padding: 10px;
border: 2px solid red;
margin: 20px;
}
-
padding-left/rightschafft horizontal zusätzlichen Platz -
padding-top/bottomwird gezeichnet, verändert aber die Zeilenhöhe nicht -
borderwird vollständig gezeichnet, verändert aber die Zeilenhöhe nicht -
margin-left/rightschafft horizontal Abstand -
margin-top/bottomhat keine Wirkung auf das Layout -
width / heighthat keine Wirkung
Inline-Block
inline-block verbindet Eigenschaften von Inline- und Block-Elementen. Das Element
kann innerhalb einer Zeile stehen, gleichzeitig wirken width, height,
Padding und Margin wie bei einem Block-Element.
Kurz gesagt
content,padding,borderundmarginbilden die vier Schichten einer Box.paddingschafft Abstand zwischen Inhalt und Rahmen und kann nicht negativ sein.marginschafft Abstand zu anderen Elementen, kann negativ sein und vertikal zusammenfallen.- Bei
content-boxwerden Padding und Border zur angegebenen Breite und Höhe addiert. - Bei
border-boxsind Padding und Border bereits in der angegebenen Breite und Höhe enthalten. - Logische Eigenschaften wie
padding-blockundmargin-inlineorientieren sich an der Schreib- und Leserichtung. - Bei Inline-Elementen verändern vertikales Padding und Border die Zeilenhöhe nicht. Vertikale
Margins sowie
widthundheighthaben keine Wirkung. - Mit
inline-blockwirken Breite, Höhe und alle Abstände.