Skip to content
This page has been auto-translated and may contain errors.View in English

Estructura del documento y el esquema

docs.scrimba.com

Una página no es un montón plano de elementos. Si la lees de arriba a abajo, debe tener coherencia: un título, luego las secciones bajo él, cada una con su propio encabezado, en un orden que tenga sentido para avanzar. Esa forma es el esquema de la página, y proviene de dos cosas que funcionan juntas. Los encabezados nombran cada parte, y las regiones de referencia del capítulo HTML semántico, <header>, <nav>, <main>, <aside> y <footer>, agrupan esas partes en áreas. Este capítulo trata sobre cómo ambas se combinan en una página completa.

Cómo los encabezados y las regiones de referencia forman un esquema

Una página web se lee de arriba a abajo, de la misma manera que lees una página en un libro. Quien la visita comienza en la parte superior y avanza hacia abajo, por lo que el orden en que colocas tu contenido es el orden en que los visitantes lo leen. Coloca las cosas en el orden en que alguien realmente querría encontrarlas.

Los encabezados son lo que le da forma a ese orden. Un encabezado es una etiqueta corta para la parte que lo sigue, escrita con etiquetas que van de <h1> hasta <h6>. El <h1> es el título de toda la página. Cada <h2> nombra una sección principal bajo él, y un <h3> nombra una parte más pequeña dentro de un <h2>. Apílalos y obtendrás el esquema de la página: una tabla de contenidos que refleja el orden de la página.

html
<h1>Masa madre para principiantes</h1>
<h2>Lo que necesitas</h2>
<h3>Ingredientes</h3>
<h3>Equipo</h3>
<h2>Preparar la masa madre</h2>

Lee solo los encabezados y ya sabrás de qué trata la página y cómo está organizada, antes de leer un solo párrafo.

La estructura de una página proviene de dos capas, y responden diferentes preguntas. Los niveles de encabezado <h1> a <h6> forman una jerarquía anidada: <h1> es el título de la página, <h2> una sección de nivel superior, <h3> una subsección de ese <h2>, y así sucesivamente. Lee solo los encabezados y tienes el esquema de la página, una tabla de contenidos construida directamente del marcado.

Los elementos de referencia forman la segunda capa. <header>, <nav>, <main>, <aside> y <footer> agrupan la página en regiones nombradas, de modo que en lugar de una lista anidada de temas obtienes un mapa de áreas: esto es la navegación, esto es el contenido principal, esto es el pie de página.

html
<body>
  <header>
    <nav>...</nav>
  </header>
  <main>
    <h1>Masa madre para principiantes</h1>
    <h2>Lo que necesitas</h2>
    <h2>Preparar la masa madre</h2>
  </main>
  <footer>...</footer>
</body>

Una estructura te dice de qué trata el contenido (encabezados), la otra te dice dónde vive cada tipo de contenido (regiones de referencia). Una página bien construida tiene ambas.

Un esquema es la estructura de la página expresada como una jerarquía: el título en la parte superior, sus secciones debajo, sus subsecciones debajo de esas. Nada dibuja este esquema en la pantalla. Vive en el marcado, y su audiencia principal es el software que lee estructura en lugar de píxeles.

Un lector de pantalla (software que lee una página en voz alta, o controla una pantalla braille, para personas que no navegan por la vista) construye dos estructuras navegables a partir de una página. La primera es una lista de cada encabezado, <h1> a <h6>, mantenida en orden de código fuente con su nivel, para que un usuario pueda obtener todos los encabezados y saltar directamente al que desea. La segunda es una lista de regiones de referencia, las regiones marcadas por <header>, <nav>, <main>, <aside> y <footer>, que les permite saltar entre regiones completas en lugar de leer todo lo que hay entre medias. Cada elemento de referencia lleva un rol ARIA implícito (una etiqueta de accesibilidad que nombra qué tipo de región es, como navigation o main), y ese rol es lo que el lector de pantalla anuncia.

Estas dos estructuras son el esquema en la práctica. Un lector con visión escanea leyendo el texto del encabezado hacia abajo en la página; un usuario de lector de pantalla escanea avanzando a través de los mismos encabezados y regiones. Misma estructura, alcanzada de dos maneras. Esa es la razón para construirla deliberadamente: el esquema no es una decoración en la que se basan algunos, es cómo un gran grupo realmente lee.

JunoCómo los encabezados y las regiones de referencia forman un esquema Lee una página de arriba a abajo, como un libro, así que coloca las cosas en el orden en que la gente las quiere. Tus encabezados, <h1> hasta <h6>, son el esqueleto: el <h1> es el título de la página, y todo se anida bajo él. Lee solo los encabezados y ya deberías saber cómo se distribuye la página.
JunoCómo los encabezados y las regiones de referencia forman un esquema Dos capas le dan forma a una página: los niveles de encabezado construyen una tabla de contenidos anidada, y las regiones como <main> y <nav> trazan un mapa de las regiones. Una dice de qué trata el contenido, la otra dice dónde vive. Construye ambas y la página tiene una estructura real, no solo una apariencia.
JunoCómo los encabezados y las regiones de referencia forman un esquema Un lector de pantalla construye dos listas a partir de tu página: cada encabezado con su nivel, y cada región de referencia. Ese par es tu esquema, y es cómo muchas personas realmente leen. Así que la estructura no es algo agradable para unos pocos usuarios, es la experiencia de lectura en sí, y proviene directamente de las etiquetas que elegiste.

Un main, y el orden correcto de encabezados

Dos hábitos mantienen un esquema limpio. Primero, dale a la página un solo <h1>. Es el título de la página, y una página tiene un título, de la misma manera que un libro tiene un nombre en la portada. Todo lo demás es <h2> y menos.

Segundo, no saltes niveles. Después de un <h2>, el siguiente paso hacia abajo es <h3>, no <h5>. Saltar un nivel deja un hueco en el esquema, como una página de contenidos que enumera el capítulo 1 y luego el capítulo 4. Muévete un nivel a la vez, hacia abajo y hacia arriba:

html
<h1>Cenas entre semana</h1>
<h2>Pasta</h2>
<h3>Tomate y albahaca</h3>
<h3>Ajo y mantequilla</h3>
<h2>Ensaladas</h2>
<h3>Griega</h3>

El contenido que esos encabezados tienen usualmente vive en una región <main>. <main> marca el contenido principal de la página, la parte que es única para esta página y no el encabezado compartido, la navegación o el pie de página. Hay un <main>, igual que hay un <h1>.

Una página tiene exactamente un punto de referencia <main>. Envuelve el contenido que es único para esta página, y los lectores de pantalla ofrecen un salto directo a él, para que un usuario pueda saltarse el encabezado y la navegación que se repiten en cada página. Dos elementos <main> en una página rompen esa promesa y confunden el mapa de regiones.

Para los encabezados, dos reglas mantienen el esquema unido. Hay un <h1>, el título de la página. Y los niveles de encabezado descienden de a uno: un <h2> es seguido por <h3>, nunca directamente a <h4> o <h5>. Elige un nivel de encabezado por su lugar en el esquema, nunca por cuán grande se ve. El <h1> a menudo vive directamente dentro de <main> o en el encabezado de la página, nombrando lo que trata la página.

html
<main>
  <h1>Cenas entre semana</h1>
  <h2>Pasta</h2>
  <h3>Tomate y albahaca</h3>
</main>

Si un encabezado se ve demasiado grande o demasiado pequeño, ese es un problema de estilo. Establece el tamaño en CSS y deja que el nivel signifique lo que significa.

Hay un <main> por página (puedes tener más en el marcado solo si todos menos uno están ocultos, por ejemplo en una aplicación de una sola página que mantiene vistas inactivas en el DOM). Lleva el rol ARIA main, el destino del salto "ir al contenido principal" en el que los usuarios de teclado y lector de pantalla confían para eludir la navegación repetida.

