0Pricing
React Academy · Lezione

Gestione del focus e dei blocchi da tastiera nelle modali

Mantenere il focus all'interno delle modali aperte per l'accessibilità usando useRef e gli event listener.

Gestione del focus e dei blocchi da tastiera nelle modali è una lezione React Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento React Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso React Academy include 4 lezioni in totale.

Benvenuto

In questa lezione implementerà una trappola del focus all'interno di un modale, in modo che gli utenti della tastiera non possano uscire da un modale aperto premendo Tab: un requisito fondamentale di accessibilità (WCAG 2.4.3).

Perché sono necessarie le trappole del focus

Quando si apre un modale, gli utenti della tastiera dovrebbero poter interagire solo con il suo contenuto. Senza una trappola del focus, premendo Tab si sposta il focus sugli elementi dietro l'overlay del modale: questi elementi sono visivamente nascosti, ma rimangono raggiungibili.

Che cos'è una trappola del focus?

Una trappola del focus intercetta gli eventi dei tasti Tab e Shift+Tab e, quando il focus uscirebbe dal modale, lo riporta al primo o all'ultimo elemento focalizzabile al suo interno.

Individuazione degli elementi focalizzabili

Utilizzi querySelectorAll con un selettore che includa tutti gli elementi interattivi. Filtri quelli disabilitati e nascosti.
const FOCUSABLE = [
  'a[href]', 'button:not([disabled])',
  'input:not([disabled])', 'select', 'textarea',
  '[tabindex]:not([tabindex="-1"])'
].join(',');

const focusable = Array.from(
  modalRef.current.querySelectorAll(FOCUSABLE)
);

Implementazione della trappola

Ascolti l'evento keydown sul contenitore del modale. Premendo Tab, se il focus si trova sull'ultimo elemento, lo sposti sul primo. Premendo Shift+Tab, se il focus si trova sul primo, lo sposti sull'ultimo.
function handleTab(e) {
  const focusable = /* array of focusable elements */;
  const first = focusable[0];
  const last = focusable[focusable.length - 1];
  if (e.key !== 'Tab') return;
  if (e.shiftKey) {
    if (document.activeElement === first) {
      e.preventDefault(); last.focus();
    }
  } else {
    if (document.activeElement === last) {
      e.preventDefault(); first.focus();
    }
  }
}

Spostamento del focus all'apertura

Quando si apre il modale, sposti il focus sul primo elemento focalizzabile al suo interno (oppure sul contenitore del modale stesso con `tabIndex=-1`). In questo modo il focus non rimane sul pulsante che ha aperto il modale.
useEffect(() => {
  if (isOpen) {
    const first = modalRef.current?.querySelector(FOCUSABLE);
    first?.focus();
  }
}, [isOpen]);

Ripristino del focus alla chiusura

Quando il modale si chiude, riporti il focus sull'elemento che era attivo prima dell'apertura. Memorizzi un ref a `document.activeElement` nel momento in cui si apre il modale.
const previousFocus = useRef(null);

useEffect(() => {
  if (isOpen) {
    previousFocus.current = document.activeElement;
  } else {
    previousFocus.current?.focus();
  }
}, [isOpen]);

Utilizzo della libreria focus-trap-react

Per l'uso in produzione, prenda in considerazione la libreria **focus-trap-react**. Gestisce tutti i casi limite: Shadow DOM, iframe, elementi focalizzabili aggiunti dinamicamente e disattivazione con Escape.
import FocusTrap from 'focus-trap-react';

{isOpen && (
  <FocusTrap>
    <div role="dialog" aria-modal="true">
      {children}
    </div>
  </FocusTrap>
)}

Attributi ARIA per i modali

Aggiunga `role="dialog"` e `aria-modal="true"` al contenitore del modale. Aggiunga `aria-labelledby` facendo riferimento all'heading del modale. In questo modo comunica agli screen reader che il dialogo è un modale e consente di annunciarlo correttamente.
<div
  role="dialog"
  aria-modal="true"
  aria-labelledby="modal-title"
>
  <h2 id="modal-title">Confirm Delete</h2>
  ...
</div>

Attributo inert per lo sfondo

L'attributo HTML `inert` su un contenitore rimuove tutti i suoi elementi dall'ordine del focus e dall'accessibilità degli screen reader. Imposti `document.getElementById('root').inert = true` mentre il modale è aperto, per bloccare lo sfondo in modo efficace.
useEffect(() => {
  const root = document.getElementById('root');
  if (isOpen) root.setAttribute('inert', '');
  else root.removeAttribute('inert');
}, [isOpen]);

Verifica rapida

Che cosa dovrebbe accadere quando un utente della tastiera preme Tab sull'ultimo elemento focalizzabile all'interno di un modale con trappola del focus?

Riepilogo

Ha implementato una trappola del focus: individua gli elementi focalizzabili, intercetta Tab/Shift+Tab, sposta il focus all'apertura e lo ripristina alla chiusura. Utilizzi focus-trap-react in produzione e aggiunga role='dialog' e aria-modal per gli screen reader.

Prossimo argomento

Prossima lezione: **Tooltip e menu a discesa con i Portali**: eseguirà il rendering di tooltip e menu a discesa che escono dai contenitori con overflow-hidden utilizzando createPortal.

Domande Frequenti

La lezione «Gestione del focus e dei blocchi da tastiera nelle modali» è gratuita?

Sì — il testo completo di «Gestione del focus e dei blocchi da tastiera nelle modali» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso React Academy, passa a CoddyKit PRO. Il corso React Academy include 4 lezioni in totale.

Cosa imparerò in «Gestione del focus e dei blocchi da tastiera nelle modali»?

Mantenere il focus all'interno delle modali aperte per l'accessibilità usando useRef e gli event listener. Eserciti React Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare React Academy?

Non è richiesta alcuna esperienza precedente. React Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Gestione del focus e dei blocchi da tastiera nelle modali»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione React Academy?

Sì. Ogni lezione React Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Cosa sono i React Portal?
  2. Creazione di un componente modale con i Portal
  3. Gestione del focus e dei blocchi da tastiera nelle modali
  4. Tooltip e menu a discesa con i Portal
← Torna a React Academy