Sobre este problema HTML
O atributo aria-checked comunica o estado selecionado de um widget interativo às tecnologias de apoio. De acordo com a especificação WAI-ARIA, este atributo é permitido apenas em elementos que tenham um papel que suporte o estado “checked” — como checkbox, switch, radio, menuitemcheckbox, ou menuitemradio. Um elemento <td> simples tem um papel implícito de cell (ou gridcell quando dentro de uma tabela role="grid"), nenhum dos quais suporta aria-checked. Quando o validador encontra aria-checked numa <td> sem um role compatível, marca o elemento como inválido.
Isto importa por várias razões:
-
Acessibilidade: Leitores de ecrã e outras tecnologias de apoio dependem da relação entre
rolee os atributos de estado ARIA. Umaria-checkednum elemento sem um papel selecionável reconhecido cria uma experiência confusa ou quebrada — os utilizadores podem não compreender que a célula deveria ser interativa. - Conformidade com normas: A especificação ARIA em HTML define regras rigorosas sobre quais atributos são permitidos em quais papéis. Violar estas regras significa que o seu HTML é tecnicamente inválido.
-
Comportamento do navegador: Os navegadores podem ignorar completamente
aria-checkedquando é usado num elemento sem um papel válido, tornando o atributo inútil.
Como corrigir
Você tem duas abordagens principais dependendo do que a sua <td> pretende fazer:
1. Adicione um atributo role apropriado. Se a célula da tabela genuinamente representa um controlo selecionável (por exemplo, numa grelha de dados interativa), adicione role="checkbox", role="switch", ou outro papel selecionável apropriado à <td>, juntamente com tabindex para acessibilidade de teclado.
2. Remova aria-checked e use um controlo real. Se a célula simplesmente contém uma caixa de seleção ou interruptor, coloque um <input type="checkbox"> real dentro da <td> e remova os atributos ARIA da própria célula. Controlos HTML nativos já comunicam o seu estado às tecnologias de apoio sem ARIA adicional.
Exemplos
❌ Incorreto: aria-checked sem um role
<table>
<tr>
<td aria-checked="true">Selecionado</td>
<td>Item A</td>
</tr>
</table>
Isto desencadeia o erro porque <td> tem o papel implícito de cell, que não suporta aria-checked.
✅ Correção: Adicione um role compatível à <td>
<table role="grid">
<tr>
<td role="checkbox" aria-checked="true" tabindex="0">Selecionado</td>
<td>Item A</td>
</tr>
</table>
Aqui a <td> tem explicitamente role="checkbox", que suporta aria-checked. O tabindex="0" torna-a focalizável por teclado, e role="grid" na tabela sinaliza que as células podem ser interativas.
✅ Correção: Use uma caixa de seleção nativa dentro da <td>
<table>
<tr>
<td>
<label>
<input type="checkbox" checked>
Selecionado
</label>
</td>
<td>Item A</td>
</tr>
</table>
Esta abordagem é frequentemente a melhor opção. O <input type="checkbox"> nativo já comunica o seu estado selecionado às tecnologias de apoio, e não são necessários atributos ARIA na <td>.
❌ Incorreto: role e aria-checked incompatíveis
<table>
<tr>
<td role="button" aria-checked="false">Alternar</td>
<td>Item B</td>
</tr>
</table>
O papel button não suporta aria-checked. Isto desencadearia um erro de validação diferente mas relacionado.
✅ Correção: Use um papel que suporte aria-checked
<table role="grid">
<tr>
<td role="switch" aria-checked="false" tabindex="0">Alternar</td>
<td>Item B</td>
</tr>
</table>
O papel switch suporta aria-checked e é apropriado para controlos de estilo interruptor.
Encontre problemas como este automaticamente
O Rocket Validator analisa milhares de páginas em segundos, detetando problemas HTML em todo o seu site.