Los niveles de encabezado tienen más peso de lo que parecen, debido a un detalle de historia que vale la pena saber. Durante años, la especificación HTML describía un algoritmo de esquema de documento que calcularía la estructura a partir de los elementos de sección (<section>, <article>, <nav>, <aside>), para que un <h1> anidado dentro de una <section> se degradara automáticamente a un encabezado de segundo nivel. Era una idea limpia. Ningún navegador la implementó nunca, ningún lector de pantalla la usó, y finalmente fue removida de la especificación.

La consecuencia práctica es simple y permanente: el esquema se define solo por tus números de encabezado. Un <h1> anidado tres elementos <section> de profundidad sigue siendo un encabezado de nivel superior para cada navegador y cada lector de pantalla. El anidamiento no renumera nada para ti. Así que mantén un <h1>, desciende un nivel a la vez, y trata el número como el hecho estructural que es, nunca como un dial de tamaño.

JunoUn main, y el orden correcto de encabezados Un <h1> por página, porque una página tiene un título. Desciende los niveles de encabezado uno a la vez, <h2> luego <h3>, sin saltar a <h5>. Y el contenido principal de la página va en un <main>. Si un encabezado se ve del tamaño incorrecto, ese es un trabajo para CSS, no una razón para cambiar niveles.
JunoUn main, y el orden correcto de encabezados Un <main>, un <h1>, y niveles que descienden de a uno. Elige un encabezado por su lugar en el esquema, nunca por el tamaño en que se renderiza, ya que el tamaño pertenece a tu hoja de estilos. El <main> también es el destino del enlace de salto, así que mantener un solo asegura que ese atajo siga funcionando.
JunoUn main, y el orden correcto de encabezados El viejo algoritmo de esquema que renumeraría encabezados por anidamiento de sección nunca fue construido y fue descartado, así que tus números de encabezado son el esquema, punto final. Un <h1> enterrado en tres elementos <section> sigue siendo un <h1> en todas partes. Mantén un <h1>, un <main>, y desciende un nivel a la vez.

Agrupar y ordenar contenido

El contenido relacionado se lee mejor cuando está agrupado. Dos elementos existen para esto. Un <section> es un fragmento temático de una página que tiene su propio encabezado, como la parte de "Ingredientes" de una receta. Un <article> es una pieza que se sostiene por sí sola y seguiría teniendo sentido si la sacas, como una sola entrada de blog o una reseña de cliente.

html
<article>
  <h2>Focaccia de levadura lenta</h2>
  <p>Un pan que casi no necesita amasado.</p>
</article>

El orden importa tanto como la agrupación. Porque la página se lee de arriba a abajo, coloca el contenido más importante cerca de la parte superior, y ordena el resto en el orden en que un lector querría hacerlo. Una receta enumera lo que necesitas antes de los pasos, porque ese es el orden en que lo seguirías.

Usa <section> para un agrupamiento temático de contenido que pertenece bajo un encabezado, y <article> para una unidad autónoma que podría distribuirse por su cuenta, una entrada de blog, una tarjeta de producto, una respuesta de foro. Ambas deberían llevar un encabezado para que aparezcan en el esquema; agrupar contenido es solo la mitad del trabajo si el grupo no tiene nombre.

El orden en que escribes elementos es el orden del código fuente, y tiene más peso de lo que parece al principio. El orden del código fuente es el orden de lectura y el orden de tabulación. El orden de lectura es lo que un lector de pantalla habla y lo que la página muestra sin CSS. El orden de tabulación es el orden en que el teclado se mueve a través de enlaces y controles de formulario cuando presionas Tab. Ambos siguen la fuente de forma predeterminada.

html
<main>
  <article>
    <h2>Focaccia de levadura lenta</h2>
    <h2>...</h2>
  </article>
</main>

