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
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-stickyes 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. Definescroll-padding-block-startenhtmlcon la altura real de la cabecera o prescinde de.o-sticky.
Código
Copiar el marcado
import "@luz-ds/catalog/components/site-header.css";
<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">
<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:
<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.
| Clase | Efecto |
|---|---|
.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 | 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 | 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 | 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 (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-hde 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-hdesde la parte superior de la ventana. - Con el modificador, la marca es el nombre de la publicación:
--luz-font-headingcon--luz-text-xl,--luz-text-lga 640 px y menos. - Sin
@luz-ds/catalogno 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 unaria-label(«Principal»). El nombre del botón es «Menú»; el navegador expone si está expandido. El enlace actual tienearia-current="page"y un subrayado. - Marca: un enlace, nunca un encabezado: el único
h1de la página es su propio título. Un logotipo es un<img>cuyoaltes 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
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.
| Parte | Color sobre el fondo | Claro | Oscuro | Alto contraste | Mí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- Layout and breakpoints
--luz-bar-h
Teclado y ARIA están en la pestaña Código.