Informazioni e relazioni
Le informazioni e le relazioni trasmesse visivamente — intestazioni, elenchi, tabelle, etichette di moduli, raggruppamenti — devono essere espresse anche nel markup, in modo che le tecnologie assistive possano renderle correttamente. La sola formattazione visiva non è sufficiente.
Cosa richiede
Tutto ciò che si percepisce a colpo d’occhio — che questo testo grande e in grassetto è un’intestazione, che queste righe formano una tabella di dati, che questo gruppo di campi è l’«indirizzo di fatturazione», che l’asterisco indica un campo obbligatorio — deve essere presente anche nel codice sottostante. I lettori di schermo, i software di controllo vocale e i motori di ridisposizione vedono solo il markup. Se una relazione è puramente visiva (un font più grande, un bordo più spesso, un rientro), le tecnologie assistive non percepiscono nulla.
Come soddisfarlo
- Utilizzare veri elementi di intestazione (
<h1>fino a<h6>) in un ordine gerarchico logico — mai un<div>stilizzato per simulare un’intestazione. - Marcare gli elenchi con
<ul>,<ol>e<li>— non paragrafi separati da interruzioni di riga o caratteri bullet. - Usare
<table>con<th scope="col">/<th scope="row">per le tabelle di dati, con<caption>che descrive lo scopo della tabella. - Ogni campo di modulo deve avere un’etichetta programmatica:
<label for="...">,aria-labelledbyoaria-label. Il testo segnaposto non è un’etichetta. - Raggruppare i campi di modulo correlati in
<fieldset>con<legend>, oppure usarerole="group"conaria-labelledbyper i widget personalizzati. - Per figure e didascalie, utilizzare
<figure>e<figcaption>. Per le coppie definizione-termine, usare<dl>/<dt>/<dd>. - Indicare i campi obbligatori sia visivamente (asterisco) sia programmaticamente (
aria-required="true"o l’attributorequired).
Errori comuni
<div class="heading-1">al posto di<h1>— visivamente corretto, annunciato come nulla dai lettori di schermo.- Tabelle di layout usate per colonne visive, o tabelle di dati costruite con griglie di
<div>senza celle<th>. - Campi di modulo con solo il testo segnaposto come etichetta — l’etichetta scompare al focus e i lettori di schermo potrebbero non annunciarla.
- Punti elenco simulati con
<p>• Voce</p>invece del markup di lista appropriato. - Asterischi per i campi obbligatori mostrati in rosso via CSS, senza attributo
aria-requiredorequired. - Pulsanti radio raggruppati visivamente senza
<fieldset>/<legend>, che lascia agli utenti di lettori di schermo opzioni fluttuanti prive della domanda di riferimento. - Tabelle di dati in cui la riga di intestazione è in grassetto ma usa
<td>invece di<th>.
Perché è importante
Il criterio 1.3.1 è il SC più citato nelle verifiche WCAG dopo 1.1.1 e 1.4.3. Ogni pagina generata da un CMS, ogni landing page marketing, ogni widget di modulo personalizzato tende a non soddisfare almeno una parte di questo criterio. La soluzione è quasi sempre l’HTML semantico, non ARIA — quando si ricorre a role="heading" per riparare un <div> che avrebbe dovuto essere <h2>, il problema è già a monte.