aria-required
Indica che l'input dell'utente è obbligatorio su un controllo prima che il form possa essere inviato. Usare l'attributo HTML required sui campi nativi; ricorrere ad aria-required solo quando non esiste un equivalente HTML — ad esempio un combobox costruito su un div.
Quando usarlo
Solo quando l’attributo HTML required non è disponibile. I campi nativi — <input>, <select>, <textarea> — devono usare required. L’attributo HTML viene annunciato da tutti gli screen reader, partecipa alla validazione nativa del browser e attiva la pseudo-classe CSS :required. aria-required non fa nulla di tutto ciò da solo; è esclusivamente un annuncio.
I casi legittimi per aria-required:
- Un
role="combobox"personalizzato costruito su un<div>o su un<input>stilizzato in cui si è presa in carico la validazione. - Un
role="radiogroup"in cui il gruppo nel suo insieme è obbligatorio (non è possibile applicarerequireda un<div>). - Un selettore di data, di file o un widget di valutazione personalizzato che non è un input nativo.
Se è possibile usare HTML required, è preferibile farlo.
Come si comporta
Booleano. aria-required="true" fa sì che la tecnologia assistiva annunci «obbligatorio» (o «campo da compilare», a seconda dello screen reader) insieme al nome e al ruolo del campo. aria-required="false" equivale a omettere l’attributo e raramente è necessario.
aria-required non impedisce l’invio del form. Non aggiunge un asterisco rosso. Non attiva una pseudo-classe CSS. È esclusivamente un segnale per le tecnologie assistive. La logica di validazione, i messaggi di errore e il marcatore visivo del campo obbligatorio rimangono a carico degli sviluppatori.
Il marcatore visivo del campo obbligatorio (un *, la parola «obbligatorio» ecc.) dovrebbe essere comunicato anche nel nome accessibile — nel testo visibile dell’etichetta o tramite una descrizione — in modo che l’utente vedente e l’utente di tecnologia assistiva ricevano la stessa informazione.
Errori comuni
- Usare
aria-required="true"su un<input>nativo invece dell’attributo HTMLrequired. Funziona, ma si rinuncia senza motivo alla validazione del browser e allo stile:required. - Impostare
aria-required="true"su un elemento che non è un controllo di modulo — un pulsante, un’intestazione, un div senza ruolo. L’attributo viene ignorato. - Dimenticare il marcatore visivo del campo obbligatorio. Gli utenti vedenti vedono un campo non marcato; gli utenti di tecnologia assistiva sentono «obbligatorio». Problema relativo al criterio di successo WCAG SC 1.3.3.
- Contrassegnare un campo come obbligatorio in ARIA ma omettere la verifica nella logica di invio del form. L’annuncio dice «obbligatorio»; il server accetta tranquillamente valori vuoti.
- Associare
aria-requiredconaria-invalid="true"troppo presto. Il campo è non valido solo dopo che l’utente ha tentato di inviare il form lasciandolo vuoto, non al caricamento della pagina. - Localizzare il marcatore visivo
*dimenticando che il testo per lo screen reader nell’etichetta è ora disallineato.
Esempio
<!-- Input nativo: preferire l'attributo HTML -->
<label for="email">
Email <span aria-hidden="true">*</span>
</label>
<input id="email" type="email" required aria-describedby="email-hint">
<p id="email-hint">Required. We will only use this to send your receipt.</p>
<!-- Combobox personalizzato in cui HTML required non è disponibile -->
<div
role="combobox"
aria-required="true"
aria-labelledby="country-label"
aria-controls="country-listbox"
aria-expanded="false"
>
<input type="text" id="country-input">
</div>
<span id="country-label">Country (required)</span>