Saltar al contenido principal

Catálogo · Navegación

Submenú

Agrupa algunos enlaces de una cabecera bajo un mismo botón para que la fila de enlaces siga siendo corta.

Encaja mejor en: cualquier sitio — cuando una cabecera tiene más enlaces de los que caben en una fila

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 una bodega con dos submenús: Vinos y Sobre nosotros.

Press Wines or About us. From 769 px of window width each opens a box under its button; at 768 px and below the links are in the menu, and each group opens in place, under its button.

Problemas conocidos

Un submenú es un <details> nativo, que no tiene tecla Esc ni se cierra al hacer clic en otro lugar: se cierra al volver a pulsar su botón o al abrir otro (en los navegadores que admiten name en <details>: Chrome y Edge 120, Safari 17.2 y Firefox 130; en los anteriores pueden quedar varios abiertos a la vez). A partir de 769 px, un cuadro abierto queda por encima de la parte superior de la página hasta que se cierre y, si sigues pulsando Tab, un enlace de la página que hay detrás puede quedar oculto (criterio de éxito 2.4.11 de WCAG 2.2, foco no oculto).

Esto no ocurre en el menú a 768 px o menos: los enlaces siguen el flujo y Esc cierra todo el menú. No se ha probado con un lector de pantalla.

Código

Copiar el marcado

Bundler
import "@luz-ds/catalog/components/submenu.css";
HTML
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@luz-ds/catalog@0.3.0/dist/components/submenu.min.css" integrity="sha384-y+7suWYL2a3Jot2cD9bCKS/ollQ/VHJGqkHQNIHmAEnQh1TyfrypOHFyhNk/3x3H" crossorigin="anonymous">

Un elemento de la lista de la barra de navegación de catalog, en una cabecera como la cabecera del sitio o la cabecera de periódico, cuyo contenido es un <luz-submenu> alrededor de un <details>: su <summary> es el botón y, a continuación, hay una lista de enlaces. No necesita clases: la etiqueta es el bloque y sus partes se identifican por su posición.

Asigna el mismo name a todos los submenús de la cabecera para que, al abrir uno, se cierren los demás.

HTML
<nav class="luz-navbar" id="site-nav" aria-label="Main" popover>
  <ul class="luz-navbar__list">
    <li><a class="luz-navbar__link" href="/" aria-current="page">Home</a></li>
    <li>
      <luz-submenu>
        <details name="site-menu">
          <summary>Wines</summary>
          <ul>
            <li><a class="luz-navbar__link" href="/wines/red/">Red wines</a></li>
            <li><a class="luz-navbar__link" href="/wines/white/">White wines</a></li>
          </ul>
        </details>
      </luz-submenu>
    </li>
    <li><a class="luz-navbar__link" href="/visits/">Visits</a></li>
  </ul>
</nav>

Variantes y opciones

No hay variantes. Los atributos son los del navegador.

Etiqueta o atributoEfecto
<luz-submenu>
Rodea el <details> con display: contents: no dibuja ningún cuadro ni añade un rol. El <summary> tiene el aspecto de los enlaces de al lado, con un chevrón; la lista de enlaces queda indentada debajo y, a partir de 769 px, aparece un cuadro también debajo.
name
El mismo valor en todos los submenús de la cabecera: al abrir uno, se cierran los demás. Los navegadores que no lo admiten los dejan abiertos.
open
Lo establece el navegador. No lo escribas en el marcado: un submenú abierto en todas las páginas las ocultaría.

Cómo funciona

CSS de @luz-ds/catalog y un <details> nativo. No usa JavaScript: ningún script define la etiqueta <luz-submenu>.

  • El navegador lo abre y lo cierra, e informa a las tecnologías de asistencia de si está abierto. Se abre al hacer clic o tocar el botón, o al pulsar Enter o Espacio: nunca al pasar el puntero, así no se abre por accidente y funciona igual en una pantalla táctil.
  • A 768 px o menos, dentro del menú de la cabecera, los enlaces del grupo se abren en el flujo, debajo del botón y con sangría, y empujan hacia abajo los enlaces siguientes.
  • A partir de 769 px, cuando los enlaces de la cabecera están en una fila, se abren en un cuadro debajo del botón, por encima de la página, sin desplazarla. El cuadro del último elemento se abre hacia el inicio de la fila para que quepa en la ventana, en ambas direcciones de escritura.
  • El chevrón se dibuja con dos bordes y no tiene texto: el estado es el que expone el navegador.
  • No usa la API de popover: un popover aparece en la capa superior, así que no podría abrirse dentro del menú.

