button
Contrassegna un elemento come pulsante — un controllo che attiva un'azione quando viene azionato. È preferibile utilizzare l'elemento HTML nativo <button>; ricorrere a role="button" su un <div> o uno <span> soltanto quando non è possibile usare l'elemento nativo.
Quando utilizzarlo
Quasi mai — è preferibile utilizzare l’elemento nativo <button>. L’elemento nativo gestisce gratuitamente il focus, l’attivazione tramite i tasti Spazio e Invio, lo stato disabilitato e la semantica di invio del modulo. Ricorrere a role="button" su un <div> significa dover reimplementare tutto ciò, e la maggior parte degli autori non lo fa correttamente.
I casi legittimi per role="button" sono circoscritti:
- Si è vincolati da un sistema di design di terze parti che distribuisce componenti non basati su
<button>. - Si opera in un ambiente in cui
<button>non è disponibile (alcuni template di CMS legacy). - Si sta aggiornando un
<div>per l’accessibilità a breve termine mentre si pianifica un refactoring.
Se si utilizza role="button", è necessario anche:
- Rendere l’elemento raggiungibile con il focus tramite
tabindex="0". - Collegare l’evento
keydownsia perEnterche perSpace(conevent.preventDefault()su Space per evitare lo scorrimento della pagina). - Gestire autonomamente lo stato disabilitato tramite
aria-disabled="true"e impedire l’attivazione dei gestori di clic.
Pulsanti a commutazione
Se il pulsante è un toggle (mute / unmute, play / pause, segui / non seguire), impostare aria-pressed su "true" o "false". Gli screen reader annunciano lo stato insieme all’etichetta: «Mute, pulsante di commutazione, non premuto».
Errori comuni
<div onclick="…">Submit</div>— non raggiungibile con il focus, non utilizzabile da tastiera, privo di ruolo. Gli utenti del mouse possono interagirvi; nessun altro può.<a href="#" onclick="…">che si comporta da pulsante. Il browser lo tratta come un link, lo screen reader lo annuncia come link, l’utente si aspetta una navigazione.role="button"senzatabindex="0"— lo screen reader annuncia «pulsante» ma la tastiera non riesce a raggiungerlo.- Pulsanti personalizzati che rispondono a Invio ma non a Spazio.
- Pulsanti senza nome accessibile — i pulsanti con sola icona privi di
aria-labelsono il singolo errore più comune rilevato da axe-core.
Esempio
<!-- Preferito -->
<button type="button" aria-pressed="false">Mute</button>
<!-- Solo quando <button> è impossibile -->
<div
role="button"
tabindex="0"
aria-pressed="false"
onclick="toggleMute()"
onkeydown="if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); toggleMute(); }"
>
Mute
</div>