useLayoutEffect für Messungen vor Animationen
Verwenden Sie useLayoutEffect, um Elementabmessungen vor dem Start von Animationen zu messen und Layoutsprünge zu vermeiden.
useLayoutEffect für Messungen vor Animationen ist eine kostenlose React Academy-Lektion auf CoddyKit. Dies ist Lektion 3 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.
Das Flash-Problem
Manchmal springt oder flackert ein Element beim ersten Rendern sichtbar, bevor es seine endgültige Position einnimmt. Das geschieht normalerweise, wenn Sie ein Element messen oder neu positionieren, nachdem der Browser es bereits gezeichnet hat.
Der Nutzer sieht eine Frame lang die falsche Position und anschließend eine plötzliche Korrektur, wodurch die Oberfläche fehlerhaft wirkt.
Warum useEffect den Flash verursacht
useEffect wird ausgeführt, nachdem der Browser gezeichnet hat. Wenn Sie also in useEffect eine Messung auslesen und das DOM aktualisieren, hat der Nutzer den nicht korrigierten Frame bereits gesehen, bevor Ihre Änderung greift.
Für eine visuelle Positionierung, die für den Nutzer unsichtbar bleiben muss, kommt der Zeitpunkt nach dem Zeichnen zu spät.
useLayoutEffect wird vor dem Zeichnen ausgeführt
useLayoutEffect wird synchron ausgeführt, nachdem React das DOM verändert hat, aber bevor der Browser zeichnet. Jede DOM-Lese- oder Schreiboperation, die Sie dort ausführen, wird angewendet, bevor der Nutzer auch nur einen Frame sieht.
Damit ist dieser Hook das richtige Werkzeug für Messungen und Positionierungen, die sofort korrekt erscheinen müssen.
Die ursprüngliche Position messen
Innerhalb von useLayoutEffect können Sie mit ref.current.getBoundingClientRect() das Layout eines Elements auslesen, um seine Position und Größe vor der Animation zu erfassen.
Da dies vor dem Zeichnen geschieht, können Sie sowohl messen als auch eine Ausgangstransformation anwenden, ohne dass ein sichtbarer Flash entsteht.
Die FLIP-Technik
FLIP steht für First, Last, Invert, Play. Sie erfassen zunächst die First-Position des Elements, lassen es sich an seine Last-Position bewegen, invertieren die Bewegung anschließend, indem Sie eine Transformation anwenden, die es visuell wieder an die First-Position setzt, und starten schließlich die Wiedergabe, indem Sie die Transformation entfernen, sodass es zur Last-Position animiert.
So können Sie Layoutänderungen ausschließlich mit der kostengünstigen Eigenschaft transform animieren, obwohl sich das tatsächliche Layout sofort verändert hat.
getBoundingClientRect in useLayoutEffect
Die entscheidenden Messungen erfolgen in useLayoutEffect: Erfassen Sie das First-Rechteck vor der Änderung und das Last-Rechteck danach und berechnen Sie anschließend die Differenz. Da dies vor dem Zeichnen geschieht, ist die invertierende Transformation garantiert angewendet, bevor etwas angezeigt wird.
Die Differenz zwischen den beiden Rechtecken liefert Ihnen die exakte Verschiebung und Skalierung für die Invertierung.
Die Transformation synchron anwenden
Sie setzen die invertierende Transformation synchron in useLayoutEffect und entfernen sie im nächsten Frame, sodass das Element an seine natürliche Position animiert. Häufig lösen Sie diesen Wiedergabeschritt mit requestAnimationFrame aus.
Da die Invertierung vor dem Zeichnen angewendet wurde, sieht der Nutzer das Element nie an seiner unveränderten Last-Position.
Der SSR-Hinweis
Auf dem Server gibt es kein DOM. Daher protokolliert React eine Warnung, dass useLayoutEffect während des serverseitigen Renderns keine Wirkung hat. Layout-Effekte sind nur im Browser sinnvoll.
Diese Warnung weist darauf hin, dass der Effekt dort nicht ausgeführt werden kann, wo es nichts zu messen gibt.
SSR-sichere Alternative
Wenn eine Komponente auf dem Server ausgeführt werden muss, verwenden Sie useEffect zusammen mit requestAnimationFrame, um die Messung vor dem nächsten Zeichnen durchzuführen, oder verwenden Sie useLayoutEffect nur bedingt im Browser.
So vermeiden Sie die Warnung und erreichen bei nicht kritischen Animationen dennoch einen Zeitpunkt nahe am Zeichnen.
Beispiel: Akkordeon erweitern
Eine Höhenanimation ist ein klassischer Anwendungsfall: Messen Sie die eingeklappte und die ausgeklappte Höhe in useLayoutEffect und animieren Sie anschließend zwischen konkreten Pixelwerten, damit die Transition flüssig verläuft.
Da die Höhe auto nicht animierbar ist, können Sie durch vorheriges Messen der tatsächlichen Höhe zu einer konkreten Zahl übergehen.
Wann Sie useLayoutEffect verwenden sollten
Verwenden Sie standardmäßig useEffect für die meisten Aufgaben. Setzen Sie useLayoutEffect nur ein, wenn Sie das Layout auslesen und das DOM vor dem Zeichnen verändern müssen, um einen sichtbaren Flash zu vermeiden.
Eine übermäßige Verwendung kann die Leistung beeinträchtigen, da das Zeichnen blockiert wird, bis der Hook abgeschlossen ist.
Schnelltest
Testen Sie Ihr Verständnis des Zeitpunkts von Effekten.
Zusammenfassung
Sie haben gelernt, dass das Flash-Problem durch Messungen nach dem Zeichnen entsteht, dass useLayoutEffect vor dem Zeichnen ausgeführt wird und wie die FLIP-Technik Layoutänderungen mit kostengünstigen Transformationen animiert.
Außerdem haben Sie den SSR-Hinweis sowie eine Ausweichlösung mit useEffect und requestAnimationFrame kennengelernt.
Häufig gestellte Fragen
Ist die Lektion „useLayoutEffect für Messungen vor Animationen“ kostenlos?
Ja — der vollständige Text von „useLayoutEffect für Messungen vor Animationen“ 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 „useLayoutEffect für Messungen vor Animationen“?
Verwenden Sie useLayoutEffect, um Elementabmessungen vor dem Start von Animationen zu messen und Layoutsprünge zu vermeiden. 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 3 von 4.
Wie lange dauert die Lektion „useLayoutEffect für Messungen vor Animationen“?
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
- CSS-Transitions bei Änderungen des React-Status
- CSS-Keyframe-Animationen mit React
- useLayoutEffect für Messungen vor Animationen
- Ein- und Austrittsanimationen ohne Bibliothek