Saltar al contenido principal

Catálogo · Navegación

Cabecera del sitio

Inicia cada página de un sitio con su nombre, sus enlaces principales y algunos controles, en una fila que permanece arriba.

Encaja mejor en: landing, blog — la parte superior de cada página de un sitio de landing, de un blog o de un periódico

Esta traducción la ha escrito una IA y todavía no la ha revisado ninguna persona. Leer esta página en inglés

Ejemplo

La cabecera de un sitio de conferencias, con un nombre, tres enlaces y un enlace para iniciar sesión, y la misma cabecera para un blog, con su nombre como el de una publicación.

At 768 px of window width and below the links collapse into a menu, the catalog's navbar. Its panel opens under this example where the browser supports CSS anchor positioning, and under the top of the window, where a header sits, elsewhere.

The second header has .luz-site-header--publication: the name in the heading font, larger. The examples are not sticky: in a page, .o-sticky keeps the header at the top.

Problemas conocidos

Los problemas propios de la cabecera son los de las piezas de core que la componen.

  • El panel del menú. Si sigues pulsando Tab después del último enlace del menú abierto, el foco pasa a la página y el menú permanece abierto por encima; Esc lo cierra. Sin posicionamiento mediante anclas CSS, el panel y la lista de idiomas se abren desde la parte superior de la ventana, a la altura de una cabecera de una sola fila, así que con el texto ampliado pueden cubrir parte de la cabecera. Consulta los problemas conocidos de la barra de navegación.
  • Cabecera fija y texto ampliado. El relleno de desplazamiento de .o-sticky es un mínimo: con el texto al 300 % y la cabecera repartida en varias filas, Safari puede dejar oculto un campo al que se llega con Tab. Define scroll-padding-block-start en html con la altura real de la cabecera o prescinde de .o-sticky.

Código

Copiar el marcado

Bundler
import "@luz-ds/catalog/components/site-header.css";
HTML
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@luz-ds/catalog@0.3.0/dist/components/site-header.min.css" integrity="sha384-21PMBkvzBZetFOsMonT4oc4Ak41zobEeRyD0yfqjWd9UWhrz0PEpMPo/3hyvH1BH" crossorigin="anonymous">
HTML
<header class="luz-site-header o-sticky">
  <div class="o-container o-container--inline o-row">
    <button class="luz-nav-toggle" type="button" popovertarget="site-nav" aria-label="Menu">
      <svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false"><g fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 6h16M4 12h16M4 18h16"/></g></svg>
    </button>
    <a class="luz-site-header__brand" href="/">Acme Summit</a>
    <nav class="luz-navbar" id="site-nav" aria-label="Main" popover>
      <ul class="luz-navbar__list">
        <li><a class="luz-navbar__link" href="/programme/" aria-current="page">Programme</a></li>
        <li><a class="luz-navbar__link" href="/speakers/">Speakers</a></li>
        <li><a class="luz-navbar__link" href="/tickets/">Tickets</a></li>
      </ul>
    </nav>
    <div class="o-row luz-site-header__actions">
      <a class="luz-btn luz-btn--ghost" href="/account/">Log in</a>
    </div>
  </div>
</header>

Un blog o un periódico añade el modificador, y la búsqueda y el selector de idioma de catalog van en las acciones:

HTML
<header class="luz-site-header luz-site-header--publication o-sticky">
  <div class="o-container o-container--inline o-row">
    <button class="luz-nav-toggle" type="button" popovertarget="site-nav" aria-label="Sections">
      <svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false"><g fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 6h16M4 12h16M4 18h16"/></g></svg>
    </button>
    <a class="luz-site-header__brand" href="/">The Vejer Review</a>
    <nav class="luz-navbar" id="site-nav" aria-label="Sections" popover>
      <ul class="luz-navbar__list">
        <li><a class="luz-navbar__link" href="/news/" aria-current="true">News</a></li>
        <li><a class="luz-navbar__link" href="/culture/">Culture</a></li>
        <li><a class="luz-navbar__link" href="/opinion/">Opinion</a></li>
      </ul>
    </nav>
    <div class="o-row luz-site-header__actions">
      <luz-search>…</luz-search>
      <luz-lang-switch>…</luz-lang-switch>
    </div>
  </div>
</header>

Variantes y opciones

Un modificador. La cabecera es una clase de catalog aplicada a un <header> nativo, maquetada en el HTML con los objetos de core.

ClaseEfecto
.luz-site-header
En <header>: la superficie de la página, una línea debajo, los espacios de la fila y el ancla bajo la que se abren sus paneles.
.luz-site-header--publication
Para un blog o un periódico: la marca es el nombre de la publicación, con la fuente de los títulos, más grande y subrayada al pasar el cursor; a 768 px y menos ocupa el espacio entre el botón de menú y las acciones y se ajusta ahí
.luz-site-header__brand
El nombre del sitio como enlace a la página de inicio: seminegrita, sin subrayar, de al menos 44 px de alto; ocupa el espacio libre de la fila.. Un <img> de logotipo dentro mide 44 px de alto
.luz-site-header__actions
Al final de una fila .o-row: búsqueda, un selector de idioma y un botón.
.o-sticky (core)
Mantiene la cabecera arriba mientras se desplaza la página, en ventanas de al menos 30 rem de alto; consulta la página y sus barras.
.o-container.o-container--inline.o-row (core)
La fila: el ancho y los márgenes interiores de la página; se ajusta en vez de desbordarse.
.luz-nav-toggle, .luz-navbar (catalog)
El botón del menú y los enlaces: consulta la barra de navegación.

Cómo funciona

