Saltar al contenido principal

Core · Mostrar contenido

Acordeón

Muestra y oculta secciones de contenido con los elementos nativos details y summary, de una en una si asignas un nombre al grupo.

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

Un grupo de preguntas con sus respuestas: al abrir una, se cierra la que estaba abierta.

What is a design token?

A named value, such as a color or a space, that components read instead of a literal.

Why only one open at a time?

The same name on each details connects them: opening one closes the other.

Does it need JavaScript?

No. The browser opens, closes and groups them.

Problemas conocidos

Hay dos cosas que debes saber antes de confiar en un grupo con nombre.

Grupo exclusivo. El atributo name funciona en Chrome y Edge 120, Safari 17.2 y Firefox 130, todos desde septiembre de 2024 o anteriores, por lo que aún no tiene disponibilidad amplia en Baseline. En un navegador más antiguo, cada panel se abre por separado: no se pierde nada.

Lectores de pantalla. LUZ no ha probado cómo anuncian NVDA, JAWS, VoiceOver, TalkBack y Orca un grupo exclusivo, ni ha comprobado datos de compatibilidad. La agrupación de un conjunto exclusivo no se comunica a la tecnología de asistencia: su correspondencia de accesibilidad en HTML sigue siendo una cuestión abierta (consulta la explicación de Open UI).

Código

Copiar el marcado

Un details sin clase no necesita ninguna: un resumen y un divisor, sin caja.

HTML
<details>
  <summary>What is a design token?</summary>
  <p>A named value that components read.</p>
</details>

.luz-accordion añade la caja y el grupo. Con la clase:

HTML
<div class="luz-accordion">
  <details name="faq" open>
    <summary>What is a design token?</summary>
    <p>A named value that components read.</p>
  </details>
  <details name="faq">
    <summary>Does it need JavaScript?</summary>
    <p>No.</p>
  </details>
</div>

Variantes y opciones

Un único <details> no necesita clase: la capa de elementos le da estilo. La clase solo sirve para unir varios en una pila.

Clase o atributoQué hace
.luz-accordion
Une los elementos <details> que contiene en un solo bloque: un borde entre ellos y esquinas redondeadas solo en el bloque
name="…"
Agrupa los elementos details con el mismo nombre: solo puede haber uno abierto a la vez. No tienen que estar juntos
open
Hace que un panel empiece abierto. En un grupo con nombre, solo permanece abierto el primer elemento con open en el código fuente

Cómo funciona

Elementos nativos <details> y <summary>, con estilos de elements/interactive.css y sin clases. components/accordion.css solo añade el bloque unido.

No necesita JavaScript.

  • summary es la etiqueta del panel; el resto de details es su contenido.
  • El contenido cerrado no se muestra ni forma parte del orden de lectura hasta que se abre el panel.

Sin JavaScript

No cambia nada: el navegador se encarga de abrir, cerrar y agrupar. El acordeón funciona por completo sin scripts.

Teclado y ARIA

Con Tab se llega a cada summary en orden. Enter o Espacio lo abre o lo cierra.

No hay atajos con las teclas de flecha para moverse entre paneles.

  • No añadas ningún role: <details> ya tiene su propia semántica y no admite roles ARIA.
  • No pongas enlaces ni botones dentro de summary: ese elemento ya es el control.

El contraste y el foco están en la pestaña Diseño.

Diseño

Cuándo usarlo

Usa un acordeón para agrupar bajo títulos breves contenido que la mayoría de lectores puede omitir.

  • Preguntas frecuentes y listas de referencia largas.
  • Detalles opcionales bajo una respuesta breve.

Cuándo no usarlo

No ocultes información que necesitan todos los lectores ni lo uses para desplazarte por el sitio.

  • Para las secciones principales de un sitio, usa una barra lateral. Para contenido entre el que se puede alternar, usa pestañas.
  • No pongas un error, un aviso ni un paso obligatorio dentro de un panel cerrado.
  • Si solo hay una o dos respuestas breves, muéstralas como texto normal.

Qué hacer y qué no

Hazlo Pon a cada summary un título breve que indique qué responde el panel.
Evítalo No uses una frase contextual completa como título: oculta la idea principal y ocupa varias líneas.

Cómo escribir el contenido

  • Escribe en summary la pregunta o el tema, con mayúscula inicial y en pocas palabras.
  • Pon primero la respuesta en el panel. Sé breve y enlaza a otra página para ampliar la información.
  • Ordena los paneles según las preguntas de los lectores, empezando por la más frecuente.

Contraste y foco

El texto y el indicador usan el color de texto principal sobre la superficie.

ParteColor sobre el fondoClaroOscuroAlto contrasteMínimo
Texto de summary
--luz-text-primary on --luz-surface
16.5:1
14.0:1
21.0:1
4.5:1
summary al pasar el puntero
--luz-text-primary on --luz-surface-hover
14.4:1
12.6:1
20.1:1
4.5:1
Anillo de foco
--luz-focus-ring on --luz-surface
5.9:1
7.2:1
21.0:1
3:1

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

  • Foco: summary tiene el contorno compartido de 2 px --luz-focus-ring, situado a 2 px del borde del cuadro.
  • No depende solo del color: el indicador gira para distinguir entre abierto y cerrado; no se usan el borde ni el fondo.

Tokens que usa

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

Spacing and sizing
--luz-space-sm, --luz-space-xs
Radius
--luz-radius-md
Motion
--luz-duration-base

El aspecto de un details individual y de su summary, con sus propios tokens, se define en elements/interactive.css.

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