Sobre este problema HTML
O atributo aria-controls estabelece uma relação programática entre um elemento de controlo (como um botão, separador ou barra de deslocamento) e o elemento que controla (como um painel, região ou área de conteúdo). Tecnologias assistivas, como leitores de ecrã, usam esta relação para ajudar os utilizadores a navegar entre elementos relacionados — por exemplo, anunciando que um botão controla um painel específico e permitindo ao utilizador saltar para ele.
Quando o id referenciado em aria-controls não existe no documento, a relação fica quebrada. Os leitores de ecrã podem tentar localizar o elemento alvo e falhar silenciosamente, ou podem anunciar uma relação de controlo que não leva a lado nenhum. Isto degrada a experiência para utilizadores que dependem de tecnologia assistiva e viola a especificação WAI-ARIA, que exige que o valor de aria-controls seja uma lista de referências de ID válidas apontando para elementos no mesmo documento.
Causas comuns deste erro incluem:
-
Erros de digitação no
idou no valoraria-controls. - Conteúdo gerado dinamicamente onde o elemento controlado ainda não foi renderizado ou foi removido do DOM.
-
Erros de copiar-colar onde
aria-controlsfoi copiado de outro componente, mas oidcorrespondente não foi atualizado. - Referência a elementos em iframes ou shadow DOM, que são considerados contextos de documento separados.
O atributo aria-controls aceita uma ou mais referências de ID separadas por espaços. Cada ID listado deve corresponder a um elemento no mesmo documento.
Como corrigir
-
Verifique se o elemento alvo existe no documento e tem exatamente o
idquearia-controlsreferencia. -
Verifique erros de digitação — a correspondência de ID é sensível a maiúsculas e minúsculas, portanto
mainPanelemainpanelnão são iguais. -
Se o elemento controlado for adicionado dinamicamente, certifique-se de que está presente no DOM antes ou ao mesmo tempo que o elemento de controlo, ou atualize
aria-controlsprogramaticamente quando o alvo ficar disponível. -
Se o elemento controlado estiver genuinamente ausente (ex.: renderizado condicionalmente), remova o atributo
aria-controlsaté que o elemento alvo exista.
Exemplos
Incorreto: aria-controls referencia um ID inexistente
<button aria-controls="info-panel" aria-expanded="false">
Toggle Info
</button>
<div id="infopanel">
<p>Here is some additional information.</p>
</div>
Isto desencadeia o erro porque aria-controls="info-panel" não corresponde ao id real de "infopanel" (note o hífen em falta).
Correto: aria-controls corresponde ao ID de um elemento existente
<button aria-controls="info-panel" aria-expanded="false">
Toggle Info
</button>
<div id="info-panel">
<p>Here is some additional information.</p>
</div>
Correto: relação entre separador e painel de separador
<div role="tablist">
<button role="tab" aria-controls="tab1-panel" aria-selected="true">
Overview
</button>
<button role="tab" aria-controls="tab2-panel" aria-selected="false">
Details
</button>
</div>
<div id="tab1-panel" role="tabpanel">
<p>Overview content goes here.</p>
</div>
<div id="tab2-panel" role="tabpanel" hidden>
<p>Details content goes here.</p>
</div>
Ambos os valores de aria-controls — tab1-panel e tab2-panel — correspondem corretamente a elementos presentes no documento.
Correto: barra de deslocamento personalizada controlando uma região
<div role="scrollbar" aria-controls="main-content" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" aria-orientation="vertical"></div>
<div id="main-content" role="region" aria-label="Main content">
<p>Scrollable content goes here.</p>
</div>
Correto: controlando múltiplos elementos
O atributo aria-controls pode referenciar múltiplos IDs separados por espaços. Cada ID deve existir no documento.
<button aria-controls="section-a section-b">
Expand All Sections
</button>
<div id="section-a">
<p>Section A content.</p>
</div>
<div id="section-b">
<p>Section B content.</p>
</div>
Encontre problemas como este automaticamente
O Rocket Validator analisa milhares de páginas em segundos, detetando problemas HTML em todo o seu site.
Saiba mais: