Kastenmodell

The CSS Podcast – 001: The Box Model

Nehmen wir an, Sie haben diese HTML-Version:

<p>I am a paragraph of text that has a few words in it.</p>

Dann schreiben Sie diesen CSS-Code dafür:

p {
  width: 100px;
  height: 50px;
  padding: 20px;
  border: 1px solid;
}

Der Inhalt wird dann anstelle der von Ihnen angegebenen 100 Pixel 142 Pixel breit, und bricht aus dem Element heraus. Why is that?

Das Box-Modell ist eine zentrale Grundlage von CSS. Wenn Sie wissen, wie das Boxmodell funktioniert, wie es von anderen CSS-Aspekten beeinflusst wird und vor allem, wie Sie es steuern können, können Sie besser vorhersehbaren CSS-Code schreiben.

Wenn Sie das Boxmodell von CSS verstehen, können Sie leichter herausfinden, warum Ihr Inhalt nicht in ein Element passt.

Alles, was von CSS angezeigt wird, ist ein Feld, auch wenn es nur Text enthält oder ein border-radius enthält, das wie ein Kreis aussieht.

Inhalt und Größe

Felder verhalten sich je nach ihrem display-Wert, ihren festgelegten Abmessungen und dem Inhalt, den sie enthalten, unterschiedlich. Dieser Inhalt kann Nur-Text oder mehr durch untergeordnete Elemente generierte Felder sein. In beiden Fällen wirkt sich der Inhalt standardmäßig auf die Größe des Felds aus.

Sie können dies mithilfe der externen Größenanpassung steuern oder die intrinsische Größe verwenden, damit der Browser anhand der Inhaltsgröße Entscheidungen für Sie trifft.

Hier ist eine einfache Demo, die den Unterschied erklärt:

Wenn das Feld eine externe Größe hat, gibt es eine Beschränkung dafür, wie viele Inhalte Sie hinzufügen können, bevor das Feld außerhalb des Felds überläuft. Dadurch fällt das Wort „fantastisch“ über.

Die Demo enthält die Worte „CSS ist fantastisch“ in einem Feld mit festen Abmessungen und einem breiten Rahmen. Da das Feld eine bestimmte Breite hat, hat es eine externe Größe. Das bedeutet, dass die Größe der untergeordneten Inhalte festgelegt wird. Das Wort "awesome" ist jedoch zu groß für das Feld, sodass es außerhalb des Rahmenfelds des übergeordneten Feldes überläuft (mehr dazu später). Eine Möglichkeit, diesen Überlauf zu verhindern, besteht darin, die Größe des Felds zu ändern, indem Sie entweder die Breite nicht festlegen oder in diesem Fall width auf min-content setzen. Mit dem Schlüsselwort min-content wird festgelegt, dass das Feld nur so breit ist wie die eigentliche Mindestbreite des Inhalts (das Wort „toll“). Dadurch passt das Feld perfekt um den Text.

Hier ist ein komplexeres Beispiel, das die Auswirkungen unterschiedlicher Größen auf echte Inhalte veranschaulicht:

Mit der externen Größenanpassung können Sie die Größe eines Elements steuern. Die integrierte Größenanpassung verhindert das Überlaufen von Text.

Aktivieren und deaktivieren Sie die interne Größenanpassung, um zu sehen, wie Sie mit der externen Größenanpassung mehr Kontrolle haben. Mit der systeminternen Größenanpassung erhalten Sie mehr Kontrolle. Fügen Sie der Karte einige Sätze hinzu, um die Effekte zu sehen. Wenn dieses Element eine externe Größe hat, gibt es ein Limit dafür, wie viel Inhalt Sie hinzufügen können, bevor es überläuft. Dies ist jedoch nicht der Fall, wenn die systeminterne Größenanpassung aktiviert ist.

Standardmäßig hat dieses Element jeweils einen width und einen height von 400px. Diese Dimensionen geben strikte Grenzen für alles innerhalb des Elements vor, die berücksichtigt werden, es sei denn, der Inhalt ist zu groß für die Box. Sie können dies in Aktion sehen, indem Sie die Bildunterschrift unter dem Blumenbild in einen Wert ändern, der die Höhe der Box übersteigt.

