0Pricing
React Academy · Lezione

Tooltip e menu a discesa con i Portal

Usare i Portal per renderizzare tooltip e menu a discesa al di fuori dei contenitori overflow-hidden.

Tooltip e menu a discesa con i Portal è una lezione React Academy gratuita su CoddyKit. Questa è la lezione 4 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 creerà componenti tooltip e menu a discesa che utilizzano i Portali React per eseguire il rendering in document.body, aggirando i vincoli di overflow-hidden del genitore e del contesto di impilamento z-index.

Il problema dell'overflow

Un tooltip posizionato rispetto al pulsante che lo attiva viene ritagliato se un antenato ha `overflow: hidden` o `overflow: scroll`. Spostare il tooltip in document.body tramite un Portale risolve completamente il problema.

Strategia di posizionamento

Per posizionare correttamente un tooltip renderizzato tramite Portale, misuri il rettangolo delimitatore dell'elemento attivatore con `getBoundingClientRect()` e calcoli coordinate assolute che tengano conto della posizione di scorrimento.
const rect = triggerRef.current.getBoundingClientRect();
const top = rect.bottom + window.scrollY + 8;
const left = rect.left + window.scrollX;

Componente Tooltip

Crei un Tooltip che avvolga i suoi children, colleghi un ref all'elemento attivatore ed esegua il rendering tramite Portale di un riquadro tooltip posizionato quando l'utente passa il mouse sopra di esso.
function Tooltip({ content, children }) {
  const [visible, setVisible] = useState(false);
  const [pos, setPos] = useState({ top: 0, left: 0 });
  const ref = useRef();

  const show = () => {
    const r = ref.current.getBoundingClientRect();
    setPos({ top: r.bottom + window.scrollY + 4,
             left: r.left + window.scrollX });
    setVisible(true);
  };

  return (
    <span ref={ref} onMouseEnter={show} onMouseLeave={() => setVisible(false)}>
      {children}
      {visible && createPortal(
        <div style={{ position:'absolute', top: pos.top, left: pos.left }}
             className="tooltip">{content}</div>,
        document.body
      )}
    </span>
  );
}

Aggiornamento della posizione durante lo scorrimento e il ridimensionamento

Se l'utente scorre la pagina mentre un tooltip è visibile, la sua posizione diventa obsoleta. Ascolti gli eventi `scroll` e `resize` per ricalcolare la posizione o chiudere il tooltip.
useEffect(() => {
  if (!visible) return;
  const update = () => setVisible(false);
  window.addEventListener('scroll', update, true);
  window.addEventListener('resize', update);
  return () => {
    window.removeEventListener('scroll', update, true);
    window.removeEventListener('resize', update);
  };
}, [visible]);

Architettura dei menu a discesa

Un menu a discesa segue lo stesso pattern di un tooltip. Il pulsante attivatore mostra o nasconde il menu, il menu viene renderizzato tramite un Portale e un gestore dei clic esterni lo chiude.

Gestore dei clic esterni

Utilizzi un listener `mousedown` su `document` per rilevare i clic al di fuori del menu. Confronti il target del clic con i ref del menu e dell'elemento attivatore per decidere se chiudere il menu.
useEffect(() => {
  if (!open) return;
  const handler = (e) => {
    if (!menuRef.current?.contains(e.target) &&
        !triggerRef.current?.contains(e.target)) {
      setOpen(false);
    }
  };
  document.addEventListener('mousedown', handler);
  return () => document.removeEventListener('mousedown', handler);
}, [open]);

Navigazione da tastiera nei menu a discesa

Implementi ArrowDown/ArrowUp per spostarsi tra gli elementi del menu, Enter per selezionare ed Escape per chiudere. Tenga traccia dell'indice focalizzato nello stato e chiami programmaticamente `.focus()` sugli elementi del menu.

Utilizzo di una libreria di posizionamento

In produzione, utilizzi **@floating-ui/react** (in precedenza Popper.js). Gestisce automaticamente il flip (riposizionamento vicino ai bordi della finestra), lo shift (mantenimento del tooltip visibile) e il posizionamento della freccia.
import { useFloating, flip, shift } from '@floating-ui/react';

const { refs, floatingStyles } = useFloating({
  middleware: [flip(), shift()],
});

Accessibilità: ARIA per i tooltip

Per i tooltip, aggiunga `role='tooltip'` all'elemento tooltip e `aria-describedby`, che faccia riferimento all'id del tooltip, all'elemento attivatore. In questo modo gli screen reader possono annunciare il contenuto del tooltip.
<button aria-describedby="tip1">Hover me</button>
{visible && createPortal(
  <div id="tip1" role="tooltip">Helpful text</div>,
  document.body
)}

Verifica rapida

Come si calcola la posizione corretta sullo schermo per un tooltip renderizzato tramite Portale?

Riepilogo

I portali consentono a tooltip e menu a discesa di uscire dai contenitori con overflow-hidden. Misuri il trigger con getBoundingClientRect, aggiunga gli offset di scorrimento per il posizionamento assoluto, chiuda al clic esterno e durante lo scorrimento e aggiunga attributi ARIA per l'accessibilità.

Corso completato

Congratulazioni! Ha completato **Portali e modali in React**. Ora è in grado di creare modali, tooltip e menu a discesa accessibili e posizionati correttamente, che non sono vincolati dalle limitazioni CSS dello stacking.

Domande Frequenti

La lezione «Tooltip e menu a discesa con i Portal» è gratuita?

Sì — il testo completo di «Tooltip e menu a discesa con i Portal» è 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 «Tooltip e menu a discesa con i Portal»?

Usare i Portal per renderizzare tooltip e menu a discesa al di fuori dei contenitori overflow-hidden. 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 4 di 4.

Quanto tempo richiede la lezione «Tooltip e menu a discesa con i Portal»?

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