Saltar al contenido principal

Core · Navegación

Pestañas

Permite cambiar entre paneles de contenido relacionado en un mismo lugar; sin JavaScript, los paneles se muestran apilados en secciones.

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

Tres pestañas, Resumen, Ajustes y Registros, cada una con su panel.

Three services are running.

Deploys run on every push.

No errors in the last hour.

Focus a tab, then use the arrow keys, Home and End. The Code and Design tabs of this page are the same component.

Problemas conocidos

No se conocen problemas.

Código

Copiar el marcado

HTML
<nav class="luz-tabs" aria-label="Project">
  <a class="luz-tab" href="#project-summary">Summary</a>
  <a class="luz-tab" href="#project-settings">Settings</a>
</nav>
<div class="luz-tabpanel" id="project-summary">…</div>
<div class="luz-tabpanel" id="project-settings">…</div>
HTML
<nav class="luz-tabs luz-tabs--pill" aria-label="Project">
  <a class="luz-tab" href="#project-summary">
    <svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">…</svg>Summary
  </a>
  <a class="luz-tab" href="#project-settings">
    <svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">…</svg>Settings
  </a>
</nav>
JS
import { initTabs } from "@luz-ds/core/tabs";
initTabs();

Variantes y opciones

Una clase cambia el aspecto:

ClaseEfecto
.luz-tabs
Una fila de pestañas de texto sobre una línea; la abierta usa texto de marca con un subrayado de marca
.luz-tabs--pill
Píldora: una pestaña puede llevar un icono (un svg antes del texto, con el tamaño y el color del texto), y la pestaña abierta es una pastilla sobre --luz-surface, sin línea bajo la fila. Por debajo de 640 px los iconos se ocultan para que las pestañas quepan

La primera pestaña que se abre es la primera que cumpla una de estas condiciones:

OrdenPestaña
1
La pestaña cuyo panel contiene el elemento indicado en el fragmento de la URL
2
Una pestaña con aria-selected="true" o .is-active en el marcado
3
La primera pestaña

Cómo funciona

Fila de enlaces internos a los paneles, con estilos de components/tabs.css y mejorada por tabs.js.

  • initTabs() añade el patrón de pestañas de ARIA: role="tablist", "tab" y "tabpanel", aria-selected, aria-controls, aria-labelledby y un tabindex itinerante. Oculta los paneles inactivos. luz.js lo ejecuta.
  • Un enlace a un elemento dentro de un panel oculto abre su pestaña al cargar, al producirse hashchange y al hacer clic.
  • Los paneles inactivos usan hidden="until-found" cuando el navegador lo admite, de modo que la búsqueda en la página puede encontrarlos y abrir su pestaña.
  • activateTab(tab) selecciona una pestaña desde tu propio script.

Sin JavaScript

Las pestañas son una fila de enlaces y todos los paneles se muestran apilados en orden. Cada enlace salta a su panel.

Asigna un encabezado a cada panel para que la página apilada siga siendo fácil de leer.

En el aspecto de píldora, la pastilla se dibuja con aria-selected="true", que pone el script: sin JavaScript ninguna pestaña tiene pastilla.

Teclado y ARIA

Tab entra en la fila de pestañas y lleva a la seleccionada; otra pulsación de Tab sale de la fila hacia el panel.

  • Las flechas izquierda y derecha (o arriba y abajo) mueven el foco a la pestaña siguiente y la seleccionan; Home y End llevan a la primera y a la última.
  • Espacio o Enter selecciona la pestaña enfocada.
  • En texto de derecha a izquierda, las flechas izquierda y derecha siguen la dirección de lectura.
  • Asigna un nombre a la fila de pestañas con aria-label; lo conserva cuando se convierte en una lista de pestañas.

El contraste y el foco se explican en la pestaña Diseño.

Diseño

Cuándo usarlo

Usa pestañas para cambiar entre paneles del mismo nivel que no sea necesario ver a la vez, como el resumen, los ajustes y los registros de un servicio.

Cuándo no usarlo

No uses pestañas para cambiar de página ni para ocultar contenido que se necesite ver de una vez.

  • Para cambiar de página, usa una barra lateral o enlaces en la cabecera.
  • Para pasos que deban seguirse en orden, usa páginas separadas.
  • Más de cinco o seis pestañas no caben en un móvil: usa secciones con encabezados.

Qué hacer y qué no

Hazlo Pon a las pestañas el nombre de sus paneles, con una o dos palabras.
Evítalo No conviertas pasos numerados en pestañas: un proceso ordenado debe ir en páginas separadas y nada impide saltarse un paso.

Cómo escribir el contenido

Pon a cada pestaña el nombre de su panel, con una o dos palabras.

  • Usa estilo oración y evita los verbos: «Resumen», «Ajustes».
  • Usa el mismo nombre para el encabezado del panel.

Contraste y foco

Las pestañas usan texto secundario; la actual usa texto de marca y un subrayado de marca. En el aspecto de píldora, además, va sobre una pastilla.

ParteColor sobre fondoClaroOscuroAlto contrasteMínimo necesario
Pestaña
--luz-text-secondary on --luz-surface-page
6.2:1
7.5:1
19.3:1
4.5:1
Pestaña al pasar el puntero
--luz-text-primary on --luz-surface-page
15.8:1
15.1:1
21.0:1
4.5:1
Pestaña actual y su subrayado
--luz-brand-primary on --luz-surface-page
5.6:1
7.7:1
14.1:1
4.5:1
Pestaña actual, píldora
--luz-brand-primary on --luz-surface
5.9:1
7.2:1
14.1: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 y redondeado hacia abajo. El mínimo necesario corresponde al nivel AA de WCAG 2.2: 4,5:1 para el texto y 3:1 para los anillos de foco, los bordes y los iconos.

  • Foco: contorno de 2 px --luz-focus-ring dibujado dentro de la pestaña, para que la fila desplazable nunca lo recorte.
  • No solo el color: la pestaña actual tiene un subrayado de 2 px; la línea de la fila bajo las demás usa --luz-divider. El aspecto de píldora conserva el subrayado y el peso en la pastilla.
  • Iconos: marca cada icono con aria-hidden="true" para que el nombre de la pestaña sea su texto; por debajo de 640 px el icono se oculta, así que nunca debe llevar solo el significado.

Tokens que usa

Los 15 tokens que lee components/tabs.css, agrupados por familia. Cada familia enlaza a su página, donde aparecen los valores de cada modo. En Figma son variables con los mismos nombres: consulta Tokens en Figma.

Spacing and sizing
--luz-space-2xs, --luz-space-md, --luz-space-sm, --luz-space-xs
Typography
--luz-font-sans, --luz-text-md, --luz-text-sm
Radius
--luz-radius-md
Motion
--luz-duration-fast

El teclado y ARIA se explican en la pestaña Código.