HTML vs Body in CSS

Avatar of Geoff Graham
Geoff Graham auf

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Der Unterschied zwischen <html> und <body> ist leicht zu übersehen. Es scheint eines dieser Dinge zu sein, die in die Kategorie des Trivialen fallen. Zugegebenermaßen habe ich die Angewohnheit, alle globalen Stile auf <body> anzuwenden, und wenn das nicht ausreicht, wechsle ich gedankenlos zu <html>.

Es gibt jedoch Unterschiede, und es ist eine gute Idee, sich dessen bewusst zu sein, unabhängig davon, ob wir CSS-Veteranen oder Neulinge sind. Wir werden diese in diesem Beitrag behandeln und einige praktische Anwendungen betrachten, bei denen die Gestaltung des einen gegenüber dem anderen sinnvoll sein könnte.

Wie HTML und Body zusammenhängen

Betrachten Sie diese Standardstruktur für ein einfaches HTML-Dokument

<!DOCTYPE html>
<html lang="en">

  <head>
    <!-- Metadata and such -->
  </head>

  <body>
    <!-- Where the content begins -->
  <body>

</html>

Die Spezifikation definiert <html> als Wurzelelement eines Dokuments, und wir können das im obigen Beispiel deutlich sehen: Das <html>-Element ist die oberste Ebene aller anderen Elemente. Dort endet es, da es keine weiteren Ebenen gibt, von denen Stile geerbt werden könnten.

Von dort aus bilden <head> und <body> die einzigen beiden Elemente, die sich direkt innerhalb von <html> befinden. Tatsächlich definiert die Spezifikation <body> direkt im Gegensatz zu <head>, da dies die einzigen beiden Elemente sind, die unterschieden werden müssen.

Die Quintessenz hier ist also, dass <html> das Wurzelelement eines Dokuments ist, während <body> ein Nachfahre ist, der darin enthalten ist. Tatsächlich gibt es in CSS einen :root-Selektor. Diese zielen auf exakt dasselbe ab

:root {

}
html {

}

Außer dass :root eine höhere Spezifität hat: (0, 0, 1, 0) vs. (0, 0, 0, 1).

Sollten wir also immer globale Stile auf <html> anwenden, richtig?

Es ist verlockend zu denken, dass alle Stile, die wir überall erben lassen wollen, direkt auf <html> angewendet werden sollten, da es das Wurzelelement des Dokuments ist. <html> übertrifft <body> in der Hierarchie, daher folgt daraus, dass es alle globalen Stile enthalten muss.

Aber das ist nicht ganz richtig. Tatsächlich wurden Inline-Attribute für die folgenden Elemente ursprünglich der <body>-Spezifikation zugewiesen:

  • background
  • bgcolor
  • marginbottom
  • marginleft
  • marginright
  • margintop
  • text

Während diese Attribute jetzt als veraltet gelten, ist die Empfehlung, stattdessen CSS mit den entsprechenden CSS-Eigenschaften zu verwenden:

Inline-Attribut CSS-Eigenschaft
background background
bgcolor background
background-color
marginbottom margin-bottom
marginleft margin-left
marginright margin-right
margintop margin-top
text font

Da diese CSS-Eigenschaften von Inline-Attributen stammen, die für <body> geschrieben wurden, wäre es angebracht, sie auch in CSS direkt auf <body> anzuwenden, anstatt sie in das <html>-Element zu verschieben.

Also sollten wir globale Stile immer auf <body> anwenden, richtig?

Nun, nicht ganz. Es kann Situationen geben, in denen es sinnvoller ist, Stile auf <html> anzuwenden. Betrachten wir ein paar dieser Szenarien.

Arbeiten mit rem-Einheiten

Die rem-Einheit ist relativ zur Dokumentenwurzel. Wenn Sie zum Beispiel so etwas schreiben:

.module {
  width: 40rem;
}

ist die rem-Einheit relativ zur font-size des <html>-Elements, das die Dokumentenwurzel ist. Was auch immer also als Standard des Benutzers auf der Wurzelebene festgelegt ist, daran wird sich die .module-Klasse orientieren.

Jonathan Snook hat einen klassischen Beitrag, der schön veranschaulicht, wie die Einstellung der font-size auf <html> als Prozentwert als Reset beim Arbeiten mit rem-Einheiten verwendet werden kann.

Eigenartige background-color

Es gibt eine seltsame Sache in CSS, bei der die background-color auf <body> den gesamten Viewport ausfüllt, selbst wenn die Maße des Elements selbst diesen Bereich nicht abdecken. Es sei denn, die background-color wird auf das html-Element gesetzt, dann tut sie das nicht.

Wenn das Auffüllen das Ziel ist, kann es sinnvoll sein, es von vornherein auf das html-Element zu setzen.

Zusammenfassend

Hoffentlich wirft dies Licht auf die wesentlichen Unterschiede zwischen der Verwendung von <html> und <body> in CSS. Es gibt auch JavaScript-Unterschiede. Zum Beispiel müssen Sie nicht nach beiden suchen, html ist document.rootElement und body ist document.body.

Wir könnten sicherlich weitere technische Unterschiede zwischen den beiden ziehen, aber der Punkt hier ist, unser Verständnis zu verbessern, um bessere Entscheidungen beim Schreiben von CSS zu treffen.

Haben Sie weitere Beispiele, wo es sinnvoller ist, das eine gegenüber dem anderen zu gestalten? Oder haben Sie vielleicht eigene Kriterien, wann Sie das eine gestalten? Lassen Sie es uns in den Kommentaren wissen!

Weitere Ressourcen