Product Craft Bible
Accordion & FAQ
Inicio Componentes UI Accordion & FAQ
Componentes UI

Accordion & FAQ

8 reglas NN/g "Accordions Are Not Always the Answer" 2014 · ARIA Authoring Practices Guide 1.2 · Apple HIG Disclosure Controls · Radix UI AccordionAmit Sheen CSS grid animation trick 2022 · Radix UI Accordion source · shadcn/ui Accordion · Kevin Powell YouTube 2023 · Jake Archibald "Animating to and from auto"WCAG 2.5.5 Target Size · Apple HIG Touch Targets · Material Design Touch Targets · ARIA APG Accordion Pattern · Smashing Magazine "Accordion Best Practices" 2021ARIA Authoring Practices Guide 1.2 Accordion Pattern · WebAIM "Accessible Accordions" · Deque University ARIA · JAWS Virtual Cursor 2023 · W3C WCAG 2.1 SC 4.1.2
11

Accordion & FAQ

8 reglas
122

Single-open para secuencial; multi-open para comparativo

El modo de apertura del accordion debe coincidir con la tarea cognitiva del usuario. En flujos donde el contenido es secuencial y no necesita comparación simultánea (onboarding, tutoriales, configuración paso a paso), single-open reduce la carga cognitiva al mantener solo un bloque visible. En contextos comparativos donde el usuario necesita ver dos respuestas al mismo tiempo (FAQ técnica, tabla de características, opciones de producto), multi-open es la elección correcta. Forzar single-open en un FAQ comparativo obliga al usuario a memorizar el contenido del panel anterior antes de abrir el siguiente, aumentando los errores de decisión. La elección del modo debe documentarse en el diseño del componente, no dejarse al azar.

NN/g "Accordions Are Not Always the Answer" 2014 · ARIA Authoring Practices Guide 1.2 · Apple HIG Disclosure Controls · Radix UI Accordion
Preferir
Single-openSecuencial
Paso 1, Cuenta
Paso 2, Perfil
Completa tu nombre y foto de perfil. Esta información es visible para tu equipo.
Paso 3, Notificaciones
Multi-openComparativo
¿Puedo cancelar en cualquier momento?
Sí, cancelas en cualquier momento desde tu cuenta. Sin penalización.
¿Incluye soporte técnico?
¿Qué pasa al vencer el plan?
Tu cuenta pasa a modo lectura. Los datos se conservan 30 días.
123

Animar con grid-template-rows: 0fr → 1fr; nunca max-height hack

La técnica de max-height para animar alturas en accordions produce tres problemas: clipping visual al inicio de la transición si el valor máximo es demasiado bajo, retardo perceptible al final si es demasiado alto (el elemento ya alcanzó su tamaño real pero la transición continúa), y un recálculo de layout por frame que impacta el rendimiento en dispositivos móviles. La alternativa correcta usa grid-template-rows: 0fr en el estado cerrado y 1fr en el abierto; combinado con overflow: hidden en el contenedor interior, logra una animación suave de altura real sin los artificios del hack. El soporte en navegadores modernos supera el 95% desde 2023. Esta técnica es utilizada por Radix UI, shadcn/ui y Headless UI en producción.

Amit Sheen CSS grid animation trick 2022 · Radix UI Accordion source · shadcn/ui Accordion · Kevin Powell YouTube 2023 · Jake Archibald "Animating to and from auto"
Preferir
El plan Starter incluye hasta 5 usuarios activos. Los planes Pro y Enterprise permiten usuarios ilimitados con roles y permisos granulares por workspace.
Sí. Los upgrades se aplican inmediatamente con crédito prorrateado. Los downgrades toman efecto al final del ciclo de facturación actual.
Ofrecemos facturación mensual y anual. El plan anual incluye 2 meses gratis respecto al precio mensual equivalente.
/* Técnica: animar con grid-template-rows */ .panel { display: grid; grid-template-rows: 0fr; /* cerrado */ transition: grid-template-rows 300ms ease; } .panel.open { grid-template-rows: 1fr; /* abierto */ } .inner { overflow: hidden; /* clip durante animación */ }
124

Chevron 180°; toda la barra header = tap target mínimo 44px