Schlüsselbegriff: Überlauf entsteht, wenn Inhalte zu groß für das Feld sind, in dem sie sich befinden. Mit dem Attribut overflow können Sie festlegen, wie ein Element mit Überlaufinhalten umgehen soll.

Wenn Sie zur internen Größe wechseln, kann der Browser anhand der Inhaltsgröße des Felds Entscheidungen für Sie treffen. Das Überlauf wird dadurch deutlich unwahrscheinlicher, da sich die Größe des Felds mit seinem Inhalt anpasst.

Es ist wichtig zu beachten, dass die intrinsische Größenanpassung das Standardverhalten des Browsers ist und in der Regel viel mehr Flexibilität bietet als eine externe Größenanpassung.

Die Bereiche des Boxmodells

Boxen bestehen aus unterschiedlichen Boxmodellbereichen, die alle eine bestimmte Aufgabe erfüllen.

Ein Diagramm, das die vier Hauptbereiche des Boxmodells zeigt: Inhaltsfeld, Innenabstände, Rahmen und Randfeld
Die vier Hauptbereiche des Boxmodells: Inhaltsfeld, Innenabstände, Rahmen und Rand.

Das Inhaltsfeld ist der Bereich, in dem sich die Inhalte befinden. Über den Inhalt lässt sich die Größe des übergeordneten Bereichs festlegen, d. h., dies ist in der Regel der Bereich mit der größten unterschiedlichen Größe.

Das Padding-Feld umgibt das Inhaltsfeld. Es handelt sich dabei um den Bereich, der von der padding-Eigenschaft erstellt wird. Da sich der Innenrand innerhalb des Felds befindet, ist der Hintergrund der Box in dem dadurch entstehenden Raum sichtbar. Wenn für das Feld Überlaufregeln wie overflow: auto oder overflow: scroll festgelegt sind, nehmen auch die Bildlaufleisten diesen Bereich ein.

Bildlaufleisten befinden sich im Abstandsfeld.

Der Rahmenrahmen umgibt den Rahmen. Der Abstand wird durch den Wert border definiert, der einen visuellen Rahmen für das Element erstellt. Der Rahmenrand des Elements beschränkt den sichtbaren Bereich.

Der letzte Bereich, das Randfeld, ist der Abstand um das Rechteck, der von der margin-Regel des Kästchens definiert wird. Eigenschaften wie outline und box-shadow nehmen ebenfalls diesen Raum ein, weil sie über das Element gezeichnet werden und keinen Einfluss auf die Größe der Box haben. Wenn Sie den outline-width des Kästchens von 200px für ein Feld ändern, ändert sich innerhalb des Rahmenrands nichts.

Ein breiter Umriss wirkt sich nicht auf die Größe des Rests des Elements aus.

Eine nützliche Analogie

Das Boxmodell ist komplex zu verstehen. Hier ist eine Analogie zu dem, was Sie bisher gelernt haben.

Drei Bilderrahmen.
Das Boxmodell mit physischen Bilderrahmen

In diesem Diagramm sind drei Bilderrahmen nebeneinander an einer Wand montiert. Die Elemente des gerahmten Bilds entsprechen dem Boxmodell wie folgt:

  • Das Inhaltsfeld ist das Artwork.
  • Der Rahmen ist die weiße Wandhalterung zwischen Rahmen und Artwork.
  • Das Rahmenfeld ist der Rahmen, der als Rahmen für das Artwork dient.
  • Das Randfeld ist der Abstand zwischen den Frames.
  • Der Schatten nimmt denselben Platz ein wie das Randfeld.

Fehler im Boxmodell beheben

Browser-Entwicklertools bieten eine Visualisierung der Boxmodellberechnungen eines ausgewählten Felds, die Ihnen helfen kann, zu verstehen, wie das Boxmodell funktioniert und wie es sich auf die Website auswirkt, an der Sie arbeiten.

Probieren Sie dies in Ihrem eigenen Browser aus:

  1. Öffnen Sie die Entwicklertools.
  2. Wählen Sie ein Element aus.
  3. Debugger für Boxmodellen anzeigen.
Der Box-Modell-Debugger für die Outline-Demo

Steuerung des Boxmodells

