Accordion e abas acessíveis em JavaScript

Accordion e abas em JavaScript

Accordion e abas acessíveis em JavaScript: código para copiar e colar | We.Inc

Um accordion em JavaScript puro com altura animada e aria-expanded, e abas com teclas de seta e roving tabindex. Os dois rodam ao vivo na página, com um checklist de teclado e uma tabela de ARIA.

Um accordion acessível usa um botão de verdade dentro de cada título, com aria-expanded indicando se o painel está aberto e aria-controls apontando o painel. Abas acessíveis usam role=tablist, tab e tabpanel, com aria-selected, e passam de uma aba para outra com as teclas de seta, mantendo só a aba selecionada na ordem do Tab. As duas demos abaixo rodam ao vivo.

Qual usar

Cada demo é um único bloco autossuficiente de HTML, CSS e JavaScript. Edite e o resultado roda de novo. Depois deixe o mouse de lado e teste com o teclado usando o checklist mais abaixo.

Perguntas frequentes

As abas devem mudar com a tecla de seta ou com Enter?

O guia de ARIA permite as duas formas. Mudar conforme a seta se move (ativação automática) parece mais rápido quando os painéis já estão carregados. Se exibir um painel for lento, mova o foco com as setas e mude com Enter ou Space.

Como animo a altura de um accordion sem medir com JavaScript?

Transforme o painel em uma grid e faça a transição de grid-template-rows de 0fr para 1fr, com um elemento interno com overflow hidden. O navegador calcula a altura para você.

O elemento details é acessível?

Sim. Os navegadores expõem o summary como um botão com estado de expandido, e ele funciona com o teclado sem configuração. Estilizar o marcador e animá-lo é mais difícil, e é por isso que muitos sites ainda criam o próprio.

Respostas escondidas em accordion contam para SEO?

Conteúdo que está no HTML, mas recolhido, ainda é rastreado. Mantenha-o no código-fonte da página em vez de carregá-lo no clique, e garanta que a resposta visível corresponda ao que está no HTML.

Próximos passos

Erros comuns

Accordion

Accordion acessível com altura animada

Cada título contém um botão de verdade com aria-expanded e aria-controls. A altura é animada com uma transição de grid-rows, então não é preciso medir scrollHeight. Experimente com Tab, Enter e Space.

Só um painel aberto por vez

Quando um painel abre, feche qualquer outro que esteja aberto. Deixe isso opcional: quem está comparando duas respostas muitas vezes quer as duas abertas.

Fallback sem JavaScript: details e summary

Elementos details nativos abrem e fecham sem script. Dar a eles o mesmo atributo name os torna exclusivos nos navegadores atuais; os mais antigos apenas permitem vários abertos.

Abas

Abas com roving tabindex e teclas de seta

Só a aba selecionada tem tabindex 0, então o Tab entra na lista de abas uma vez e depois segue para o painel. As setas para a esquerda e para a direita passam de uma aba para outra, Home e End pulam para as pontas.

Checklist de teclado e ARIA

Teste de teclado: experimente cada um nas demos

Referência de ARIA

Atributos de que cada parte precisa

Trabalha com React? Comece pelos nossos

componentes de abas em React

Comece grátis · Sem cartão de crédito

Relacionados: Guias

Produto

Para quem é

Recursos

Recursos

Empresa

Mapa do site