Cómo hacer un header en HTML
Envuelve la parte superior de tu página (logo, nombre del sitio, menú principal) en un elemento <header>. Es una caja de bloque sin aspecto por defecto, así que unas pocas líneas de CSS la convierten en una barra:
margin-inline-end: auto en el logo empuja el menú y el botón al otro extremo de la barra. Quita el elemento <style> y sigues teniendo un header: lo que lo convierte en uno es la etiqueta, no el fondo oscuro.
header vs head vs h1
Tres nombres que suenan parecido y hacen trabajos distintos:
| Elemento | Dónde | Visible | Cuántos |
|---|---|---|---|
<head> | Directamente dentro de <html>, antes de <body> | No: contiene <title>, <meta>, <link> | Exactamente uno |
<header> | Dentro de <body> | Sí: contenido introductorio de una página o sección | Cualquier número |
De <h1> a <h6> | En cualquier parte de <body> | Sí: un encabezado | Cualquier número |
El <head> de abajo fija el título de la página que el navegador muestra en su pestaña. Todo lo que ves en la vista previa viene de <body>:
Un header a menudo contiene un encabezado, pero no tiene por qué, y un encabezado no necesita un header alrededor.
Headers dentro de artículos
<header> introduce su article o section más cercano, no solo la página. Una lista de entradas de blog en la que cada entrada tiene su propio header es válida y habitual:
Para los lectores de pantalla, solo el header de nivel de página (uno que no está dentro de article, aside, main, nav o section) se convierte en el landmark banner. Los headers de los artículos son grupos normales, así que no acabas con varios banners.
Header fijo (sticky)
position: sticky mantiene el header arriba mientras el contenido de debajo se desplaza. Desplázate dentro de la caja de abajo:
Tres detalles lo hacen funcionar: top: 0 (sticky no hace nada sin un desplazamiento), un color de fondo (si no, las filas se ven a través) y z-index para que el contenido posicionado no se pinte encima. En una página real, la caja que se desplaza es la propia página, así que el header va directamente en <body>.
Un header con position: fixed también se queda en su sitio, pero sale del flujo de la página, así que el contenido se desliza por debajo y necesita padding arriba. Sticky conserva su espacio en el diseño.
Qué puede ir en un header
Un header puede contener casi cualquier contenido: encabezados, una imagen de logo, un <nav>, un formulario de búsqueda, un botón. No puede contener otro <header> ni un <footer>, y no puede estar dentro de un <footer>, un <address> u otro <header>.
<header>
<a href="/"><img src="logo.svg" alt="Acme home"></a>
<nav aria-label="Main">...</nav>
<form role="search">...</form>
</header>
Cuando el logo es un enlace a la página de inicio, su texto alt debe decir a dónde va el enlace ("Acme home"), porque es lo que anuncia un lector de pantalla.
Errores comunes
- Confundir
<header>con<head>. Los metadatos van en<head>; el contenido visible nunca. - Usar
<header>para cada encabezado. Un encabezado solo no necesita un header alrededor. Usa<header>cuando haya un grupo de contenido introductorio. - Un header sticky sin fondo. El texto de la página se ve pasar a través de él. Define un
background. - Sticky que no se queda fijo. Un ancestro con
overflow: hiddenuoverflow: autose convierte en la caja de desplazamiento del sticky, así que el header se queda fijo dentro de esa caja (o no se queda). Revisa los ancestros. - Poner el menú del sitio en un
<div>dentro del header. Usa<nav>para que quienes usan lectores de pantalla puedan saltar a él.
Preguntas frecuentes
¿Qué es la etiqueta header en HTML?
<header> es un elemento semántico para contenido introductorio: el logo y el menú del sitio en la parte superior de la página, o el título y la autoría al principio de un artículo. Es una caja de bloque normal sin estilo por defecto.
¿Qué diferencia hay entre head y header en HTML?
<head> es la parte invisible del documento, con el <title>, las etiquetas <meta> y los enlaces a hojas de estilo, y hay exactamente uno. <header> es contenido visible dentro de <body>, y una página puede tener varios.
¿Una página puede tener más de un elemento header?
Sí. Una página suele tener una cabecera del sitio, y cada <article> o <section> puede tener su propio <header> para su título y su información. Solo un header que no está dentro de article, aside, main, nav o section cuenta como banner de la página para los lectores de pantalla.
¿El nav va dentro del header?
Puede ir, y suele ir cuando el menú principal está en la parte superior de la página. Poner <nav> fuera de <header> también es válido; elige lo que encaje con tu diseño.
¿Cómo hago que un header se quede arriba al desplazarse?
Dale position: sticky; top: 0; más un color de fondo y un z-index, para que el contenido pase por debajo. Sticky solo funciona mientras el padre del header es más alto que el header, y un ancestro con overflow: hidden impide que se quede fijo respecto a la página.