Zum Inhalt springen

Box Model, Spacings & weitere Maßeinheiten

Box model visualization

  • content: Inhalt (Text, Bild, …)
  • padding: Innenabstand - zwischen Inhalt und Rahmen
  • border: Rahmen/Umrandung
  • margin: Außenabstand - zwischen Element und Nachbar-Elementen

Jedes Element hat einen Standard-display-Wert. Er bestimmt, wie das Element im Layout aussieht, schon bevor ihr irgendein CSS schreibt:

a { display: inline; } /* Standard für <a>, <span>, <strong>, ... */
div { display: block; } /* Standard für <div>, <p>, <h1>–<h6>, <section>, ... */
blockinlineinline-block
Beginnt eine neue Zeile✅ ja❌ nein - fließt im Text❌ nein - fließt im Text
width / height wirken✅ ja❌ nein - wird ignoriert✅ ja
Vertikales margin/padding wirkt✅ ja❌ nein - kollidiert mit Nachbarzeilen✅ ja
Beispiel-Tagsdiv, p, h1, sectionspan, a, strong, emimg, button, input

inline-block ist ein Mittelweg: Es fließt wie inline im Text, verhält sich aber bei width/height/margin wie block. Praktisch zum Beispiel für Badges, die neben Text stehen sollen, aber eine feste Größe brauchen:

.badge {
display: inline-block;
padding: 4px 8px;
border-radius: 999px;
}
.card {
padding: 20px; /* alle 4 Seiten gleich */
}
.card-2 {
padding: 10px 20px; /* oben/unten: 10px, links/rechts: 20px */
}
.card-3 {
padding: 10px 20px 15px 20px; /* oben rechts unten links (im Uhrzeigersinn) */
}
.card-4 {
padding-top: 10px;
padding-right: 20px;
padding-bottom: 15px;
padding-left: 20px; /* einzeln, wenn nötig */
}

Gleiche Syntax wie padding, aber wirkt außerhalb des Elements:

.card {
margin: 16px; /* Abstand zu allen Nachbarn */
margin-bottom: 32px; /* größerer Abstand nur nach unten */
}
.container {
width: 800px;
margin: 0 auto; /* oben/unten: 0, links/rechts: automatisch verteilt */
}
.card {
border: 1px solid #d1d5db; /* Breite | Stil | Farbe */
border-radius: 8px; /* abgerundete Ecken */
}
.card-dashed {
border: 2px dashed tomato;
}
.card-bottom-only {
border-bottom: 3px solid #2563eb; /* nur eine Seite */
}
  • Stile: solid, dashed, dotted, none
  • border-radius macht auch Kreise: border-radius: 50%
.card {
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
/* x-Versatz | y-Versatz | Weichzeichnung | Farbe */
}
.card-inset {
box-shadow: inset 0 1px 3px black; /* inset = Schatten INNEN statt außen */
}
.box {
width: 300px;
padding: 20px;
border: 2px solid black;
}

Standardverhalten (content-box): width gilt nur für den Inhalt! → Tatsächliche Breite = 300 + 20 + 20 + 2 + 2 = 344px 😱

.box {
box-sizing: border-box; /* padding & border werden EINGERECHNET */
}

→ Tatsächliche Breite bleibt 300px, padding/border gehen davon ab.

