Sobre esta regra de acessibilidade
O atributo aria-hidden="true" indica às tecnologias assistivas para ignorarem um elemento e todos os seus descendentes. Isto é útil para ocultar conteúdo puramente decorativo — como fontes de ícones ou elementos visuais redundantes — que iriam confundir a experiência do leitor de ecrã. No entanto, surge um problema sério quando elementos focalizáveis como links, botões, campos de formulário ou elementos com tabindex="0" existem dentro de um contentor com aria-hidden="true".
Quando isto acontece, os utilizadores que navegam pelo teclado ainda podem usar Tab para chegar a esses elementos, mas os leitores de ecrã não os anunciarão. O utilizador para no que parece ser um controlo invisível e sem etiqueta. Não têm forma de saber o que é o elemento ou o que faz. Isto afeta utilizadores cegos, utilizadores surdocegos, utilizadores com baixa visão que dependem de leitores de ecrã e utilizadores com mobilidade reduzida que navegam exclusivamente pelo teclado.
É também importante compreender que aria-hidden="false" num descendente não sobrepõe aria-hidden="true" num ancestral. Uma vez que um pai esteja oculto da árvore de acessibilidade, todos os filhos permanecem ocultos independentemente do seu próprio valor aria-hidden. Qualquer filho focalizável dentro dessa subárvore ainda cria o mesmo problema.
Critérios de sucesso WCAG relacionados
Esta regra relaciona-se principalmente com o Critério de Sucesso WCAG 4.1.2: Nome, Função, Valor (Nível A). Este critério exige que para todos os componentes da interface do utilizador, o nome e a função possam ser determinados programaticamente, e estados, propriedades e valores possam ser definidos programaticamente. Um elemento focalizável dentro de um contentor aria-hidden="true" viola isto porque o seu nome e função são removidos da API de acessibilidade enquanto permanece acessível via teclado — tornando impossível para as tecnologias assistivas transmitirem o seu propósito. Esta regra é sinalizada nas WCAG 2.0, 2.1 e 2.2 ao Nível A, bem como nas diretrizes Trusted Tester, EN 301 549 e RGAA.
Como corrigir
Existem várias estratégias para resolver este problema:
-
Remover
aria-hidden="true"de elementos que contêm filhos focalizáveis, se esses filhos precisam de ser interativos. -
Remover elementos focalizáveis de dentro do contentor
aria-hidden="true"se toda a secção estiver realmente destinada a estar oculta. -
Tornar elementos focalizáveis não focalizáveis adicionando
tabindex="-1"a links, botões ou outros elementos interativos dentro do contentor oculto. -
Usar o atributo
disabledem controlos de formulário (nãoaria-disabled, que não impede efetivamente o foco). -
Ocultar elementos com CSS usando
display: noneouvisibility: hidden, que os remove tanto da árvore de acessibilidade como da ordem de foco simultaneamente.
Se precisar de ocultar conteúdo das tecnologias assistivas, certifique-se de que o significado e funcionalidade equivalentes ainda estão disponíveis através de outros meios acessíveis.
Exemplos
Incorreto: Link focalizável dentro de aria-hidden="true"
O link é removido da árvore de acessibilidade mas ainda recebe foco do teclado.
<div aria-hidden="true">
<a href="/home">Home</a>
</div>
Incorreto: Link focalizável fora do ecrã dentro de aria-hidden="true"
Mover um link para fora do ecrã não o remove da ordem de foco.
<div aria-hidden="true">
<a href="/" style="position:absolute; top:-999em">Link</a>
</div>
Incorreto: Usar aria-disabled em vez de disabled
O atributo aria-disabled não impede efetivamente que o input receba foco.
<div aria-hidden="true">
<input aria-disabled="true" />
</div>
Incorreto: Elemento com tabindex="0" e aria-hidden="true"
Adicionar tabindex="0" torna um elemento normalmente não focalizável em focalizável, criando um conflito com aria-hidden="true".
<p tabindex="0" aria-hidden="true">Algum texto descritivo</p>
Incorreto: Tentar sobrepor aria-hidden num descendente
Definir aria-hidden="false" num filho não o reexpõe quando um pai tem aria-hidden="true". O botão permanece oculto das tecnologias assistivas mas ainda recebe foco.
<div aria-hidden="true">
<div aria-hidden="false">
<button>Submeter</button>
</div>
</div>
Incorreto: <summary> focalizável dentro de aria-hidden="true"
O elemento <summary> é nativamente focalizável.
<details aria-hidden="true">
<summary>Mais informação</summary>
<p>Detalhes adicionais aqui.</p>
</details>
Correto: Conteúdo não focalizável dentro de aria-hidden="true"
Um parágrafo sem elementos interativos é seguro de ocultar.
<p aria-hidden="true">Texto descritivo decorativo</p>
Correto: Elementos focalizáveis ocultos com CSS display: none
Usar display: none remove o link tanto da ordem de foco como da árvore de acessibilidade.
<div aria-hidden="true">
<a href="/" style="display:none">Link</a>
</div>
Correto: Elementos focalizáveis tornados não focalizáveis com tabindex="-1"
Adicionar tabindex="-1" remove o botão da ordem de tabs.
<div aria-hidden="true">
<button tabindex="-1">Fechar</button>
</div>
Correto: Input de formulário adequadamente desativado com o atributo disabled
O atributo disabled impede que o input receba foco inteiramente.
<input disabled aria-hidden="true" />
Correto: Remover aria-hidden e manter elementos interativos
Se o conteúdo precisa de ser focalizável, simplesmente não o oculte das tecnologias assistivas.
<div>
<a href="/home">Home</a>
</div>
Ajude-nos a melhorar os nossos guias
Detecte problemas de acessibilidade automaticamente
O Rocket Validator examina milhares de páginas com Axe Core e o W3C Validator, encontrando problemas de acessibilidade em todo o seu site.