El chevron rotando 180° es el indicador de estado más universal en accordions: el usuario aprende una vez y predice el comportamiento en cualquier implementación futura. La dirección convencional es hacia abajo en estado cerrado (▾), hacia arriba en estado abierto (▴). El tap target debe cubrir la barra completa: hacer clickeable solo el chevron es un error frecuente que genera errores de selección, especialmente en dispositivos táctiles. WCAG 2.5.5 requiere mínimo 44×44px para controles táctiles, un header de accordion puede ser visualmente más delgado pero su área interactiva debe cumplir este mínimo con padding compensatorio. En desktop, el cursor debe cambiar a pointer sobre toda la barra, no solo sobre el texto o el ícono.

WCAG 2.5.5 Target Size · Apple HIG Touch Targets · Material Design Touch Targets · ARIA APG Accordion Pattern · Smashing Magazine "Accordion Best Practices" 2021
Preferir
52px
¿Puedo exportar mis datos?
tap target completo
Sí. Desde Configuración → Datos → Exportar puedes descargar un ZIP con todos tus datos en formato CSV y JSON en menos de 2 minutos.
¿Dónde se almacenan los datos?
Todos los datos se almacenan en servidores certificados ISO 27001 en la Unión Europea.
125

aria-expanded en button; role=region solo si ≤6 paneles; aria-controls para JAWS

El patrón accesible de accordion requiere que el elemento interactivo sea un <button> nativo con aria-expanded="true/false" que cambia dinámicamente. El aria-controls apunta al ID del panel y es crítico para JAWS, el screen reader de escritorio más usado en entornos corporativos; sin él, JAWS no puede saltar directamente al panel expandido. El atributo role="region" debe añadirse al panel solo cuando hay 6 paneles o menos: con más paneles, los puntos de navegación por landmarks se vuelven contraproducentes y fragmentan la experiencia en VoiceOver y NVDA. El panel debe identificarse con aria-labelledby apuntando al ID del botón, creando el vínculo semántico bidireccional. Nunca usar <div> ni <a> para el trigger de accordion.

ARIA Authoring Practices Guide 1.2 Accordion Pattern · WebAIM "Accessible Accordions" · Deque University ARIA · JAWS Virtual Cursor 2023 · W3C WCAG 2.1 SC 4.1.2
Preferir
<!-- Item de accordion accesible --> <div> <h3> <button id="btn-1" aria-expanded="false" ← cambia a "true" al abrir aria-controls="panel-1" ← crítico para JAWS > ¿Cuánto cuesta el plan Pro? </button> </h3> <div id="panel-1" role="region" ← solo si ≤ 6 paneles aria-labelledby="btn-1" ← vínculo semántico hidden ← AT ignora el panel cerrado > <p>El plan Pro cuesta $29/mes por usuario.</p> </div> </div>
Atributos ARIA clave
Comentarios de implementación
Elementos HTML nativos
Atributos de estructura
126

Panel oculto con display:none o hidden; NUNCA visibility:hidden

Hay tres formas comunes de ocultar el panel de un accordion y solo dos son correctas. display:none y el atributo hidden eliminan el elemento del flujo de layout y del árbol de accesibilidad, de modo que el screen reader no anuncia el contenido colapsado. visibility:hidden es el anti-patrón: oculta visualmente el elemento pero lo mantiene en el flujo de layout (el espacio queda reservado), y lo más grave es que los links y controles dentro del panel siguen siendo enfocables con Tab aunque sean invisibles, creando "foco fantasma" para usuarios de teclado. Para la técnica de animación grid-rows, el inner wrapper lleva hidden cuando el accordion está cerrado y se lo quita con JavaScript justo antes de iniciar la transición de apertura.

MDN "visibility" vs "display" · WebAIM Keyboard Accessibility · Deque "Invisible focus" anti-pattern · WCAG 2.4.3 Focus Order · Scott O'Hara "Disclosure"
Preferir
display:noneOK
¿Precio?
Panel eliminado del flujo
display: none
sin espacio reservado
Espacio: eliminado AT: no anuncia Tab: no enfoca
hidden attrOK
¿Precio?
Panel eliminado del flujo
<div hidden>
sin espacio reservado
Espacio: eliminado AT: no anuncia Tab: no enfoca
visibility:hiddenNO
¿Precio?
link tab-focusable
visibility: hidden
espacio reservado!
Espacio: reservado AT: varía Tab: sí enfoca (error)
127

FAQ: headings semánticos + JSON-LD FAQPage schema

