Controlla lo stato attivo con tabindex

Gli elementi HTML standard come <button> o <input> hanno un'accessibilità da tastiera integrata e devono essere utilizzati quando possibile. Tuttavia, se devi creare elementi interattivi personalizzati, puoi creare il comportamento utente previsto aggiungendo tabindex.

Browser Support

  • Chrome: 1.
  • Edge: 12.
  • Firefox: 1.5.
  • Safari: 3.1.

Source

Aggiungi tabindex solo ai contenuti interattivi. Anche se i contenuti sono importanti, ad esempio un'immagine chiave, gli utenti di screen reader possono comprenderli senza aggiungere il focus.

Che cos'è tabindex?

Se devi modificare l'ordine di tabulazione predefinito fornito dagli elementi integrati, puoi utilizzare l'attributo HTML tabindex per impostare in modo esplicito la posizione di tabulazione di un elemento.

tabindex può essere applicato a qualsiasi elemento, anche se deve essere applicato solo a elementi interattivi e accetta una gamma di valori interi. Con tabindex, puoi specificare un ordine esplicito per gli elementi della pagina su cui è possibile spostare lo stato attivo, inserire un elemento altrimenti non selezionabile nell'ordine di tabulazione e rimuovere elementi dall'ordine di tabulazione. Ad esempio:

tabindex="0": inserisce un elemento nell'ordine di tabulazione naturale. L'elemento può essere selezionato premendo Tab e chiamando il relativo metodo focus().

tabindex="-1": rimuove un elemento dall'ordine di tabulazione naturale, ma l'elemento può comunque essere selezionato chiamando il relativo metodo focus()

tabindex="5": Qualsiasi valore di tabindex maggiore di 0 porta l'elemento in primo piano dell'ordine di tabulazione naturale. Se sono presenti più elementi con un valore tabindex maggiore di 0, l'ordine di tabulazione inizia dal valore più basso maggiore di zero e procede in ordine crescente. L'utilizzo di un tabindex maggiore di 0 è considerato un anti-pattern.

Assicurati che i controlli siano accessibili da tastiera

Uno strumento come Lighthouse è ottimo per rilevare automaticamente determinati problemi di accessibilità, ma alcuni test devono comunque essere eseguiti manualmente da una persona.

Prova a premere il tasto Tab per navigare nel sito. Riesci a raggiungere tutti i controlli interattivi della pagina? In caso contrario, potresti dover utilizzare tabindex per migliorare la messa a fuoco di questi controlli.

Gestire lo stato attivo a livello di pagina

A volte, tabindex contribuisce a creare un'esperienza utente fluida. Ad esempio, se crei una pagina singola robusta con diverse sezioni di contenuti, in cui alcuni contenuti sono nascosti in diversi punti del caricamento della pagina. Ciò potrebbe significare che i link di navigazione modificano i contenuti visibili senza aggiornare la pagina.

In questo caso, identifica l'area dei contenuti selezionata e assegnale un tabindex di -1 e chiama il suo metodo focus. In questo modo, i contenuti non vengono visualizzati nell'ordine naturale delle schede. Questa tecnica, chiamata gestione della selezione, mantiene il contesto percepito dall'utente sincronizzato con i contenuti visivi del sito.

Gestire lo stato attivo nei componenti

In alcuni casi, devi anche gestire lo stato attivo a livello di controllo, ad esempio con Custom Elements.

Può essere difficile sapere quali comportamenti della tastiera implementare. La guida Accessible Rich Internet Applications (ARIA) Authoring Practices elenca i tipi di componenti e i tipi di azioni da tastiera che supportano.

Inserire un elemento nell'ordine di tabulazione

Inserisci un elemento nell'ordine di tabulazione naturale utilizzando tabindex="0". Ad esempio:

<div tabindex="0">Focus me with the TAB key</div>

Per selezionare un elemento, premi il tasto Tab o chiama il metodo focus() dell'elemento.

Rimuovere un elemento dall'ordine di tabulazione

Rimuovi un elemento utilizzando tabindex="-1". Ad esempio:

<button tabindex="-1">Can't reach me with the TAB key!</button>

In questo modo un elemento viene rimosso dall'ordine di tabulazione naturale, ma può comunque essere selezionato chiamando il relativo metodo focus().

L'applicazione di tabindex="-1" a un elemento non influisce sui relativi elementi secondari; se si trovano nell'ordine di tabulazione in modo naturale o a causa di un valore tabindex, rimarranno nell'ordine di tabulazione. Per rimuovere un elemento e tutti i relativi elementi secondari dall'ordine di tabulazione, valuta la possibilità di utilizzare il polyfill inert di WICG. Il polyfill emula il comportamento di un attributo inert proposto, che impedisce la selezione o la lettura degli elementi da parte delle tecnologie per la disabilità.

Evita tabindex > 0

Qualsiasi valore tabindex maggiore di 0 porta l'elemento all'inizio dell'ordine naturale delle schede. Se sono presenti più elementi con un valore tabindex maggiore di 0, l'ordine delle schede inizia dal valore più basso maggiore di zero e procede in ordine crescente.

L'utilizzo di un tabindex maggiore di 0 è considerato un anti-pattern perché gli screen reader navigano nella pagina in ordine DOM, non in ordine di tabulazione. Se vuoi che un elemento venga visualizzato prima nell'ordine di tabulazione, devi spostarlo in una posizione precedente nel DOM.

Con Lighthouse, puoi identificare gli elementi con un valore tabindex > 0. Esegui il controllo dell'accessibilità (Lighthouse > Opzioni > Accessibilità) e cerca i risultati del controllo "Nessun elemento ha un valore [tabindex] maggiore di 0".

Utilizzare "tabindex mobile"

Se stai creando un componente complesso, potresti dover aggiungere un supporto della tastiera aggiuntivo oltre alla messa a fuoco. Se possibile, utilizza l'elemento select integrato. È focalizzabile e consente di utilizzare i tasti freccia per visualizzare altre opzioni selezionabili.

Per implementare funzioni simili nei tuoi componenti, puoi utilizzare una tecnica nota come "tabindex mobile". Il tabindex mobile funziona impostando tabindex su -1 per tutti i figli tranne quello attualmente attivo. Il componente utilizza quindi un listener di eventi della tastiera per determinare quale tasto ha premuto l'utente.

Quando ciò accade, il componente imposta tabindex del figlio su cui era stato precedentemente impostato lo stato attivo su -1, imposta tabindex del figlio su cui verrà impostato lo stato attivo su 0 e chiama il metodo focus().

Prima

<div role="toolbar">
  <button tabindex="-1">Undo</button>
  <button tabindex="0">Redo</button>
  <button tabindex="-1">Cut</button>
</div>

Dopo

<div role="toolbar">
  <button tabindex="-1">Undo</button>
  <button tabindex="-1">Redo</button>
  <button tabindex="0">Cut</button>
</div>

Ricette di accesso da tastiera

Se non sai con certezza quale livello di supporto della tastiera potrebbero richiedere i tuoi componenti personalizzati, puoi consultare le ARIA Authoring Practices 1.1. Questa guida elenca i pattern comuni dell'interfaccia utente e identifica i tasti che i tuoi componenti devono supportare.