Метод getBoundingClientRect() является встроенной
функцией DOM-элементов в JavaScript, которая возвращает объект с
информацией о положении и размерах элемента относительно видимой области
окна браузера (viewport). Основные свойства объекта включают:
top – расстояние от верхней границы
элемента до верхней границы окна.left – расстояние от левой границы
элемента до левой границы окна.right – расстояние от левой границы
окна до правой границы элемента.bottom – расстояние от верхней границы
окна до нижней границы элемента.width – ширина элемента, включая
padding и border.height – высота элемента, включая
padding и border.Метод возвращает значения в пикселях и учитывает текущий скролл страницы, что делает его крайне полезным для вычислений, связанных с анимацией и позиционированием элементов.
getBoundingClientRect() с GSAPGSAP (GreenSock Animation Platform) предоставляет мощный инструмент
для создания анимаций в JavaScript. Использование
getBoundingClientRect() позволяет анимациям быть
динамическими, адаптируясь к текущему положению элементов на
странице.
Пример применения:
const box = document.querySelector(".box");
const rect = box.getBoundingClientRect();
gsap.to(box, {
x: window.innerWidth - rect.right - 20,
y: window.innerHeight - rect.bottom - 20,
duration: 1.5,
ease: "power2.out"
});
В этом примере rect.right и rect.bottom
используются для вычисления конечного положения элемента с учётом
текущего расположения и размеров окна. Это особенно важно при создании
адаптивных анимаций, где элементы должны перемещаться относительно
видимой области.
getBoundingClientRect() часто применяется для
определения момента, когда элемент появляется в области видимости
пользователя. Это позволяет запускать анимацию только тогда, когда
элемент становится видимым.
const element = document.querySelector(".animate");
function checkVisibility() {
const rect = element.getBoundingClientRect();
if (rect.top < window.innerHeight && rect.bottom > 0) {
gsap.to(element, { opacity: 1, y: 0, duration: 1 });
}
}
window.addEventListener("scroll", checkVisibility);
checkVisibility();
Проверка
rect.top < window.innerHeight && rect.bottom > 0
гарантирует, что элемент полностью или частично находится в пределах
видимой области окна, и анимация запускается только в этот момент.
При создании сложных анимаций часто возникает необходимость в адаптации к текущему положению и размерам элемента. Например, перемещение элемента к его центру экрана:
const target = document.querySelector(".target");
const rect = target.getBoundingClientRect();
const centerX = window.innerWidth / 2 - rect.width / 2 - rect.left;
const centerY = window.innerHeight / 2 - rect.height / 2 - rect.top;
gsap.to(target, { x: centerX, y: centerY, duration: 1 });
В данном примере вычисляется смещение по осям X и Y, которое
необходимо для центрирования элемента. Использование
getBoundingClientRect() позволяет получать точные данные о
текущей позиции и размерах элемента.
При масштабировании элементов важно учитывать не только размеры, но и
текущее положение. Метод getBoundingClientRect() позволяет
корректно вычислять координаты, чтобы масштабирование выглядело
естественно:
const element = document.querySelector(".scale-box");
const rect = element.getBoundingClientRect();
gsap.to(element, {
scale: 1.5,
x: window.innerWidth / 2 - rect.left - rect.width / 2,
y: window.innerHeight / 2 - rect.top - rect.height / 2,
duration: 1.2
});
Смещение вычисляется таким образом, чтобы центр элемента оставался на текущем положении экрана при увеличении масштаба, что делает анимацию визуально согласованной.
Частое использование getBoundingClientRect() при скролле
или анимации может вызывать лишние перерисовки и нагрузку на браузер.
Рекомендуется:
requestAnimationFrame для синхронизации с
циклом рендеринга браузера.Пример оптимизированного скролл-триггера:
let ticking = false;
function onScroll() {
if (!ticking) {
window.requestAnimationFrame(() => {
const rect = element.getBoundingClientRect();
if (rect.top < window.innerHeight && rect.bottom > 0) {
gsap.to(element, { opacity: 1, y: 0, duration: 1 });
}
ticking = false;
});
ticking = true;
}
}
window.addEventListener("scroll", onScroll);
Использование requestAnimationFrame предотвращает
избыточные вызовы функции и обеспечивает плавную анимацию без лагов.
getBoundingClientRect() идеально подходит для адаптивных
анимаций, где элементы могут менять размеры и позицию в зависимости от
ширины экрана. Динамическое вычисление координат позволяет создавать
анимации, которые корректно работают на любых устройствах:
function animateResponsive() {
const rect = element.getBoundingClientRect();
const scale = window.innerWidth < 768 ? 0.8 : 1;
gsap.to(element, {
scale: scale,
x: window.innerWidth / 2 - rect.left - rect.width / 2,
y: window.innerHeight / 2 - rect.top - rect.height / 2,
duration: 1
});
}
window.addEventListener("resize", animateResponsive);
animateResponsive();
Такой подход обеспечивает согласованное отображение анимаций вне зависимости от размеров экрана и ориентации устройства.