Mesurer les éléments du DOM avec useLayoutEffect
Lisez les dimensions, positions et décalages de défilement des éléments après la mise en page, mais avant la peinture, pour éviter les scintillements
Mesurer les éléments du DOM avec useLayoutEffect est une leçon React Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage React Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours React Academy comprend 4 leçons au total.
Présentation de getBoundingClientRect
element.getBoundingClientRect() renvoie un objet DOMRect contenant la taille et la position de l’élément par rapport à la zone d’affichage : top, right, bottom, left, width et height. Cette méthode force le navigateur à effectuer un calcul de mise en page pour renvoyer des valeurs exactes : appelez-la donc avec parcimonie.
Le problème de la lecture dans useEffect
Si vous lisez getBoundingClientRect() dans un useEffect, le navigateur a déjà effectué la peinture. Si vous mettez ensuite à jour l’état à partir de la mesure, React effectue un nouveau rendu et le navigateur peint à nouveau. Les utilisateurs peuvent voir brièvement l’élément dans une position ou une taille incorrecte avant l’affichage de la correction lors de la seconde peinture.
Pourquoi useLayoutEffect résout ce problème
La lecture des mesures dans useLayoutEffect s’effectue après les mutations du DOM, mais avant la peinture. Toute mise à jour d’état déclenchée par la mesure amène React à effectuer un nouveau rendu synchrone et à valider le DOM corrigé, le tout avant que le navigateur n’ait rien peint. L’utilisateur ne voit que le résultat final correct, au cours d’un seul cycle de peinture.
Positionnement d’une info-bulle
Une info-bulle doit apparaître près de son élément déclencheur. Mesurez la position de l’élément déclencheur dans useLayoutEffect à l’aide de getBoundingClientRect(), calculez la position absolue de l’info-bulle et enregistrez cette position dans l’état. L’info-bulle s’affiche au bon endroit dès la toute première peinture, sans saut visible depuis une position initiale incorrecte.
Animation d’un élément : lecture de la taille initiale
Pour animer un élément depuis sa taille naturelle, sans contrainte, jusqu’à une taille fixe, vous devez connaître sa taille naturelle avant d’appliquer la contrainte. Lisez la hauteur de l’élément dans useLayoutEffect avant l’application de tout style d’animation, stockez-la dans l’état, puis utilisez-la comme valeur d’image clé de départ pour votre transition CSS.
Hauteur d’un en-tête fixe
Lorsqu’une page possède un en-tête fixe, le contenu principal doit avoir une marge intérieure supérieure égale à la hauteur de l’en-tête afin de ne pas être masqué derrière celui-ci. Mesurez la hauteur de l’en-tête dans useLayoutEffect à l’aide d’une référence : headerRef.current.getBoundingClientRect().height. Définissez cette valeur comme paddingTop sur le conteneur de contenu. La mise en page est correcte dès le premier rendu.
Une mise à jour d’état provoque un nouveau rendu synchrone
Lorsque vous appelez setState dans useLayoutEffect, React exécute immédiatement un autre cycle de rendu et de validation dans le même bloc synchrone. Ce nouveau rendu exécute également son useLayoutEffect. Veillez à ne pas créer de boucle infinie : ne mettez à jour l’état que si la nouvelle mesure diffère de la valeur actuelle de l’état.
SSR : les mesures renvoient zéro
Sur le serveur, les éléments du DOM n’existent pas : getBoundingClientRect() provoquerait une erreur ou renverrait des zéros. Protégez votre useLayoutEffect avec une vérification : if (typeof window === 'undefined') return;. Pour les applications SSR, vous devrez peut-être hydrater la page avec une taille d’espace réservé, puis mesurer après l’hydratation côté client.
ResizeObserver pour un suivi continu
Une mesure ponctuelle avec useLayoutEffect vous donne la taille au moment du montage. Pour suivre les changements de taille lorsque l’élément est redimensionné, à cause d’un redimensionnement de la fenêtre, d’un contenu dynamique ou de modifications CSS, utilisez plutôt ResizeObserver. Il exécute une fonction de rappel chaque fois que la taille de l’élément change, ce qui le rend plus adapté aux composants adaptatifs.
Éviter les mesures redondantes
Si plusieurs effets ont besoin de la même mesure, calculez-la une seule fois et partagez-la via un contexte ou en la transmettant sous forme de propriétés. Calculer plusieurs fois la même valeur de getBoundingClientRect() dans plusieurs appels à useLayoutEffect déclenche plusieurs lectures synchrones de la mise en page, chacune étant relativement coûteuse. Regroupez les mesures lorsque c’est possible.
Moment d’exécution des références avec useLayoutEffect
Les références sont renseignées avant l’exécution des effets. Lorsque useLayoutEffect s’exécute, il est garanti que ref.current pointe vers l’élément du DOM. C’est pourquoi ce modèle fonctionne : useLayoutEffect(() => { const rect = ref.current.getBoundingClientRect(); ... }, []). La référence n’est jamais nulle dans un effet de mise en page d’un composant monté.
Moment d’exécution de getBoundingClientRect
Pourquoi vaut-il mieux appeler getBoundingClientRect() dans useLayoutEffect plutôt que dans useEffect ?
Récapitulatif de la leçon : mesurer les éléments du DOM
Utilisez getBoundingClientRect() dans useLayoutEffect pour lire les mesures du DOM après les mutations, mais avant la peinture. Les mises à jour d’état issues de ces mesures provoquent un nouveau rendu synchrone inclus dans le même cycle de peinture, ce qui empêche les clignotements. Protégez le code contre SSR avec une vérification typeof window. Pour suivre continuellement la taille, préférez ResizeObserver.
Questions Fréquemment Posées
La leçon « Mesurer les éléments du DOM avec useLayoutEffect » est-elle gratuite ?
Oui — le texte complet de « Mesurer les éléments du DOM avec useLayoutEffect » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours React Academy, passe à CoddyKit PRO. Le cours React Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Mesurer les éléments du DOM avec useLayoutEffect » ?
Lisez les dimensions, positions et décalages de défilement des éléments après la mise en page, mais avant la peinture, pour éviter les scintillements Tu pratiques React Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer React Academy ?
Aucune expérience préalable n'est requise. React Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Mesurer les éléments du DOM avec useLayoutEffect » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon React Academy ?
Oui. Chaque leçon React Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Phase de rendu et validation du DOM
- Quand useLayoutEffect s’exécute par rapport à useEffect
- Mesurer les éléments du DOM avec useLayoutEffect
- Éviter les recalculs de mise en page et les scintillements