CSS puede mover cosas alrededor visualmente con flexbox o grid, pero no cambia la fuente. Así que escribe tu marcado en el orden en que el contenido realmente se lee, luego estiliza desde allí. Reordena en CSS y el orden visible y el orden de tabulación dejan de coincidir, lo que es desorientador para cualquiera que navegue por teclado.

<section> y <article> agrupan contenido, pero ninguno genera un nivel de encabezado. Este es el punto del algoritmo de esquema hecho concreto: un <section> no agrega un escalón al esquema, y un <section> sin encabezado dentro de él no contribuye nada a lo que un lector de pantalla pueda navegar. Dale a cada elemento de sección un encabezado, o es agrupación que el ojo puede ver y el esquema no.

Estructura teniendo en mente el escaneo rápido, porque casi nadie lee una página de principio a fin. Los usuarios con visión escanean encabezados; los usuarios del lector de pantalla avanzan a través de las listas de encabezados y regiones de referencia. Un <h2> descriptivo cada pantalla, y contenido en primer plano para que el punto venga antes del detalle de apoyo, sirve a ambos. Una pared de párrafos sin encabezados es ilegible para un escáner de cualquier tipo.

Luego está la navegación por teclado, moviéndose a través de una página con la tecla Tab en lugar de un ratón, que sigue el orden del código fuente. El momento en que reordenas contenido visualmente con CSS order, flex-direction: row-reverse, o colocación de grid, el orden visual y el orden del código fuente divergen: el enfoque salta alrededor de la pantalla de manera impredecible conforme el usuario tabula, porque el navegador aún sigue la fuente. Reordenar eso que un usuario de ratón nunca nota se convierte en un laberinto para un usuario de teclado. La regla confiable es hacer que el orden del código fuente coincida con el orden de lectura previsto, y reservar la reordenación de CSS para cambios que no afecten cómo se debe leer el contenido.

JunoAgrupar y ordenar contenido Agrupa el contenido relacionado con <section> para una parte temática que tiene un encabezado, y <article> para una pieza que se sostiene por sí sola, como una sola entrada. Luego cuida el orden: la página se lee de arriba a abajo, así que las cosas importantes van cerca de la parte superior. Escríbelo en el orden en que alguien realmente querría leerlo.
JunoAgrupar y ordenar contenido<section> agrupa contenido bajo un encabezado, <article> envuelve una unidad autónoma, y ambas quieren un encabezado para que aterricen en el esquema. La grande a mantener: el orden del código fuente es el orden de lectura y el orden de tabulación. Escribe el marcado en el orden en que se lee, luego deja que CSS maneje la apariencia, o la ruta del teclado dejarará de coincidir con lo que la gente ve.
JunoAgrupar y ordenar contenido Un <section> sin encabezado es invisible al esquema, así que cada agrupación se gana un encabezado o agrupa nada que un lector de pantalla pueda alcanzar. Y el orden del código fuente es tu orden de tabulación: reordena con CSS order o grid y el enfoque comienza a saltar alrededor de la pantalla para usuarios de teclado. Coincide el orden del código fuente con el orden de lectura y reordena en CSS solo cuando no cambia cómo se lee el contenido.

Errores estructurales comunes

Algunos errores estructurales aparecen una y otra vez, y cada uno tiene una solución clara.

  • Usar una etiqueta de encabezado para hacer texto grande. Recurrir a <h3> porque se renderiza al tamaño que deseas rompe el esquema. Elige el nivel por significado, y establece el tamaño en CSS.
  • Saltar niveles de encabezado. Saltar de <h2> a <h4> deja un agujero en el esquema. Desciende un nivel a la vez.
  • Más de un <h1>. Una página tiene un título. Etiquetas <h1> adicionales confunden la tabla de contenidos.
  • Sin encabezados en absoluto. Una larga serie de párrafos sin nada que la interrumpa es difícil de escanear. Agrega encabezados para que un lector pueda encontrar su camino.