Um zu verstehen, wie das Boxmodell gesteuert wird, müssen Sie zuerst verstehen, was in Ihrem Browser passiert.

Jeder Browser wendet ein User-Agent-Stylesheet auf HTML-Dokumente an, in dem festgelegt wird, wie Elemente aussehen und funktionieren sollen, wenn kein CSS definiert ist. Der CSS-Code in User-Agent-Stylesheets variiert je nach Browser, bietet jedoch sinnvolle Standardwerte, um die Lesbarkeit von Inhalten zu verbessern.

Eine Eigenschaft des User-Agent-Stylesheets legt den standardmäßigen display eines Felds fest. Bei einem normalen Ablauf lautet der Standardwert für display eines <div>-Elements beispielsweise block, ein <li> hat den Standardwert display von list-item und ein <span> hat einen standardmäßigen display-Wert von inline.

Ein inline-Element hat einen Blockrand, der von anderen Elementen nicht berücksichtigt wird. Bei inline-block berücksichtigen andere Elemente den Blockrand, aber das erste Element behält größtenteils die gleiche Funktionsweise wie das inline-Element bei. Ein block-Element füllt standardmäßig den verfügbaren Inline-Bereich aus, während inline- und inline-block-Elemente nur so groß wie ihr Inhalt sind.

Das User-Agent-Stylesheet legt auch box-sizing fest. Dadurch wird festgelegt, wie ein Feld seine Boxgröße berechnen soll. Standardmäßig haben alle Elemente den folgenden User-Agent-Stil: box-sizing: content-box;. Wenn Sie also Dimensionen wie width oder height festlegen, gelten diese für das Inhaltsfeld. Wenn Sie dann padding und border festlegen, werden diese Werte der Größe des Inhaltsfelds hinzugefügt.

Wissen testen

Testen Sie Ihr Wissen über die Auswirkungen der Boxmodellgröße auf Eigenschaften.

.my-box {
  width: 200px;
  border: 10px solid;
  padding: 20px;
}

Wie breit wird .my-box wohl sein?

200 Pixel
Da der Standardwert für „box-sizing“ „content-box“ ist, werden der Breite Abstand und Rahmen hinzugefügt. 200px wäre richtig, wenn das Feld box-sizing: border-box hätte.
260 Pixel
Die Standardgröße für die Box ist „content-box“. Das bedeutet, dass der Innenrand und die Rahmen zum Gesamtfeld hinzugefügt werden.

Die tatsächliche Breite dieses Felds beträgt 260 Pixel. Da der CSS-Code die Standardeinstellung box-sizing: content-box verwendet, entspricht die angewendete Breite der Breite des Inhalts. Dabei werden padding und border auf beiden Seiten hinzugefügt. 200 Pixel für den Inhalt + 40 Pixel Abstand und 20 Pixel des Rahmens ergeben eine Gesamtbreite von 260 Pixeln.

Sie können dies ändern, indem Sie die Größe border-box angeben:

.my-box {
  box-sizing: border-box;
    width: 200px;
    border: 10px solid;
    padding: 20px;
}

Dieses alternative Boxmodell weist CSS an, width auf das Rahmenfeld statt auf das Inhaltsfeld anzuwenden. Das bedeutet, dass border und padding eingereicht werden. Wenn Sie also .my-box auf die Breite von 200px festlegen, wird sie tatsächlich in der Breite von 200px gerendert.

In der folgenden interaktiven Demo sehen Sie, wie das funktioniert. Wenn Sie den Wert box-sizing ein-/ausschalten, wird im blauen Bereich angezeigt, welches CSS innerhalb des Felds angewendet wird.

Auswirkungen der Größenanpassung für Contentbox und Border Box vergleichen
*,
*::before,
*::after {
  box-sizing: border-box;
}

Diese CSS-Regel wählt jedes Element im Dokument sowie jedes ::before- und ::after-Pseudoelement aus und wendet box-sizing: border-box an. Das bedeutet, dass jetzt jedes Element dieses alternative Boxmodell verwendet.

Da das alternative Boxmodell vorhersehbarer sein kann, fügen Entwickler diese Regel häufig für Zurücksetzen und Normalizer wie diese hinzu.

Ressourcen

User-Agent-Stylesheets