GSAP (GreenSock Animation Platform) предоставляет мощный набор инструментов для создания анимации в JavaScript. Одним из важных аспектов при работе с динамическими анимациями является ограничение перемещений объектов в пределах заданной области. Для этого используется концепция bounds — ограничивающих рамок, которые позволяют контролировать движение элементов и предотвращать выход за пределы контейнера или видимой области.
В GSAP bounds можно использовать в сочетании с методами Draggable, ScrollTrigger и базовыми tween/ timeline-анимациями. Наиболее часто bounds применяются к объектам, которые перемещаются мышью или касанием, чтобы они не выходили за границы определённого контейнера.
Пример синтаксиса для Draggable:
gsap.registerPlugin(Draggable);
Draggable.create(".box", {
type: "x,y",
bounds: ".container",
edgeResistance: 0.65,
inertia: true
});
Ключевые моменты:
type: "x,y" — позволяет перемещать элемент по обеим
осям.bounds: ".container" — ограничивает перемещение
элементом .box внутри .container.edgeResistance — коэффициент сопротивления у края
контейнера (от 0 до 1).inertia — плавное затухание движения после отпускания
элемента.1. CSS-селектор или DOM-элемент Наиболее распространённый способ — указать контейнер через CSS-селектор или ссылку на элемент:
bounds: document.querySelector(".container")
GSAP автоматически вычисляет размеры контейнера и ограничивает движение объекта.
2. Объект с координатами Можно задать кастомные границы с помощью объекта:
bounds: {minX: 0, maxX: 500, minY: 0, maxY: 300}
minX и maxX — минимальное и максимальное
положение по оси X.minY и maxY — минимальное и максимальное
положение по оси Y.Этот подход полезен для анимаций вне DOM-контекста или при работе с канвасом.
Свойство edgeResistance управляет «упругостью» элемента
при достижении границ. Значения варьируются от 0 до 1:
Пример:
Draggable.create(".ball", {
type: "x,y",
bounds: ".playground",
edgeResistance: 0.7
});
Здесь элемент замедляется при подходе к границам контейнера
.playground, создавая эффект «упругого удара».
Bounds часто применяются в анимациях, привязанных к прокрутке. Например, при ограничении вертикального перемещения контента:
gsap.registerPlugin(ScrollTrigger);
gsap.to(".panel", {
y: 400,
scrollTrigger: {
trigger: ".panel",
start: "top top",
end: "bottom bottom",
scrub: true,
bounds: {minY: 0, maxY: 400}
}
});
Особенности:
y, гарантируя, что
панель не выйдет за заданный диапазон.scrub: true синхронизирует анимацию с прокруткой, делая
движение плавным.Bounds могут меняться во время выполнения анимации. Это особенно полезно при адаптивной верстке:
const box = document.querySelector(".box");
function updateBounds() {
Draggable.get(box).applyBounds({
minX: 0,
maxX: window.innerWidth - box.offsetWidth,
minY: 0,
maxY: window.innerHeight - box.offsetHeight
});
}
window.addEventListener("resize", updateBounds);
При изменении размеров окна bounds пересчитываются, предотвращая выход элемента за видимую область.
Bounds можно комбинировать с GSAP Tween и easing для создания сложных анимационных эффектов:
gsap.to(".circle", {
duration: 2,
x: 600,
y: 300,
ease: "power2.out",
onUpdate: function() {
const bounds = {minX: 0, maxX: 500, minY: 0, maxY: 250};
this.x(this.x() > bounds.maxX ? bounds.maxX : this.x());
this.y(this.y() > bounds.maxY ? bounds.maxY : this.y());
}
});
onUpdate проверяет текущие координаты и корректирует их
в пределах заданного диапазона.edgeResistance для создания естественных
эффектов отскока.Bounds в GSAP — мощный инструмент для контроля движения элементов. Их правильное использование позволяет создавать интуитивно понятные интерфейсы с плавной и предсказуемой анимацией.