GSAP (GreenSock Animation Platform) предоставляет гибкие инструменты для анимации элементов в DOM. Одним из мощных механизмов является scope, позволяющий изолировать селекторы и избежать конфликтов при работе с множеством элементов на странице.
Scope — это область, в которой GSAP будет искать элементы по
селекторам. По умолчанию, если передать строковый селектор в методы
GSAP, поиск осуществляется по всему документу (document).
Однако при сложных интерфейсах с повторяющимися классами или
идентификаторами важно ограничить область действия анимации, чтобы
избежать нежелательных эффектов.
Пример базового использования:
gsap.to(".box", {
x: 100,
duration: 2
});
В этом случае .box ищется по всему документу. Если на
странице несколько секций с .box, все они анимируются
одновременно.
Для изоляции можно использовать объект scope, который указывает родительский элемент, в пределах которого будут искаться селекторы:
gsap.to(".box", {
x: 100,
duration: 2,
scope: document.querySelector("#section1")
});
Здесь .box будет найден только внутри элемента
#section1. Элементы с таким же классом в других секциях не
будут затронуты.
Для динамически создаваемых элементов часто используют функцию, возвращающую локальный контекст:
const section = document.querySelector("#section2");
gsap.utils.toArray(".box", section).forEach(box => {
gsap.to(box, {
y: 50,
duration: 1
});
});
Метод gsap.utils.toArray принимает вторым аргументом
контейнер, что позволяет сразу получать массив
элементов в пределах конкретного узла.
При работе с gsap.timeline() scope также можно задать
через defaults или при инициализации отдельных
анимаций:
const tl = gsap.timeline({
defaults: { duration: 1 },
scope: document.querySelector("#section3")
});
tl.to(".box", { x: 100 })
.to(".circle", { y: 50 });
Все селекторы внутри этой таймлайна будут автоматически ограничены указанным контейнером.
В современных фронтенд-фреймворках (React, Vue, Angular) scope
особенно полезен для анимации компонентов, где одинаковые классы
повторяются в разных экземплярах. Вместо глобального поиска можно
использовать ref или ссылку на DOM-узел как scope:
const container = this.$refs.componentRoot;
gsap.from(container.querySelectorAll(".item"), {
opacity: 0,
y: 20,
stagger: 0.1,
duration: 0.5
});
Таким образом анимация применяется только к конкретной части компонента, что исключает вмешательство в другие экземпляры с теми же классами.
gsap.utils.toArray с локальными
контейнерами для более чистого и понятного кода.Использование scope в GSAP позволяет создавать управляемые, предсказуемые и изолированные анимации, значительно упрощая работу с большими и динамическими интерфейсами.