JavaScriptDOM i zdarzenia

Element.getBoundingClientRect()

Zwraca rozmiar elementu i jego położenie względem widocznego obszaru okna w postaci obiektu DOMRect.

Zwraca
Obiekt DOMRect z właściwościami x, y, width, height, top, right, bottom i left (w pikselach CSS).
Na tej stronie

Przykład

#
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))
})
Konsola
240 80
36 16
276 96

Szerokość obejmuje dopełnienie i ramkę, bo w podglądzie elementy mają box-sizing: border-box. left równe 36 to 16 px odstępu strony i 20 px marginesu karty, a right to zawsze left + width. Pomiar czeka na pierwszą klatkę (requestAnimationFrame()), bo ramka z przykładem dostaje swój rozmiar chwilę po starcie skryptu. Na zwykłej, wyświetlonej już stronie możesz mierzyć od razu.

Definicja i zastosowanie

#

Metoda getBoundingClientRect() mierzy element tak, jak widać go na ekranie. Zwraca obiekt DOMRect z właściwościami width i height (rozmiar) oraz top, right, bottom i left (położenie krawędzi). Są też x i y, które dla elementów równają się left i top.

Położenie jest liczone względem widocznego obszaru okna (viewportu), a nie początku dokumentu. Gdy przewiniesz stronę w dół, top elementu maleje, a dla elementów powyżej ekranu staje się ujemne. Położenie względem całej strony dostaniesz, dodając przewinięcie: rect.top + window.scrollY. Te same współrzędne przyjmuje position: fixed, więc łatwo ustawić obok elementu np. dymek z podpowiedzią.

Rozmiar obejmuje dopełnienie (padding) i ramkę, czyli całe pole zajmowane przez element. Uwzględnia też przekształcenia CSS: transform: scale(2) podwaja zwracaną szerokość. Wartości bywają ułamkowe, np. przy powiększeniu strony, dlatego przed porównaniem warto je zaokrąglić. Odczyt może też zmusić przeglądarkę do natychmiastowego przeliczenia układu strony, jeśli wcześniej zmieniły się style.

Składnia

#
Składnia
element.getBoundingClientRect()

Więcej przykładów

#
Przekształcenia CSS zmieniają wynik
JavaScript
const badge = document.querySelector('#badge')

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

offsetWidth podaje szerokość z układu strony i pomija transform. getBoundingClientRect() mierzy element po powiększeniu, czyli tak, jak widać go na ekranie.

Dymek z podpowiedzią pod przyciskiem
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())
Konsola
56px 60px

Współrzędne z getBoundingClientRect() i z position: fixed liczone są od tego samego punktu, czyli lewego górnego rogu widocznego obszaru. Dymek trafia więc 8 px pod dolną krawędź przycisku. Kliknięcie symulujemy w pierwszej klatce, gdy ramka podglądu ma już swój rozmiar.

Obsługa przeglądarek

#

Szeroko dostępne

Działa we wszystkich nowoczesnych przeglądarkach, także na telefonach. Możesz używać bez obaw.

  • Chrome
  • Edge
  • Firefox
  • Safari

Dobre praktyki

#
  • Współrzędne zmieniają się przy przewijaniu, bo są liczone od widocznego obszaru okna. Położenie na stronie to rect.top + window.scrollY.
  • Zaokrąglaj wyniki przez Math.round(), zanim je porównasz albo wyświetlisz. Przy powiększeniu strony wartości bywają ułamkowe.
  • Element ukryty przez display: none albo jeszcze niewstawiony do dokumentu ma wszystkie wymiary równe 0. Mierz go dopiero wtedy, gdy jest wyświetlony.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.