Arregla estos y la página se lee claramente para todos, ya sea que estén escaneando con los ojos o escuchándola leer en voz alta. El capítulo Accesibilidad va más lejos en hacer que una página funcione para cada visitante.

Los errores comunes se reducen a que la apariencia está en lugar de la estructura.

Elegir un nivel de encabezado por su tamaño renderizado revuelve el esquema, porque el nivel es una señal estructural y CSS ya controla el tamaño. Saltar niveles (un <h2> seguido de un <h4>) deja un hueco que se lee como una sección faltante. Múltiples elementos <h1> le dan a la página más de un título y nublan su tabla de contenidos. Y fingir un encabezado, estilizar un <p> o un <div> para que se vea negrita y grande, te da la apariencia sin la estructura: nunca aparece en la lista de encabezados que construye un lector de pantalla.

Dos más vale la pena nombrar. Una región de referencia vacía, como un <nav> sin nada en él, agrega una región que no lleva a ningún lado. Y reordenar contenido en CSS para que el orden visible ya no coincida con la fuente deja a los usuarios de teclado tabulando a través de la página en un orden que no coincide con lo que ven. Mantén la estructura en el HTML y la apariencia en el CSS, y la mayoría de estos nunca suceden.

La mayoría de los fracasos estructurales son el mismo error con diferentes ropajes: apariencia usada donde se necesitaba estructura. Un <div> estilizado para parecer un encabezado no le da a la tecnología de asistencia nada, porque el estilo no tiene efecto en el esquema; solo los elementos de encabezado reales entran en la lista de encabezados. Un nivel saltado se lee para un usuario de lector de pantalla como una sección que desapareció. Varios elementos <h1> le dan a la página múltiples títulos y debilitan el atajo en el que la mayoría de los usuarios confían.

Los fracasos más sutiles son sobre orden y enfoque. Reordenar con CSS para que los órdenes visual y del código fuente diverjan es invisible para un usuario de ratón y desorientador para cualquiera que tabule, porque la navegación por teclado sigue la fuente. Los valores tabindex positivos (un atributo que fuerza un elemento más temprano en el orden de tabulación) empeoran esto al saltar el enfoque fuera de secuencia; evítalos y deja que el orden del código fuente haga el trabajo. Y una región de referencia sin contenido accesible, un <nav> vacío o un <section> sin encabezado, agrega una región al mapa que no lleva a ningún lado.

La regla debajo de todo: construye la estructura en HTML para que sea correcta sin CSS en absoluto, luego estiliza encima. Una página cuyo esquema se sostiene como marcado simple y sin estilos es una que se sostiene para cada forma en que se lee. Para más sobre los elementos en sí, el capítulo HTML semántico es el complemento de este.

JunoErrores estructurales comunes Los cuatro grandes: no uses un encabezado para hacer texto grande, no saltes niveles, no agregues un segundo <h1>, y no dejes una página larga sin encabezados en absoluto. Cada uno nubla el esquema. Elige niveles de encabezado por significado y deja que CSS maneje los tamaños.
JunoErrores estructurales comunes Casi cada bug estructural es apariencia en lugar de estructura: un encabezado elegido por su tamaño, un <div> en negrita fingiendo ser un encabezado, un nivel saltado, dos elementos <h1>. Un <div> estilizado nunca aterriza en el esquema, así que es un encabezado solo para el ojo. Mantén la estructura en el HTML, el estilo en el CSS, y la mayoría desaparece.
JunoErrores estructurales comunes La pista en cada caso es el estilo haciendo el trabajo de la estructura: un encabezado falso <div>, un nivel saltado, regiones de referencia vacías, una reordenación CSS que deja el enfoque del teclado saltando. Evita también tabindex positivo, arrastra el enfoque fuera de orden. Construye marcado que sea correcto sin CSS cero, luego estiliza encima, y se lee bien de cualquier forma en que alguien lo encuentre.