CSS de components/site-header.css de @luz-ds/catalog sobre los objetos de core y la barra de navegación de catalog. No usa JavaScript.

  • La cabecera solo añade la apariencia: la superficie de la página, la línea inferior, la marca y los espacios de la fila (8 px entre filas, 16 px entre elementos y 24 px a partir de 769 px). Core aporta el resto: .o-sticky, la posición fija y el relleno de desplazamiento; .o-container--inline, los márgenes interiores; .o-row, la fila adaptable; y la barra de navegación, los enlaces y su panel.
  • Una cabecera de una fila mide lo que --luz-bar-h de core: controles de 44 px, 4 px arriba y abajo y una línea de 1 px. Con el texto ampliado, la fila se ajusta y la cabecera crece.
  • La cabecera se asigna a sí misma el ancla --luz-bar. En los navegadores compatibles con el posicionamiento mediante anclas CSS, el panel de la barra de navegación y la lista del <luz-lang-switch> del sitio se abren debajo, con una o dos filas. En los demás se abren a --luz-bar-h desde la parte superior de la ventana.
  • Con el modificador, la marca es el nombre de la publicación: --luz-font-heading con --luz-text-xl, --luz-text-lg a 640 px y menos.
  • Sin @luz-ds/catalog no cambia nada: sus reglas adicionales no coinciden con ningún elemento.

Sin JavaScript

No cambia nada: el botón abre el menú como popover con popovertarget, sin scripts, y los enlaces son enlaces normales.

Teclado y ARIA

  • Orden: botón del menú, marca, enlaces y, por último, acciones, en el orden del código fuente. Con el menú abierto, el siguiente Tab después del botón lleva a sus enlaces.
  • Teclas: Enter o Espacio en el botón abre y cierra el panel; Esc lo cierra y devuelve el foco al botón.
  • Nombres: el <nav> tiene un aria-label («Principal»). El nombre del botón es «Menú»; el navegador expone si está expandido. El enlace actual tiene aria-current="page" y un subrayado.
  • Marca: un enlace, nunca un encabezado: el único h1 de la página es su propio título. Un logotipo es un <img> cuyo alt es el nombre, sin texto al lado.
  • Puntos de referencia: un <header> que sea hijo directo de <body> es el banner. Pon el enlace para saltar al contenido antes.

Contraste y foco están en la pestaña Diseño.

Diseño

Cuándo usarla

Usa la cabecera al principio de cada página de un sitio de landing, de un blog o de un periódico: permite reconocer el sitio y llegar desde cualquier página a sus partes principales.

  • La cabecera simple, para un sitio de landing, un producto o un evento.
  • Con --publication, para un blog o un periódico; para la portada de un periódico, donde el nombre y la fecha marcan el tono, usa la cabecera de portada.

Cuándo no usarla

No la uses en una aplicación: la barra de la aplicación es la barra del área principal junto a la barra lateral.

  • Una cabecera por página, nunca dentro de un componente: es el banner de la página.
  • Una página única que cabe en una pantalla necesita un encabezado y un enlace para saltar al contenido, no una cabecera.

Buenas y malas prácticas

Sí Incluye entre tres y seis enlaces; cada uno es un sustantivo que nombra una parte del sitio y marca el actual.
No Pongas una docena de enlaces, algunos vagos: la fila se convierte en un muro y quien visita la página tiene que leerlo todo para elegir.

Redacción del contenido

La marca es el nombre del sitio; los enlaces son los nombres de sus partes principales.

  • Marca: el nombre tal como lo pronuncia la gente, entre una y tres palabras; el de una publicación, completo, como aparece en ella. Se ajusta en un ancho estrecho: nunca lo acortes con puntos suspensivos. El logotipo es decorativo: el enlace mantiene el nombre como texto.
  • Enlaces: entre tres y seis, de una o dos palabras cada uno, con los mismos términos que los títulos de las páginas de destino. No añadas «Inicio» junto a una marca que ya lleva a la página de inicio.
  • Acciones: un verbo que indique qué ocurre, como «Iniciar sesión». Botón del menú: «Menú», traducido como el resto de la página.

Contraste y foco

El texto aparece sobre la superficie de la página, tanto en la fila como en el panel abierto. La capa de atenuación empieza debajo de la cabecera, que nunca queda atenuada.

ParteColor sobre el fondoClaroOscuroAlto contrasteMínimo
Marca y enlace actual
--luz-text-primary on --luz-surface-page
15.8:1
15.1:1
21.0:1
4.5:1
Enlaces
--luz-text-secondary on --luz-surface-page
6.2:1
7.5:1
19.3:1
4.5:1
Anillo de foco
--luz-focus-ring on --luz-surface-page
5.6:1
7.7:1
21.0:1
3:1

Calculado a partir de los valores de los tokens de cada modo, redondeado hacia abajo. El mínimo es el de WCAG 2.2 AA: 4,5:1 para el texto y 3:1 para los anillos de foco, los bordes y los iconos.

  • Foco: cada enlace y botón de la cabecera conserva el anillo de core, de 2 px con --luz-focus-ring. El enlace actual también está subrayado, así que la marca no depende solo del color.
  • Bordes: la línea bajo la cabecera (--luz-divider) es decorativa y no tiene un mínimo; se conserva con colores forzados.

Tokens que utiliza

Los 14 tokens que leen, por familia, las reglas de .luz-site-header en components/site-header.css. Cada familia enlaza a su página, donde están los valores de todos los modos. En Figma son variables con los mismos nombres: consulta Tokens en Figma.

Spacing and sizing
--luz-control-lg, --luz-space-2xs, --luz-space-lg, --luz-space-md, --luz-space-xs
Typography
--luz-font-heading, --luz-font-sans, --luz-text-base, --luz-text-lg, --luz-text-xl

Teclado y ARIA están en la pestaña Código.