Las zonas de una página

Antes de HTML5, una página era un montón de <div> sin significado. Hoy existen etiquetas que dicen qué zona es cada cosa, y usarlas es la diferencia entre un documento que se entiende solo y uno que hay que descifrar.

Las zonas del <body>, de arriba abajo

flowchart TB
    N["#60;nav#62;<br/>menú de enlaces"]

    subgraph M["#60;main#62;"]
        direction LR
        subgraph A["#60;article#62;"]
            S["#60;section#62;<br/>bloque temático"]
        end
        A ~~~ AS["#60;aside#62;<br/>lateral"]
    end

    F["#60;footer#62;<br/>autoría, contacto, año"]

    N ~~~ M ~~~ F
EtiquetaQué zona marcaCuántas por página
<nav>El bloque de enlaces de navegación: la navbarUna, arriba de todo
<main>El contenido propio de esta vistaUna sola, obligatoriamente
<article>Una pieza completa que tendría sentido sola: una noticia, una ficha de productoLas que hagan falta
<section>Un bloque temático dentro del contenido, con su propio títuloLas que hagan falta
<aside>Contenido lateral, relacionado pero secundarioLas que hagan falta
<footer>El pie: autoría, contacto, añoUno abajo
<body>
  <nav>
    <ul>
      <li><a href="index.html">Inicio</a></li>
    </ul>
  </nav>
 
  <main>
    <h1>Sobre mí</h1>
    <section>
      <h2>Aficiones</h2>
      <p>…</p>
    </section>
  </main>
 
  <footer>
    <p>Ana Soto · 2026</p>
  </footer>
</body>

main va una sola vez y no envuelve la navbar ni el pie

<main> es el contenido que cambia de una vista a otra. La navbar y el pie se repiten iguales en todas, así que van fuera: el <nav> antes de abrir el <main>, y el <footer> después de cerrarlo. Los tres son hermanos dentro del <body>.

El nombre del sitio no va en el cuerpo, va en la pestaña

Lo que identifica al sitio (su nombre) ya está en el <title> del <head>, que es lo que se lee en la pestaña del navegador y en los resultados de Google. Dentro del <body>, el <h1> es el título de esa vista, no el del sitio entero.

section y article: cuál va dentro de cuál

La prueba: si el bloque tendría sentido publicado por separado (una noticia completa, una ficha de producto) es un article. Si es una parte de algo mayor que fuera de contexto no se entiende, es una section.

Un article puede contener section (capítulos de una noticia larga) y una section puede contener varios article (la sección “Novedades” con tres fichas).

Usar div cuando existe la etiqueta con significado

<div class="navbar"> funciona, se ve igual y es peor: los lectores de pantalla pueden saltar directamente a un <nav> pero no a un div que se llame así, y los buscadores tampoco lo entienden.

El div es para cuando ninguna etiqueta semántica aplica: agrupar dos cosas solo para poder moverlas juntas.

Bloque y línea, otra vez

Las etiquetas que acabas de ver se reparten entre las dos clases que viste en Etiquetas y documento: main, section, article, aside, nav y footer son todas de bloque, igual que el div. Ocupan el ancho disponible y se apilan una debajo de otra, que es exactamente lo que el diagrama de arriba dibuja.

Por eso el diagrama se lee de arriba abajo

No hace falta ningún estilo para que nav, main y footer queden apilados: es el comportamiento por defecto de los elementos de bloque. Ponerlos lado a lado (o el aside a la derecha del article) sí requiere CSS, y eso viene en el tópico siguiente.

Los atributos class e id

Estos dos no cambian nada de cómo se ve la página por sí solos. Sirven para ponerle nombre a un elemento, y ese nombre es con el que CSS y JavaScript lo van a encontrar después.

<nav>
  <a href="index.html" class="enlace activa">Inicio</a>
  <a href="contacto.html" class="enlace">Contacto</a>
</nav>
 
<h2 id="contacto">Contacto</h2>
AtributoCuántos elementos pueden llevarloPara qué
classMuchos, y cada elemento puede tener varias, separadas por espaciosAplicar el mismo estilo a un grupo de elementos
idUno solo en toda la página: es únicoApuntar a un elemento concreto: un ancla #contacto, un label for="…"

Repetir un id en la misma página

Un id tiene que ser único. Si dos elementos comparten el mismo, los anclas dejan de funcionar bien, los label se enlazan al elemento equivocado y JavaScript encuentra solo el primero. Para estilos compartidos se usa class, que sí puede repetirse.

Nombra por lo que es, no por cómo se ve

class="destacado" sigue teniendo sentido si mañana el destacado pasa de amarillo a azul. class="amarillo" se vuelve mentira ese mismo día.

En el tópico de CSS estas dos van a ser la herramienta principal: .enlace selecciona por clase y #contacto selecciona por id.

Saltos, separadores y comentarios

<p>Primera línea<br />Segunda línea</p>
 
<hr />
 
<!-- Esto es un comentario: no se ve en la página -->
EtiquetaQué haceCierra
<br>Salto de línea dentro de un mismo párrafoNo
<hr>Separador temático: una línea horizontalNo
<!-- -->Comentario: nota para quien lee el códigoNo aplica

Usar <br> para separar párrafos

Dos <br> seguidos no son un párrafo nuevo: son un hueco visual sin significado. Para separar ideas se usan dos <p>, y el espacio entre ellos se ajusta luego con CSS.

<br> sirve para lo que de verdad es un salto dentro de un mismo bloque: una dirección postal, un verso de un poema.

El comentario sí llega al navegador

No se ve, pero está en el archivo: cualquiera que abra el código fuente lo lee. Sirve para organizar y explicar, nunca para esconder algo.

Caracteres especiales

Algunos caracteres tienen significado propio en HTML. Para escribirlos como texto hay que usar su entidad: un código que empieza con & y termina en ;.

Quieres escribirEscribesPor qué
<&lt;Si no, el navegador cree que empieza una etiqueta
>&gt;Igual, cierre de etiqueta
&&amp;Es el inicio de toda entidad
"&quot;Dentro del valor de un atributo
Espacio que no se parte&nbsp;Une dos palabras para que no queden en líneas distintas
<p>La etiqueta &lt;p&gt; marca un párrafo.</p>
<!-- Se ve: La etiqueta <p> marca un párrafo. -->

Las tildes y la ñ no necesitan entidad

Con <meta charset="UTF-8"> en el head se escriben directamente: diseño, sesión, ¿cómo?. Las entidades solo hacen falta para los cinco caracteres de la tabla.

Ojo: esto vale para el contenido, no para los nombres de archivo, que siguen yendo sin tildes.

Checkpoint

Intenta responder antes de desplegar cada pregunta.