GSAP (GreenSock Animation Platform) предоставляет мощные инструменты для анимации как отдельных элементов, так и групп элементов. Работа с группами позволяет создавать синхронные и последовательные эффекты, управлять множеством объектов одновременно и упрощает масштабирование анимаций.
Массив DOM-элементов
Любой набор элементов можно объединить в массив и передавать в функции GSAP. Например:
const boxes = document.querySelectorAll('.box');
gsap.to(boxes, { x: 200, duration: 2, stagger: 0.2 });
Ключевые моменты:
stagger позволяет задать задержку между анимациями
отдельных элементов в группе.stagger не
указан.Класс или атрибут
Вместо явного массива можно выбрать элементы по общему классу:
gsap.to('.circle', { y: 100, rotation: 360, duration: 1.5, stagger: 0.1 });
Это особенно удобно для динамически генерируемых списков элементов, где заранее неизвестно количество объектов.
Timeline для группы элементов
Timeline (gsap.timeline) позволяет создавать комплексные
анимации с точным контролем последовательности:
const tl = gsap.timeline({ defaults: { duration: 1 } });
tl.to('.item1', { x: 100 })
.to('.item2', { y: 50 }, "<0.5")
.to('.item3', { scale: 1.5 });
Особенности:
< задаёт смещение анимации относительно
предыдущей.Синхронная анимация всех элементов:
При использовании массивов или классов без stagger все
элементы анимируются одновременно. Например:
gsap.to('.box', { opacity: 0, duration: 1 });
Весь набор мгновенно начинает исчезать, что удобно для мгновенных эффектов.
Последовательная анимация с
stagger:
Параметр stagger принимает числа, объекты или функции,
позволяя гибко управлять интервалами:
gsap.to('.box', {
x: 100,
stagger: {
each: 0.3,
from: "center",
ease: "power1.inOut"
}
});
Здесь:
each задаёт интервал между анимациями.from определяет порядок начала анимаций:
"start", "center", "end",
"random".ease позволяет плавно управлять движением каждого
элемента.GSAP позволяет управлять целыми группами после их анимации через возвращаемые объекты или timeline:
const boxesAnimation = gsap.to('.box', { x: 200, paused: true });
boxesAnimation.play(); // Запуск всех анимаций
boxesAnimation.reverse(); // Обратная анимация
boxesAnimation.progress(0.5); // Перемещение в середину анимации
Timeline обеспечивает ещё более высокий уровень контроля:
const tl = gsap.timeline({ paused: true });
tl.to('.item1', { x: 100 })
.to('.item2', { y: 50 }, "-=0.5");
tl.play();
Преимущество timeline в том, что можно управлять не отдельными анимациями, а всей последовательностью сразу.
Иногда набор элементов неизвестен заранее, тогда удобно использовать функцию для генерации анимаций:
document.querySelectorAll('.card').forEach((card, index) => {
gsap.to(card, {
y: 50,
rotation: 10 * index,
duration: 1,
delay: index * 0.2
});
});
Здесь каждый элемент получает уникальные параметры, сохраняя общую логику движения группы.
GSAP поддерживает массив объектов с собственными свойствами:
gsap.to([
{ targets: '.box1', x: 100, rotation: 45 },
{ targets: '.box2', y: 50, scale: 1.2 },
{ targets: '.box3', opacity: 0.5 }
]);
Это удобно, когда элементы группы должны двигаться по разным траекториям, но запускаться одновременно.
will-change и CSS-трансформаций
(translate, scale, rotate)
минимизирует нагрузку на рендеринг.GSAP позволяет вычислять параметры анимации на лету:
gsap.to('.box', {
x: (i) => i * 50,
y: (i, target) => target.offsetTop / 2,
duration: 1
});
i — индекс элемента в массиве.target — сам DOM-элемент.Эффективные анимации больших интерфейсов часто комбинируют массивы, timeline и stagger:
const cards = document.querySelectorAll('.card');
const tl = gsap.timeline({ defaults: { duration: 1, ease: "power2.out" } });
tl.to(cards, { y: 20, stagger: 0.1 })
.to(cards, { rotation: 15, stagger: { each: 0.05, from: "end" } })
.to(cards, { scale: 1.1, stagger: 0.1 });
Такой подход позволяет управлять сложными групповыми анимациями без дублирования кода и обеспечивает максимальную гибкость при изменении порядка или свойств элементов.