Sin JavaScript

No cambia nada: no hay ningún script. Los enlaces son enlaces normales.

Teclado y ARIA

  • Orden: un submenú cerrado ocupa una parada: su botón. Cuando está abierto, sus enlaces aparecen justo después y, a continuación, el siguiente elemento de la cabecera.
  • Teclas: Enter o Espacio en el botón lo abre y lo cierra; el foco permanece en el botón. Tab y Shift+Tab recorren los enlaces. Esc no hace nada en un submenú (consulta Problemas conocidos); en el menú de la cabecera a 768 px o menos, lo cierra y devuelve el foco al botón del menú.
  • Nombres: el nombre del botón es su texto. El navegador expone el estado expandido de <summary>: no escribas aria-expanded, role="menu" ni role="menuitem"; son enlaces de un punto de referencia de navegación, no un menú de aplicación.
  • Página actual: pon aria-current="page" en el enlace de la página, también dentro del submenú.

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

Diseño

Cuándo usarlo

Úsalo cuando la cabecera necesite más enlaces de los que caben en una fila corta y algunos pertenezcan al mismo grupo: tipos de vino, páginas sobre la empresa.

Cuándo no usarlo

No lo uses para un único enlace ni para ocultar páginas que necesita la mayoría de visitantes: ponlas en la propia fila.

  • No anides un submenú dentro de otro: dos niveles ocultan páginas y son difíciles de usar con el puntero y el teclado.
  • No pongas acciones, formularios ni ajustes: contiene enlaces a páginas. Para las acciones, usa botones o un menú desplegable.
  • Si cada grupo tiene muchos enlaces, crea una página para cada grupo y enlázala: un submenú largo es una página dentro de un cuadro.

Sustituye la navegación desplegable creada con un script y el menú que aparece al pasar el puntero. No elimina nada de LUZ.

Buenas y malas prácticas

Sí Nombra el grupo con una palabra que indique qué contiene y limítalo a unos pocos enlaces.
No Uses nombres de grupo vagos como «Recursos» o «Más»: quien visita la página tiene que abrirlo para saber si contiene lo que busca.

Redacción del contenido

Nombra el grupo con una o dos palabras, en estilo de frase, que indiquen qué contiene: «Vinos», «Sobre nosotros».

  • Nombra cada enlace según la página que abre, para que tenga sentido fuera del grupo: «Vinos tintos», no «Tintos».
  • No conviertas también el nombre del grupo en una página: el botón abre el grupo, no lleva a ningún sitio. Si el grupo tiene una página de presentación, ponla como primer enlace: «Todos los vinos».
  • Mantén los mismos grupos y en el mismo orden en todas las páginas.

Contraste y foco

El botón y los enlaces de la fila aparecen sobre la página; a partir de 769 px, el cuadro tiene una superficie elevada, un borde y una sombra.

ParteColor sobre el fondoClaroOscuroAlto contrasteMínimo
Texto del botón y chevrón
--luz-text-secondary on --luz-surface-page
6.2:1
7.5:1
19.3:1
4.5:1
Botón al pasar el puntero o abierto
--luz-text-primary on --luz-surface-page
15.8:1
15.1:1
21.0:1
4.5:1
Enlace del cuadro, a partir de 769 px
--luz-text-secondary on --luz-surface
6.4:1
6.9:1
19.3:1
4.5:1
Enlace del cuadro al pasar el puntero
--luz-text-primary on --luz-surface
16.5:1
14.0:1
21.0:1
4.5:1
Anillo de foco del botón
--luz-focus-ring on --luz-surface-page
5.6:1
7.7:1
21.0:1
3:1
Anillo de foco de un enlace del cuadro
--luz-focus-ring on --luz-surface
5.9:1
7.2: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. En el menú a 768 px o menos, los enlaces aparecen sobre la superficie de la página del menú, como en las dos primeras filas.

  • Foco: contorno de 2 px de core con --luz-focus-ring, a 2 px del botón y de cada enlace.
  • Al abrirse, el chevrón apunta hacia arriba y el texto del botón se oscurece: el estado nunca se indica solo con el color.
  • El enlace de la página actual aparece subrayado, como en la fila.

Tokens que utiliza

Los 14 tokens que leen, por familia, las reglas de components/submenu.css del catálogo. Los enlaces del componente son los de la barra de navegación de catalog. 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-xs, --luz-space-md, --luz-space-xl
Typography
--luz-font-sans, --luz-text-md
Radius
--luz-radius-md
Shadows
--luz-shadow-md
Layers
--luz-z-overlay

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