Element.getBoundingClientRect()

Renvoie la taille d’un élément et sa position par rapport à la zone visible de la fenêtre, sous la forme d’un objet DOMRect.

Renvoie
Un objet DOMRect avec les propriétés x, y, width, height, top, right, bottom et left (en pixels CSS).
Sur cette page

Exemple

#
JavaScript
const card = document.querySelector('#card')

requestAnimationFrame(() => {
  const rect = card.getBoundingClientRect()

  console.log(Math.round(rect.width), Math.round(rect.height))
  console.log(Math.round(rect.left), Math.round(rect.top))
  console.log(Math.round(rect.right), Math.round(rect.bottom))
})
Console
240 80
36 16
276 96

La largeur comprend le remplissage et la bordure, car dans l’aperçu les éléments ont box-sizing: border-box. Le left égal à 36 correspond aux 16 px d’espacement de la page et aux 20 px de marge de la carte, et right est toujours égal à left + width. La mesure attend la première image (requestAnimationFrame()), car le cadre de l’exemple reçoit sa taille un instant après le démarrage du script. Sur une page normale, déjà affichée, vous pouvez mesurer immédiatement.

Définition et utilisation

#

La méthode getBoundingClientRect() mesure l’élément tel qu’il apparaît à l’écran. Elle renvoie un objet DOMRect avec les propriétés width et height (la taille) ainsi que top, right, bottom et left (la position des bords). Il y a aussi x et y, qui pour les éléments équivalent à left et top.

La position est calculée par rapport à la zone visible de la fenêtre (le viewport), pas au début du document. Quand vous faites défiler la page vers le bas, le top de l’élément diminue, et pour les éléments au-dessus de l’écran, il devient négatif. Vous obtenez la position par rapport à toute la page en ajoutant le défilement : rect.top + window.scrollY. Ce sont les mêmes coordonnées qu’utilise position: fixed, ce qui permet de placer facilement à côté de l’élément, par exemple, une bulle d’aide.

La taille comprend le remplissage (padding) et la bordure, c’est-à-dire toute la surface occupée par l’élément. Elle tient aussi compte des transformations CSS : transform: scale(2) double la largeur renvoyée. Les valeurs sont parfois décimales, par ex. lors d’un zoom de la page, c’est pourquoi il vaut la peine de les arrondir avant de les comparer. La lecture peut aussi forcer le navigateur à recalculer immédiatement la mise en page si des styles ont changé juste avant.

Syntaxe

#
Syntaxe
element.getBoundingClientRect()

Plus d’exemples

#
Les transformations CSS changent le résultat
JavaScript
const badge = document.querySelector('#badge')

requestAnimationFrame(() => {
  console.log(badge.offsetWidth)
  console.log(Math.round(badge.getBoundingClientRect().width))
})
Console
100
150

offsetWidth donne la largeur d’après la mise en page et ignore transform. getBoundingClientRect() mesure l’élément après l’agrandissement, donc tel qu’il apparaît à l’écran.

Une bulle d’aide sous un bouton
JavaScript
const help = document.querySelector('#help')
const tooltip = document.querySelector('#tooltip')

help.addEventListener('click', () => {
  const rect = help.getBoundingClientRect()
  tooltip.style.left = `${Math.round(rect.left)}px`
  tooltip.style.top = `${Math.round(rect.bottom + 8)}px`
  tooltip.hidden = false
  console.log(tooltip.style.left, tooltip.style.top)
})

requestAnimationFrame(() => help.click())
Console
56px 60px

Les coordonnées de getBoundingClientRect() et celles de position: fixed sont calculées depuis le même point, le coin supérieur gauche de la zone visible. La bulle atterrit donc 8 px sous le bord inférieur du bouton. Nous simulons le clic à la première image, quand le cadre de l’aperçu a déjà sa taille.

Compatibilité des navigateurs

#

Largement disponible

Fonctionne dans tous les navigateurs modernes, y compris sur mobile. Vous pouvez l’utiliser sans crainte.

  • Chrome
  • Edge
  • Firefox
  • Safari

Bonnes pratiques

#
  • Les coordonnées changent avec le défilement, car elles sont calculées depuis la zone visible de la fenêtre. La position sur la page est rect.top + window.scrollY.
  • Arrondissez les résultats avec Math.round() avant de les comparer ou de les afficher. Les valeurs sont parfois décimales en cas de zoom de la page.
  • Un élément masqué par display: none, ou pas encore inséré dans le document, a toutes ses dimensions à 0. Mesurez-le seulement une fois qu’il est affiché.

Entrées associées

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.