Inhaltskategorien
Die meisten HTML-Elemente gehören zu einer oder mehreren Inhaltskategorien. Diese Kategorien gruppieren Elemente mit gemeinsamen Merkmalen. Die Gruppierung ist lose – sie stellt keine tatsächliche Beziehung zwischen den Elementen einer Kategorie her –, hilft aber dabei, ihr gemeinsames Verhalten und die zugehörigen Regeln zu definieren und zu beschreiben. Manche Elemente gehören zu keiner dieser Kategorien.
Die Inhaltskategorien dienen dazu, das Inhaltsmodell von Elementen zu definieren, also festzulegen, welche Nachkommen ein Element enthalten darf. Beispielsweise darf das Element <p> nur Phrasierungsinhalt enthalten, während <div> Flussinhalt enthalten darf. Einige Elemente, etwa <ins>, haben ein transparentes Inhaltsmodell.
Es gibt sieben Hauptkategorien für Inhalte, deren Beziehungen das folgende Venn-Diagramm zusammenfasst:

Hinweis: Eine ausführlichere Erörterung dieser Inhaltskategorien und ihrer jeweiligen Funktionen würde den Rahmen dieses Artikels sprengen. Weitere Informationen finden Sie in den entsprechenden Abschnitten der HTML-Spezifikation.
Metadateninhalt
Elemente der Kategorie Metadateninhalt ändern die Darstellung oder das Verhalten des übrigen Dokuments, stellen Verknüpfungen zu anderen Dokumenten her oder vermitteln andere Informationen, die nicht zum eigentlichen Dokumentinhalt gehören. Alles innerhalb von <head> ist Metadateninhalt, darunter <title>, <link>, <script>, <style> und das seltener verwendete <base>. Für Metadaten, die sich nicht durch diese anderen Elemente darstellen lassen, gibt es das Element <meta>.
Die Metadatenelemente sind:
Einige dieser Elemente gehören zu mehr als einer Inhaltskategorie. Beispielsweise gehört <script> zu den Kategorien Metadateninhalt, Flussinhalt und Phrasierungsinhalt und ist außerdem ein skriptunterstützendes Element. <script> kann dort verwendet werden, wo Metadateninhalt, Phrasierungsinhalt oder skriptunterstützende Elemente erwartet werden.
Flussinhalt
Flussinhalt ist eine breite Kategorie, die die meisten Elemente umfasst, die innerhalb des Elements <body> stehen können. Dazu gehören Überschriftenelemente, gliedernde Elemente, Phrasierungselemente, eingebettete Elemente, interaktive Elemente und formularbezogene Elemente. Auch Textknoten gehören dazu, sofern sie nicht ausschließlich aus Leerraumzeichen bestehen.
Die Elemente mit Flussinhalt sind:
<a><abbr><address><article><aside><audio><b><bdi><bdo><blockquote><br><button><canvas><cite><code><data><datalist><del><details><dfn><dialog><div><dl><em><embed><fieldset><figure><footer><form><geolocation><h1>-<h6><header><hgroup><hr><i><iframe><img><input><ins><kbd><label><main><map><mark><math><menu><meter><nav><noscript><object><ol><output><p><picture><pre><progress><q><ruby><s><samp><script><search><section><select><slot><small><span><strong><style><sub><sup><svg><table><template><textarea><time><u><ul><var><video><wbr>- Autonome benutzerdefinierte Elemente
- Reiner Text
Einige weitere Elemente gehören nur dann zu dieser Kategorie, wenn eine bestimmte Bedingung erfüllt ist:
Gliederungsinhalt
Gliederungsinhalt ist eine Untergruppe des Flussinhalts. Er erzeugt einen Abschnitt in der aktuellen Dokumentgliederung und legt damit den Geltungsbereich von <header>- und <footer>-Elementen fest.
Die gliedernden Elemente sind:
Überschrifteninhalt
Überschrifteninhalt ist eine Untergruppe des Flussinhalts und definiert den Titel eines Abschnitts. Das gilt sowohl für Abschnitte, die durch ein explizites Element mit Gliederungsinhalt gekennzeichnet sind, als auch für Abschnitte, die durch den Überschrifteninhalt selbst implizit definiert werden.
Die Überschriftenelemente sind:
Hinweis:
Das Element <header> enthält zwar wahrscheinlich Überschrifteninhalt, ist selbst aber kein Überschrifteninhalt.
Phrasierungsinhalt
Phrasierungsinhalt ist eine Untergruppe des Flussinhalts und umfasst den Text sowie die Auszeichnung innerhalb eines Dokuments. Folgen von Phrasierungsinhalt bilden Absätze.
Die Phrasierungselemente sind:
<abbr><audio><b><bdi><bdo><br><button><canvas><cite><code><data><datalist><dfn><em><embed><i><iframe><img><input><kbd><label><mark><math><meter><noscript><object><output><picture><progress><q><ruby><s><samp><script><select><slot><small><span><strong><sub><sup><svg><template><textarea><time><u><var><video><wbr>- Autonome benutzerdefinierte Elemente
- Reiner Text
Einige weitere Elemente gehören nur dann zu dieser Kategorie, wenn eine bestimmte Bedingung erfüllt ist:
<a>, wenn es ausschließlich Phrasierungsinhalt enthält<area>, wenn es ein Nachkomme eines<map>-Elements ist<del>, wenn es ausschließlich Phrasierungsinhalt enthält<ins>, wenn es ausschließlich Phrasierungsinhalt enthält<link>, wenn das Attributitempropvorhanden ist<map>, wenn es ausschließlich Phrasierungsinhalt enthält<meta>, wenn das Attributitempropvorhanden ist
Eingebetteter Inhalt
Eingebetteter Inhalt ist eine Untergruppe des Flussinhalts. Er importiert eine andere Ressource oder fügt Inhalte aus einer anderen Auszeichnungssprache oder einem anderen Namensraum in das Dokument ein.
Die Elemente für eingebettete Inhalte sind:
Interaktiver Inhalt
Interaktiver Inhalt ist eine Untergruppe des Flussinhalts und umfasst Elemente, die speziell für die Interaktion mit Benutzern vorgesehen sind.
Die Elemente mit interaktivem Inhalt sind:
Einige Elemente gehören nur unter bestimmten Bedingungen zu dieser Kategorie:
Wahrnehmbarer Inhalt
Wahrnehmbarer Inhalt ist Inhalt, der weder leer noch verborgen ist: Er wird dargestellt und ist inhaltlich relevant. Wahrnehmbarer Inhalt dient nicht zur Definition von Inhaltsmodellen, sondern einer allgemeinen Regel: Elemente, deren Inhaltsmodell beliebigen Flussinhalt oder Phrasierungsinhalt zulässt, sollten mindestens einen Knoten enthalten, der wahrnehmbarer Inhalt ist und für den das Attribut hidden nicht angegeben ist.
Die Elemente mit wahrnehmbarem Inhalt sind:
<a><abbr><address><article><aside><b><bdi><bdo><blockquote><button><canvas><cite><code><data><del><details><dfn><div><em><embed><fieldset><footer><figure><form><iframe><img><ins><kbd><label><main><map><mark><math><meter><nav><object><p><picture><pre><progress><q><ruby><s><samp><search><section><select><small><span><strong><sub><sup><svg><table><textarea><time><u><var><video>- Autonome benutzerdefinierte Elemente
- Reiner Text, der kein Leerraum zwischen Elementen ist
Einige Elemente gehören nur unter bestimmten Bedingungen zu dieser Kategorie:
<audio>, wenn das Attributcontrolsvorhanden ist<dl>, wenn die Kindelemente des Elements mindestens eine Name-Wert-Gruppe umfassen<input>, wenn das Attribut type nicht den Zustandhiddenhat<ol>, wenn seine Kindelemente mindestens ein<li>-Element umfassen<ul>, wenn seine Kindelemente mindestens ein<li>-Element umfassen
Elemente ohne Kategorie
Mehrere Elemente gehören zu keiner Inhaltskategorie. Dazu zählen:
Skriptunterstützende Elemente
Skriptunterstützende Elemente tragen nicht direkt zur dargestellten Ausgabe eines Dokuments bei. Stattdessen unterstützen sie Skripte, indem sie entweder Skriptcode direkt enthalten oder angeben oder Daten bereitstellen, die von Skripten verwendet werden. Fast alle Elemente können skriptunterstützende Elemente enthalten – auch solche, die ansonsten nur bestimmte Elemente zulassen, etwa <ul> mit <li>-Elementen.
Die skriptunterstützenden Elemente sind:
Formularbezogener Inhalt
Formularbezogener Inhalt ist eine Untergruppe des Flussinhalts. Sie umfasst Elemente, die einem Formular zugeordnet sind und überall verwendet werden können, wo Flussinhalt erwartet wird. Das zugeordnete Formular ist entweder das umschließende <form>-Element oder das <form>-Element, dessen id im Attribut form des Elements angegeben ist.
Die formularbezogenen Elemente sind:
Diese Kategorie enthält mehrere Unterkategorien:
- listed
-
Elemente, die in den Sammlungen
HTMLFormElement.elementsundHTMLFieldSetElement.elementsaufgeführt sind. Dazu gehören<button>,<fieldset>,<input>,<object>,<output>,<select>und<textarea>. - submittable
-
Elemente, die beim Absenden des Formulars zur Erstellung des Formulardatensatzes verwendet werden können. Dazu gehören
<button>,<input>,<select>und<textarea>. - resettable
-
Elemente, die beim Zurücksetzen eines Formulars beeinflusst werden können. Dazu gehören
<input>,<output>,<select>und<textarea>. - autocapitalize-and-autocorrect-inheriting
-
Elemente, die die Attribute
autocapitalizeundautocorrectvon ihrem zugeordneten Formular erben. Dazu gehören<button>,<fieldset>,<input>,<output>,<select>und<textarea>. - labelable
-
Elemente, die mit
<label>-Elementen verknüpft werden können. Dazu gehören<button>,<input>(alle Typen außerhidden),<meter>,<output>,<progress>,<select>und<textarea>.
Transparentes Inhaltsmodell
Neben den aufgeführten Inhaltskategorien kann das Inhaltsmodell eines Elements auch als „transparent“ definiert sein. Wenn der zulässige Inhalt eines Elements X „transparent“ ist, betrachten wir das Elternelement von X. Wir bilden die Schnittmenge aus dem zulässigen Inhalt des Elternelements von X und den Inhaltskategorien von X. Das Ergebnis bestimmt, was „transparent“ in diesem Zusammenhang bedeutet. Hat das Elternelement von X ebenfalls ein transparentes Inhaltsmodell, gehen wir im Baum weiter nach oben, bis wir ein nicht transparentes Inhaltsmodell finden. Gibt es kein solches Elternelement, bedeutet „transparent“ „Flussinhalt“.
Beispielsweise erlaubt ein <ruby>-Element Phrasierungsinhalt. Das Element <ins> gehört zur Kategorie Phrasierungsinhalt, wenn es ausschließlich Phrasierungsinhalt enthält. Daher kann ein <ins>-Element innerhalb eines <ruby>-Elements stehen. Der zulässige Inhalt des Elements <ins> ist „transparent“, was innerhalb von <ruby> „Phrasierungsinhalt“ bedeutet. <rt>-Elemente sind jedoch kein Phrasierungsinhalt. Deshalb kann ein <rt>-Element nicht innerhalb dieses <ins>-Elements stehen, obwohl sowohl <rt> als auch <ins> innerhalb von <ruby> stehen können und <ins> „transparent“ ist.
<ruby>
Text before
<ins>
<!-- Invalid: rt cannot be placed inside ins here -->
<rt>Pronunciation</rt>
</ins>
</ruby>
<ruby>
Text before
<!-- Valid: ins can be inside ruby, and rt can be inside ruby -->
<ins>Inserted text</ins>
<rt>Pronunciation</rt>
</ruby>
<ruby>
Text before
<!-- Valid: rt can be inside ruby, and ins can be inside rt -->
<rt><ins>Pronunciation</ins></rt>
</ruby>
„Transparent“ ist ein Inhaltsmodell, keine Inhaltskategorie. Es definiert also nur, was ein Element enthalten darf, nicht aber, wo das Element stehen darf. Bei der Prüfung, ob die Kindelemente eines Elements zulässig sind, kann man daher nicht durch transparente Kindelemente „hindurchsehen“. Beispielsweise erlaubt ein <ul>-Element nur <li>-Elemente und skriptunterstützende Elemente, aber weder <del> noch <ins> – selbst dann nicht, wenn <del> ausschließlich <li>-Elemente enthält.
<ul>
<del>
<li>Oranges</li>
<li>Toilet paper</li>
</del>
<li>Toothpaste</li>
</ul>
<ul>
<li><del>Oranges</del></li>
<li><del>Toilet paper</del></li>
<li>Toothpaste</li>
</ul>