Percorso del tasto Tab
Premi Tab su una pagina web e il focus salta al link, pulsante o campo successivo. Questo controllo scrive l’intero percorso per qualsiasi indirizzo e indica i controlli rimasti fuori.
Il focus è il cursore della tastiera
Un mouse può puntare ovunque. Una tastiera può stare «su» un solo elemento alla volta, e quella posizione si chiama focus. Tab lo sposta avanti, Maiusc+Tab lo riporta indietro, Invio segue un link, Spazio preme un pulsante. Chi ha tremori o movimenti limitati delle mani si muove così. Lo stesso vale per chi usa uno screen reader, un sensore a pulsante o il controllo vocale, e per chiunque compili moduli in fretta.
Il browser stabilisce cosa può ricevere il focus solo dall’HTML. Link con un href, pulsanti, campi dei moduli, <summary>, lettori multimediali con controlli e frame sono sul percorso per impostazione predefinita, nell’ordine in cui compaiono nel sorgente. Tutto il resto viene saltato, a meno che un attributo tabindex non dica altrimenti.
I tre significati di tabindex
| Valore | Effetto | Quando usarlo |
|---|---|---|
tabindex="0" | Aggiunge l’elemento al percorso nella sua posizione naturale | Controlli personalizzati che non possono essere un <button> nativo |
tabindex="-1" | Lo toglie dal percorso; gli script possono ancora dargli il focus | Schede inattive, voci di menu raggiunte con le frecce, slide di carosello fuori schermo |
tabindex="1" o più | Lo mette davanti a tutto il resto, numero più basso per primo | Quasi mai. Il focus salta qua e là sullo schermo |
Il percorso segue queste regole alla lettera: prima i valori positivi in ordine crescente, poi l’ordine del sorgente. Un gruppo di pulsanti di opzione con lo stesso name conta come una sola fermata, perché dentro il gruppo ci si muove con le frecce. Controlli disattivati, elementi <dialog> chiusi, aree inert o hidden e il contenuto dei <details> chiusi restano fuori.
Cosa segnala il controllo
- Elementi cliccabili che la tastiera non raggiunge
- Un
<div onclick>o un elemento conrole="button"e senzatabindex. Chi usa il mouse può premerlo, chi usa la tastiera non riesce nemmeno ad arrivarci. Sostituiscilo con<button type="button">, che porta con sé focus, Invio e Spazio gratis. - Link senza
href - Per il browser, un
<a>senza destinazione è testo semplice, e Tab ci passa sopra. - Controlli con
tabindex="-1" - Segnalati, a meno che il link non duplichi un altro link raggiungibile verso lo stesso indirizzo, o non faccia parte di un elenco di schede, un menu, una barra degli strumenti o un gruppo simile dove subentrano le frecce.
- Skip link
- Il controllo cerca nelle prime tre fermate un link a un’ancora della stessa pagina, come
<a href="#content">Vai al contenuto</a>, e conferma che l’iddi destinazione esista. Conta anche quante pressioni servono per andare dall’inizio della pagina al<main>. Con cinque o meno, uno skip link mancante viene solo annotato a titolo informativo. - Contorno del focus
- Cerchiamo nei blocchi
<style>della pagina, negli stili inline e in un massimo di cinque fogli di stile dello stesso sito regole comea:focus { outline: none }o* { outline: 0 }. Se niente sostituisce il contorno con stili:focus-visibleo:focus, il risultato è rosso, perché chi usa la tastiera non vede dove si trova. - Altre fermate da guardare
- Elementi focalizzabili dentro
aria-hidden="true", fermate senza nome accessibile, frame senzatitlee link a#ojavascript:che fanno da pulsanti.
Riportare un focus visibile
I designer spesso tolgono il contorno perché compare dopo un clic del mouse e lo trovano brutto. Il selettore :focus-visible chiude la discussione. Corrisponde solo quando il browser ritiene che l’utente abbia bisogno di vedere il focus, cioè in pratica quando usa la tastiera.
:focus-visible {
outline: 3px solid #1a5fb4;
outline-offset: 2px;
}Le WCAG 2.2 chiedono un indicatore con un contrasto di almeno 3:1 rispetto ai colori circostanti. Lo schema :focus:not(:focus-visible) { outline: none } è sicuro e non viene segnalato.
Limiti di una lettura statica
Il percorso è calcolato dall’HTML che riceve il nostro server. I gestori di clic collegati in JavaScript con addEventListener non lasciano traccia nel markup, quindi un <div> collegato così passa inosservato. Anche i menu costruiti da script qui sono invisibili, e così le trappole da tastiera, in cui il focus entra in un widget e non riesce più a uscire. I fogli di stile su un altro dominio, o oltre il quinto, non vengono letti.
Concludi con la prova vera, che richiede due minuti. Metti da parte il mouse, carica la pagina e premi Tab fino ad arrivare al footer. Devi sempre vedere dove ti trovi, e devi poter aprire ogni menu e inviare ogni modulo.
Domande frequenti
Come testo da solo la navigazione da tastiera?
Fai clic nella barra degli indirizzi, poi premi Tab più volte. Maiusc+Tab torna indietro, Invio agisce sui link, Spazio su pulsanti e caselle di controllo, le frecce dentro i gruppi di opzioni e i menu, ed Esc chiude le finestre di dialogo. In Safari su macOS, attiva prima «Premi Tab per evidenziare ogni elemento di una pagina web» nelle impostazioni Avanzate.
tabindex="0" su un div basta per farne un pulsante?
No. Rende l’elemento focalizzabile, ma Invio e Spazio non fanno nulla finché non aggiungi i gestori dei tasti, e uno screen reader non lo chiamerà pulsante senza role="button". Un <button> nativo ti dà tutte e tre le cose.
Mi serve uno skip link se la pagina ha un elemento main?
Sì, per chi vede e usa la tastiera. Gli screen reader possono saltare al landmark <main> con una scorciatoia. Chi usa solo il tasto Tab non ha questa scorciatoia e deve passare per ogni voce di menu, a meno che tu non offra uno skip link.
Perché l’ordine di Tab non corrisponde a quello che vedo a schermo?
Tab segue l’ordine del sorgente HTML, non l’impaginazione visiva. CSS come order, flex-direction: row-reverse, il posizionamento nella griglia o il posizionamento assoluto possono spostare gli elementi a schermo senza cambiare il loro posto nel sorgente. Un tabindex positivo ha lo stesso effetto.
outline: none è sempre un errore di accessibilità?
Solo quando niente lo sostituisce. Una regola che toglie il contorno e imposta un bordo, uno sfondo o un’ombra visibili al focus nello stesso blocco va bene, e questo controllo la conta come sostituzione.