Sobre este problema HTML
O elemento article é um elemento de conteúdo seccional que representa uma composição autónoma — um post de blog, uma notícia, uma entrada de fórum, ou conteúdo independente similar. Porque carrega o papel ARIA implícito de article, funciona como uma referência que as tecnologias assistivas reconhecem e expõem aos utilizadores para navegação. Sobrescrever este papel de referência com listitem cria um conflito: o elemento perde a sua semântica article para utilizadores de tecnologia assistiva, e o próprio papel listitem torna-se inválido porque as regras de mapeamento de papéis ARIA não o permitem em article.
De acordo com a especificação ARIA em HTML, cada elemento HTML tem um conjunto de papéis ARIA permitidos. O elemento article apenas permite um conjunto restrito de papéis (tais como application, document, feed, main, none, presentation, e region). O papel listitem não está entre eles. Esta restrição existe para prevenir que os autores criem semânticas confusas ou contraditórias que degradariam a experiência de acessibilidade.
Além da validação, isto importa para utilizadores reais. Os leitores de ecrã dependem da informação de papel para transmitir estrutura. Um article anunciado como um listitem é enganador — o utilizador perde a capacidade de navegar por referencias de artigo, e o listitem pode não funcionar corretamente sem um contexto pai list adequado. Os navegadores e tecnologias assistivas esperam que os papéis listitem apareçam como filhos diretos de um elemento com role="list" (ou dentro de elementos nativos ul/ol).
Como corrigir
A solução depende da sua intenção:
-
Se você quer uma lista de artigos, use marcação de lista HTML nativa (
ulouolcomli) e coloque cadaarticledentro de um item de lista. Isto dá-lhe tanto semânticas de lista como referencias de artigo sem quaisquer sobrescritas ARIA. -
Se não pode usar elementos de lista nativos, use elementos
divneutros comrole="list"erole="listitem", e aninhe oarticledentro de cada contentorlistitem. -
Se o conteúdo não é verdadeiramente uma lista, simplesmente remova o atributo
role="listitem"e deixe o elementoarticleusar as suas semânticas nativas.
Exemplos
Inválido: role="listitem" num elemento article
Isto despoleta o erro do validador porque listitem não é um papel permitido para article.
<article role="listitem">
<h2>Item de notícias</h2>
<p>Detalhes sobre esta história.</p>
</article>
Válido: lista nativa com elementos article dentro
Usar ul e li fornece semânticas de lista adequadas enquanto preserva o papel de referência article.
<ul>
<li>
<article>
<h2>Item de notícias</h2>
<p>Detalhes sobre esta história.</p>
</article>
</li>
<li>
<article>
<h2>Outro item</h2>
<p>Mais detalhes aqui.</p>
</article>
</li>
</ul>
Válido: papéis ARIA de lista em contentores neutros com elementos article aninhados
Quando elementos de lista nativos não são adequados para o seu layout, use elementos div para a estrutura de lista e aninhe cada article dentro.
<div role="list">
<div role="listitem">
<article>
<h2>Item de notícias</h2>
<p>Detalhes sobre esta história.</p>
</article>
</div>
<div role="listitem">
<article>
<h2>Outro item</h2>
<p>Mais detalhes aqui.</p>
</article>
</div>
</div>
Válido: article independente sem um papel de lista
Se o conteúdo não pertence a uma lista, simplesmente remova o papel inválido.
<article>
<h2>Item de notícias</h2>
<p>Detalhes sobre esta história.</p>
</article>
Em todos os casos, o princípio chave é o mesmo: deixe o elemento article manter as suas semânticas nativas, e use a estrutura de lista apropriada à sua volta em vez de forçar um papel conflituoso sobre ele.
Encontre problemas como este automaticamente
O Rocket Validator analisa milhares de páginas em segundos, detetando problemas HTML em todo o seu site.