HTML semantico
Utilizzo degli elementi HTML in base al loro significato, non alla sola apparenza predefinita. Un `<button>` viene annunciato come pulsante; un `<div onclick>` non viene annunciato in alcun modo.
L’HTML semantico è un HTML in cui ogni elemento viene scelto per il suo
significato, non solo per la sua apparenza. Un <button> è destinato
alle azioni. Un <nav> racchiude la navigazione. Un <table> contiene
dati tabulari. Usare un <div> stilizzato per sembrare un pulsante
costituisce un errore semantico — anche se il risultato visivo è
identico.
La grande maggioranza dei bug di accessibilità è riconducibile all’abbandono della semantica. Quasi ogni guasto nelle tecnologie assistive ha la stessa causa principale: un elemento generico che svolge il compito per cui era stato progettato un elemento semantico.
Perché gli screen reader dipendono dalla semantica
Gli screen reader espongono l’HTML all’utente attraverso il loro albero di accessibilità — una rappresentazione interna costruita a partire dal DOM che associa ogni elemento a un ruolo, un nome, uno stato e delle proprietà. L’albero di accessibilità è ciò che l’utente ascolta effettivamente.
Un <button> nativo entra nell’albero di accessibilità come
button "Invia". Un <div> stilizzato per sembrare un pulsante
entra come generic — il che significa che lo screen reader non
annuncia nulla di utile e l’utente non ha modo di scoprire che il
div è interattivo.
La stessa logica si applica a:
- I titoli (
<h1>–<h6>) — gli screen reader consentono agli utenti di spostarsi tra i titoli per scorrere una pagina. Un<div class="heading">non compare nell’elenco dei titoli. - Le liste (
<ul>,<ol>,<li>) — gli screen reader annunciano «lista, 5 elementi» prima della lettura. I<div>che simulano voci di elenco non lo fanno. - I moduli — un
<input>collegato a un<label>viene letto come «Email, campo di testo». Un campo personalizzato costruito con div econtenteditablenon legge nulla. - Le tabelle — una
<table>con intestazioni di riga e colonna<th>consente agli utenti di navigare celle per cella con il contesto dell’intestazione annunciato. Le griglie CSS di div non lo consentono.
Il pattern di sostituzione
La soluzione ha quasi sempre la stessa forma:
<div onclick="...">→<button>(oppure<a href>per la navigazione).<span class="link">→<a href>.<div role="heading">→ da<h1>a<h6>.- Dropdown personalizzati →
<select>dove il design lo consente, oppure una combobox ARIA testata secondo i pattern stabiliti dove non è possibile. - Tab realizzate con
<div>stilizzati → pattern tab dalla ARIA Authoring Practices Guide.
Quando ricorrere ad ARIA
La prima regola di ARIA recita: non usare ARIA se un elemento nativo
svolge il compito. I ruoli, gli stati e le proprietà ARIA sono una
patch per i casi in cui l’HTML nativo non è in grado di descrivere
il widget che si sta costruendo (alberature, combobox a selezione
multipla, certi pattern modali). Non sono un sostituto all’uso
di <button>.
Un audit pragmatico
Il modo più rapido per individuare il degrado semantico in un codebase:
cercare onclick su div e span. Ogni corrispondenza è un
potenziale problema. Il secondo modo più rapido: cercare gli attributi
role=. ARIA è appropriato in contesti limitati, ma un uso massiccio
di ARIA spesso segnala che gli elementi nativi sono stati evitati per
ragioni stilistiche che in realtà non lo richiedevano.