<article class="card">
<h2>Webdevelopment 1</h2>
<p>Ein Einführungskurs in HTML, CSS und die Grundlagen des Webs.</p>
<button class="btn">Mehr erfahren</button>
</article>
*, *::before, *::after { box-sizing: border-box; }
.card {
max-width: 320px;
padding: 24px;
border: 1px solid #e5e7eb;
border-radius: 12px;
background-color: white;
}
.card h2 { margin-bottom: 8px; font-size: 1.25rem; }
.card p { margin-bottom: 16px; color: #4b5563; line-height: 1.5; }
.btn {
padding: 10px 20px;
border: none;
border-radius: 6px;
background-color: #2563eb;
color: white;
font-weight: 600;
}

Browser bringen für <button> eigene Standard-Styles mit - je nach Betriebssystem unterschiedlich (grauer 3D-Rand, Systemschrift, …). Für ein einheitliches Design überschreibt man das meist komplett:

.btn {
/* Native Defaults entfernen */
border: none;
font: inherit; /* Schriftart/-größe vom umgebenden Text übernehmen statt Browser-Standard */
cursor: pointer; /* zeigt: hier kann geklickt werden */
/* Eigenes Design */
padding: 10px 20px;
border-radius: 6px;
background-color: #2563eb;
color: white;
font-weight: 600;
}
  • font: inherit übernimmt alle Font-Eigenschaften (Familie, Größe, Gewicht, …) vom Elternelement. Buttons/Inputs bekommen sonst eine eigene System-Schriftart
  • cursor: pointer sorgt für den Zeigefinger-Mauszeiger. Bei <button> ist das eigentlich schon Standard, aber wichtig, sobald ihr klickbare <div>s oder <a>s wie Buttons aussehen lasst

Ein <img> bringt von Haus aus seine eigene Pixelgröße mit. Die passt selten exakt ins Layout:

img {
max-width: 100%; /* nie breiter als der Container */
height: auto; /* Seitenverhältnis bleibt erhalten */
}

Manchmal soll ein Bild eine feste Größe haben (z.B. ein quadratisches Profilbild), ohne verzerrt zu werden:

.avatar {
width: 80px;
height: 80px;
object-fit: cover; /* füllt die Box, schneidet Überstehendes ab */
border-radius: 50%;
}
WertVerhalten
fill (Standard)Bild wird verzerrt, um die Box exakt zu füllen
coverBild füllt die Box komplett, Seitenverhältnis bleibt - Ränder werden abgeschnitten
containGanzes Bild bleibt sichtbar, ggf. mit Rand - Seitenverhältnis bleibt

<ul>/<ol> bringen von Haus aus Aufzählungszeichen und einen Innenabstand mit:

ul {
list-style: none; /* Punkte/Nummern entfernen */
padding-left: 0; /* Standard-Einrückung entfernen */
margin: 0;
}

Ist der Inhalt einer Box größer als ihre width/height, bestimmt overflow, was passiert:

.box {
width: 200px;
height: 100px;
overflow: auto; /* Scrollbalken nur wenn nötig */
}
WertVerhalten
visible (Standard)Inhalt läuft sichtbar über die Box hinaus
hiddenÜberstehender Inhalt wird abgeschnitten, unsichtbar
scrollImmer Scrollbalken, auch wenn nicht nötig
autoScrollbalken nur wenn der Inhalt tatsächlich zu groß ist

Ihr kennt schon px, em und rem aus dem Fonts-Abschnitt. CSS hat noch mehr Einheiten, die in der Praxis nützlich sind:

.hero {
height: 100vh; /* 100% der Viewport-Höhe */
width: 100vw; /* 100% der Viewport-Breite */
}
.sidebar {
width: 30%; /* 30% der Breite des Eltern-Elements */
}
input {
width: 20ch; /* Breite von ca. 20 Zeichen "0" */
}
EinheitBezugspunkt
%Prozent vom Eltern-Element
vw / vhHundertstel der Viewport-Breite/-Höhe
chBreite des Zeichens „0” in der aktuellen Schriftart
exHöhe des Kleinbuchstaben „x” im Eltern-Element

Absolute Einheiten: für Bildschirme meist ungeeignet

Abschnitt betitelt „Absolute Einheiten: für Bildschirme meist ungeeignet“

CSS kennt auch physische Einheiten wie cm (Zentimeter) und in (Inch) - dazu noch viele mehr.

@media print {
.page { width: 21cm; } /* A4-Breite */
}

Anders als px, %, vw/vh, em/rem/ch/ex sind das absolute, keine relativen Einheiten. Sinnvoll nutzbar sind sie eigentlich nur bei der Ausgabe auf Papier (@media print). Auf Bildschirmen bleibt man bei relativen Einheiten.