Un accordion de FAQ debe usar headings semánticos reales (<h2> o <h3>) como contenedor del botón trigger, creando una jerarquía de documento navegable por screen readers y bots. Esto permite que el usuario de lector de pantalla navegue entre preguntas con el atajo de heading en lugar de tabular a cada botón individualmente. Adicionalmente, el JSON-LD FAQPage es el schema más adoptado en Rich Results de Google: cuando está correctamente implementado, Google puede mostrar las preguntas y respuestas expandidas directamente en la SERP, aumentando el CTR orgánico entre un 20% y 30% según datos de Search Console. El schema no requiere que el accordion esté técnicamente visible en la página; Google lee el JSON-LD independientemente del estado del componente.

Google Search Central "FAQ Schema" · Schema.org/FAQPage · ARIA APG Accordion · John Mueller "FAQ structured data" 2023 · Ahrefs Case Study CTR FAQ 2022
Preferir
FAQ accordion

h3¿Cuánto dura la garantía?

Todos los productos incluyen garantía de 2 años contra defectos de fabricación.

h3¿Puedo devolver el producto?

Aceptamos devoluciones dentro de los 30 días siguientes a la compra sin preguntas.
JSON-LD FAQPage
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "¿Cuánto dura la garantía?", "acceptedAnswer": { "@type": "Answer", "text": "2 años contra defectos" } }, { "@type": "Question", "name": "¿Puedo devolver el producto?", "acceptedAnswer": { "@type": "Answer", "text": "30 días sin preguntas" } } ] } </script>
128

Nunca ocultar info crítica para la decisión de compra

El accordion es una herramienta de organización de información secundaria, no un lugar para esconder datos que el usuario necesita para decidir. Precio, condiciones de envío, restricciones de uso y avisos legales relevantes deben estar siempre visibles en el flujo de la página, sin requerir interacción del usuario para descubrirlos. Según estudios de Baymard Institute, el 16% del abandono en checkout se produce cuando los usuarios descubren costos adicionales que no eran visibles en la página de producto. El accordion correcto contiene especificaciones técnicas, preguntas frecuentes o información de soporte, contenido relevante solo para un subconjunto de usuarios. Si el contenido es necesario para que cualquier usuario tome una decisión informada, no va en accordion.

Baymard Institute "Checkout Usability" 2023 · NN/g "Progressive Disclosure" · FTC "Clear and Conspicuous Disclosures" · Luke Wroblewski "Mobile First" · Amazon Checkout A/B Tests
Preferir
Cámara Pro 4K
(312)
$899 MXN
Envío gratis, llega en 3 días
Garantía 2 años incluida
Especificaciones técnicas
Evitar
Cámara Pro 4K
(312)
Precio disponible en "Ver más detalles"
Precio, envío y garantía en accordion ▼
Decisión sin precio visible
129

Máx 1 nivel; nunca split target (título navega / chevron expande)

Un accordion anidado, donde el panel abierto contiene otro accordion, duplica la complejidad cognitiva sin añadir capacidad real de organización: si el contenido requiere dos niveles de jerarquía, la solución correcta es refactorizar a un sistema de navegación (sidebar + páginas). El anti-patrón del split target es igualmente grave: ocurre cuando el título del accordion es un enlace que navega a una página mientras el chevron colapsa/expande el panel. El resultado son dos zonas de interacción diferentes en el mismo elemento con comportamientos incompatibles. El usuario que hace click en el título espera expandir el panel, no navegar, porque así funciona el 99% de los accordions que ha usado antes. Toda la barra debe ser un único <button> nativo con una sola acción predecible.

NN/g "Mental Models" · ARIA APG Accordion, single trigger requirement · WCAG 2.5.3 Label in Name · Vitaly Friedman "Accordion Best Practices" Smashing 2023 · Linear design docs
Preferir
Un solo target, toda la barra
Ofrecemos planes Starter, Pro y Enterprise con precios por usuario y por uso.
Accede a guías, referencias de API y tutoriales en docs.ejemplo.com.
Soporte 24/7 por chat y email para planes Pro y Enterprise.
Toda la barra es button, una sola acción
Evitar
Split target
expande
expande
expande
Zona azul navega, zona naranja expande, confuso
Anidado (2 niveles)
Integraciones
APIs REST
Webhooks
2 niveles, usar sidebar de navegación