0Pricing
React Academy · Lektion

Tooltips und Dropdown-Menüs mit Portals

Verwenden Sie Portals, um Tooltips und Dropdowns außerhalb von overflow-hidden-Containern zu rendern.

Tooltips und Dropdown-Menüs mit Portals ist eine kostenlose React Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des React Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der React Academy-Kurs umfasst insgesamt 4 Lektionen.

Willkommen

In dieser Lektion erstellen Sie Tooltip- und Dropdown-Komponenten, die mithilfe von React Portals in document.body gerendert werden und dabei Einschränkungen durch overflow-hidden und z-index-Stacking-Contexts übergeordneter Elemente umgehen.

Das Overflow-Problem

Ein relativ zu seiner Auslöseschaltfläche positionierter Tooltip wird abgeschnitten, wenn ein übergeordnetes Element `overflow: hidden` oder `overflow: scroll` verwendet. Wenn Sie den Tooltip mithilfe eines Portals nach document.body verschieben, wird dieses Problem vollständig gelöst.

Positionierungsstrategie

Um einen per Portal gerenderten Tooltip korrekt zu positionieren, messen Sie mit `getBoundingClientRect()` das umgebende Rechteck des Auslöserelements und berechnen Sie absolute Koordinaten, die die Scrollposition berücksichtigen.
const rect = triggerRef.current.getBoundingClientRect();
const top = rect.bottom + window.scrollY + 8;
const left = rect.left + window.scrollX;

Tooltip-Komponente

Erstellen Sie einen Tooltip, der seine children umschließt, eine Ref an den Auslöser anfügt und bei Mouseover ein positioniertes Tooltip-Fenster per Portal rendert.
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>
  );
}

Position beim Scrollen und Ändern der Fenstergröße aktualisieren

Wenn der Nutzer scrollt, während ein Tooltip sichtbar ist, wird dessen Position veraltet. Hören Sie auf `scroll`- und `resize`-Ereignisse, um die Position neu zu berechnen oder den Tooltip zu schließen.
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]);

Architektur eines Dropdown-Menüs

Ein Dropdown-Menü folgt demselben Muster wie ein Tooltip. Die Auslöseschaltfläche blendet das Menü ein oder aus, das Menü wird per Portal gerendert, und ein Handler für Klicks außerhalb schließt es.

Handler für Klicks außerhalb

Verwenden Sie einen `mousedown`-Listener auf `document`, um Klicks außerhalb des Menüs zu erkennen. Vergleichen Sie das Klickziel mit den Refs des Menüs und des Auslösers, um zu entscheiden, ob das Menü geschlossen werden soll.
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]);

Tastaturnavigation in Dropdowns

Implementieren Sie ArrowDown/ArrowUp, um zwischen Menüelementen zu wechseln, Enter zur Auswahl und Escape zum Schließen. Speichern Sie den Index des fokussierten Elements im State und rufen Sie programmgesteuert `.focus()` für die Menüelemente auf.

Eine Positionierungsbibliothek verwenden

Verwenden Sie für den Produktionseinsatz **@floating-ui/react** (früher Popper.js). Die Bibliothek behandelt flip (Neupositionierung in der Nähe von Viewport-Rändern), shift (Sichtbarkeit des Tooltips sicherstellen) und die Pfeilpositionierung automatisch.
import { useFloating, flip, shift } from '@floating-ui/react';

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

Barrierefreiheit: ARIA für Tooltips

Fügen Sie dem Tooltip-Element `role='tooltip'` hinzu und verweisen Sie mit `aria-describedby` am Auslöser auf die ID des Tooltips. Dadurch können Screenreader den Inhalt des Tooltips ausgeben.
<button aria-describedby="tip1">Hover me</button>
{visible && createPortal(
  <div id="tip1" role="tooltip">Helpful text</div>,
  document.body
)}

Schnelltest

Wie berechnen Sie die korrekte Bildschirmposition für einen per Portal gerenderten Tooltip?

Zusammenfassung

Portale ermöglichen es Tooltips und Dropdown-Menüs, ihre Eltern mit overflow-hidden zu verlassen. Messen Sie das Trigger-Element mit getBoundingClientRect, addieren Sie Scroll-Offsets für die absolute Positionierung, schließen Sie bei Klicks außerhalb und beim Scrollen und ergänzen Sie ARIA-Attribute für die Barrierefreiheit.

Kurs abgeschlossen

Herzlichen Glückwunsch! Sie haben **Portals & Modals in React** abgeschlossen. Sie können nun barrierefreie und korrekt positionierte Modals, Tooltips und Dropdown-Menüs erstellen, die alle CSS-Stacking-Einschränkungen umgehen.

Häufig gestellte Fragen

Ist die Lektion „Tooltips und Dropdown-Menüs mit Portals“ kostenlos?

Ja — der vollständige Text von „Tooltips und Dropdown-Menüs mit Portals“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des React Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der React Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Tooltips und Dropdown-Menüs mit Portals“?

Verwenden Sie Portals, um Tooltips und Dropdowns außerhalb von overflow-hidden-Containern zu rendern. Du übst React Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um React Academy zu starten?

Keine Vorkenntnisse erforderlich. React Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Tooltips und Dropdown-Menüs mit Portals“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser React Academy-Lektion Code schreiben und ausführen?

Ja. Jede React Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Was sind React-Portals?
  2. Eine Modal-Komponente mit Portals erstellen
  3. Fokus und Tastaturfallen in Modals verwalten
  4. Tooltips und Dropdown-Menüs mit Portals
← Zurück zu React Academy