CategorÃas de contenido
La mayorÃa de los elementos HTML son miembros de una o más categorÃas de contenido â estas categorÃas agrupan elementos que comparten caracterÃsticas comunes. Se trata de una agrupación flexible (en realidad no crea una relación entre los elementos de estas categorÃas), pero ayudan a definir y describir el comportamiento compartido de las categorÃas y las reglas asociadas a ellas. Es posible que algunos elementos no sean miembros de ninguna de estas categorÃas.
Las categorÃas de contenido se usan para definir el modelo de contenido de los elementos; es decir, qué puede tener cada uno como descendientes. Por ejemplo, el elemento <p> solo puede contener contenido de frase, mientras que el elemento <div> puede contener contenido de flujo. Algunos elementos, como <ins>, tienen un modelo de contenido transparente.
Existen siete categorÃas de contenido principales, que se pueden resumir en el siguiente diagrama de Venn:

Nota: Un análisis más detallado de estas categorÃas de contenido y sus funcionalidades comparativas está fuera del alcance de este artÃculo; para eso, quizá quieras leer las partes relevantes de la especificación HTML.
Contenido de metadatos
Los elementos que pertenecen a la categorÃa de contenido de metadatos modifican la presentación o el comportamiento del resto del documento, establecen enlaces hacia otros documentos o transmiten otro tipo de información fuera de banda. Todo lo que está dentro de <head>, incluidos <title>, <link>, <script>, <style> y el menos usado <base>, es contenido de metadatos. Existe también el elemento <meta> para los metadatos que no se pueden representar con estos otros elementos.
Los elementos de metadatos son:
Algunos de estos elementos pertenecen a más de una categorÃa de contenido. Por ejemplo, <script> es miembro de las categorÃas de contenido de metadatos, de flujo y de frase, y además es un elemento de soporte de scripts; <script> se puede usar en cualquier lugar donde se espere contenido de metadatos, contenido de frase o elementos de soporte de scripts.
Contenido de flujo
El contenido de flujo es una categorÃa amplia que engloba la mayorÃa de los elementos que pueden ir dentro del elemento <body>, incluidos los elementos de encabezado, los elementos de seccionamiento, los elementos de frase, los elementos incrustados, los elementos interactivos y los elementos relacionados con formularios. También incluye nodos de texto (pero no aquellos que solo consisten en espacios en blanco).
Los elementos de flujo son:
<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><sub><sup><svg><table><template><textarea><time><u><ul><var><video><wbr>- Elementos personalizados autónomos
- Texto sin formato
Algunos otros elementos pertenecen a esta categorÃa, pero solo si se cumple una condición especÃfica:
Contenido de seccionamiento
El contenido de seccionamiento, un subconjunto del contenido de flujo, crea una sección en el esquema actual que define el alcance de los elementos <header> y <footer>.
Los elementos de seccionamiento son:
Contenido de encabezado
El contenido de encabezado, un subconjunto del contenido de flujo, define el tÃtulo de una sección. Esta definición se aplica tanto a las secciones marcadas explÃcitamente por elementos de contenido de seccionamiento como a las que se definen implÃcitamente mediante el propio contenido de encabezado.
Los elementos de encabezado son:
Nota:
Aunque es probable que contenga contenido de encabezado, <header> no es, en sà mismo, contenido de encabezado.
Contenido de frase
El contenido de frase, un subconjunto del contenido de flujo, se refiere al texto y al marcado dentro de un documento. Las secuencias de contenido de frase forman párrafos.
Los elementos de frase son:
<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>- Elementos personalizados autónomos
- Texto sin formato
Algunos otros elementos pertenecen a esta categorÃa, pero solo si se cumple una condición especÃfica:
Contenido incrustado
El contenido incrustado, un subconjunto del contenido de flujo, importa otro recurso o inserta contenido de otro lenguaje de marcado o namespace en el documento.
Los elementos de contenido incrustado son:
Contenido interactivo
El contenido interactivo, un subconjunto del contenido de flujo, incluye elementos diseñados especÃficamente para la interacción del usuario.
Los elementos de contenido interactivo son:
Algunos elementos pertenecen a esta categorÃa solo bajo condiciones especÃficas:
Contenido palpable
El contenido palpable es contenido que no está vacÃo ni oculto; es contenido que se renderiza y que es sustantivo. El contenido palpable no se usa para definir modelos de contenido, sino para establecer una regla general: los elementos cuyo modelo de contenido permite cualquier contenido de flujo o contenido de frase deben tener, al menos, un nodo en su contenido que sea contenido palpable y que no tenga especificado el atributo hidden.
Los elementos palpables son:
<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>- Elementos personalizados autónomos
- Texto sin formato que no sean espacios en blanco entre elementos
Algunos elementos pertenecen a esta categorÃa solo bajo condiciones especÃficas:
<audio>, si está presente el atributocontrols<dl>, si sus elementos hijos incluyen al menos un grupo nombre-valor<input>, si el atributo type no está en el estado oculto<ol>, si sus elementos hijos incluyen al menos un elemento<li><ul>, si sus elementos hijos incluyen al menos un elemento<li>
Elementos sin categorÃa
Varios elementos no son miembros de ninguna categorÃa de contenido. Entre ellos:
Elementos de soporte de scripts
Los elementos de soporte de scripts son elementos que no contribuyen directamente a la salida renderizada del documento. En cambio, sirven para dar soporte a los scripts, ya sea conteniendo o especificando directamente el código del script, o especificando datos que los scripts utilizarán. Casi todos los elementos, incluidos aquellos que solo aceptan elementos especÃficos (como <ul>, que acepta elementos <li>), pueden contener elementos de soporte de scripts.
Los elementos de soporte de scripts son:
Contenido asociado a formularios
El contenido asociado a formularios es un subconjunto del contenido de flujo compuesto por elementos que tienen un formulario propietario y pueden usarse en cualquier lugar donde se espere contenido de flujo. Un formulario propietario es el elemento <form> que lo contiene, o el <form> cuyo id se especifica en el atributo form del elemento.
Los elementos asociados a formularios son:
Esta categorÃa contiene varias subcategorÃas:
- enumerado
-
Elementos que aparecen en las colecciones
HTMLFormElement.elementsyHTMLFieldSetElement.elements. Incluye<button>,<fieldset>,<input>,<object>,<output>,<select>y<textarea>. - enviables
-
Elementos que se pueden usar para construir el conjunto de datos del formulario cuando este se envÃa. Incluye
<button>,<input>,<select>y<textarea>. - reiniciables
-
Elementos que pueden verse afectados cuando se reinicia un formulario. Incluye
<input>,<output>,<select>y<textarea>. - que heredan autocapitalize y autocorrect
-
Elementos que heredan los atributos
autocapitalizeyautocorrectde su formulario propietario. Incluye<button>,<fieldset>,<input>,<output>,<select>y<textarea>. - etiquetables
-
Elementos que se pueden asociar con elementos
<label>. Incluye<button>,<input>(todos los tipos salvohidden),<meter>,<output>,<progress>,<select>y<textarea>.
Modelo de contenido transparente
Además de las categorÃas de contenido enumeradas, el modelo de contenido de un elemento también se puede definir como "transparente". Si el contenido permitido del elemento X es "transparente", entonces se consulta al padre de X. Se intersecciona el contenido permitido del padre de X con las categorÃas de contenido de X, y el resultado es lo que significa "transparente" en este contexto. Si el padre de X también tiene un modelo de contenido transparente, continuamos subiendo por el árbol hasta encontrar un modelo de contenido que no sea transparente. Cuando no existe tal padre, "transparente" significa "contenido de flujo".
Por ejemplo, el elemento <ruby> acepta contenido de frase. El elemento <ins> pertenece a la categorÃa de contenido de frase cuando solo contiene contenido de frase. Por lo tanto, un elemento <ins> se puede colocar dentro de un elemento <ruby>. El contenido permitido del elemento <ins> es "transparente", lo que, al estar anidado en <ruby>, significa "contenido de frase". Sin embargo, los elementos <rt> no son contenido de frase. Por lo tanto, un elemento <rt> no se puede anidar dentro de este elemento <ins>, aunque tanto <rt> como <ins> puedan estar dentro de <ruby>, y <ins> sea "transparente".
<ruby>
Texto antes
<ins>
<!-- No válido: rt no puede colocarse dentro de ins aquà -->
<rt>Pronunciación</rt>
</ins>
</ruby>
<ruby>
Texto antes
<!-- Válido: ins puede estar dentro de ruby, y rt puede estar dentro de ruby -->
<ins>Texto insertado</ins>
<rt>Pronunciación</rt>
</ruby>
<ruby>
Texto antes
<!-- Válido: rt puede estar dentro de ruby, y ins puede estar dentro de rt -->
<rt><ins>Pronunciación</ins></rt>
</ruby>
Transparente es un modelo de contenido, no una categorÃa de contenido, asà que solo define lo que un elemento puede contener, no dónde se puede colocar el elemento. Es decir, al determinar la validez de los elementos hijos de un elemento, no puedes "ver a través" de los hijos transparentes. Por ejemplo, un elemento <ul> solo acepta elementos <li> y elementos de soporte de scripts, y no permite <del> ni <ins>, aunque el <del> solo contenga elementos <li>.
<ul>
<del>
<li>Naranjas</li>
<li>Papel higiénico</li>
</del>
<li>Pasta de dientes</li>
</ul>
<ul>
<li><del>Naranjas</del></li>
<li><del>Papel higiénico</del></li>
<li>Pasta de dientes</li>
</ul>