Комбинированные анимации позволяют создавать сложные визуальные эффекты, синхронизируя несколько анимационных действий на одном или нескольких элементах при прокрутке страницы. В ScrollMagic это достигается за счёт объединения сцен (Scenes), таймлайнов (TimelineMax/TimelineLite из GSAP) и управления последовательностью событий.
В ScrollMagic интеграция с GSAP является стандартной практикой для создания комбинированных анимаций. Основная идея: вместо запуска отдельной анимации для каждого элемента создаётся Timeline, в котором задаются последовательные или параллельные анимации.
// Создание таймлайна с использованием GSAP
const timeline = gsap.timeline();
// Последовательная анимация двух элементов
timeline
.from(".element1", { duration: 1, x: -100, opacity: 0 })
.from(".element2", { duration: 1, y: 50, opacity: 0 });
Пояснение:
.from() задаёт начальное состояние элемента."<0" или "-=0.5".timeline
.from(".element1", { duration: 1, x: -100, opacity: 0 })
.from(".element2", { duration: 1, y: 50, opacity: 0 }, "-=0.5"); // начнется за 0.5 секунды до конца предыдущей
После создания таймлайна его можно привязать к сцене ScrollMagic, чтобы анимация запускалась при прокрутке страницы.
const controller = new ScrollMagic.Controller();
const scene = new ScrollMagic.Scene({
triggerElement: ".trigger", // элемент, при появлении которого запускается анимация
duration: 500, // протяженность анимации по прокрутке
triggerHook: 0.5 // точка срабатывания в середине экрана
})
.setTween(timeline)
.addTo(controller);
Ключевые моменты:
triggerElement определяет привязку анимации к элементу
на странице.duration задаёт длину анимации относительно скролла.
При значении 0 анимация запускается мгновенно.triggerHook варьируется от 0 (верх окна) до 1 (низ
окна).Для сложных интерфейсов часто создаются несколько сцен, каждая из которых управляет своей частью анимации. Их можно синхронизировать или позволить работать независимо.
const timeline1 = gsap.timeline();
timeline1.from(".block1", { duration: 1, x: -200, opacity: 0 });
const timeline2 = gsap.timeline();
timeline2.from(".block2", { duration: 1, scale: 0, opacity: 0 });
new ScrollMagic.Scene({ triggerElement: ".section1", duration: 400 })
.setTween(timeline1)
.addTo(controller);
new ScrollMagic.Scene({ triggerElement: ".section2", duration: 400 })
.setTween(timeline2)
.addTo(controller);
Примечание: сцены можно комбинировать через контроллеры, что позволяет управлять всеми анимациями централизованно.
Для создания параллакс-эффекта используется комбинация нескольких таймлайнов с разной скоростью анимации. Элементы с большим смещением будут двигаться медленнее, создавая ощущение глубины.
const bgTimeline = gsap.timeline();
bgTimeline.from(".background", { y: -50, opacity: 0.8 });
const fgTimeline = gsap.timeline();
fgTimeline.from(".foreground", { y: 50, opacity: 1 });
new ScrollMagic.Scene({ triggerElement: ".parallax-section", duration: 600 })
.setTween(bgTimeline)
.addTo(controller);
new ScrollMagic.Scene({ triggerElement: ".parallax-section", duration: 600 })
.setTween(fgTimeline)
.addTo(controller);
Особенности:
duration задаёт, насколько сильно анимация привязана к
скроллу.ScrollMagic позволяет запускать функции при определённых событиях сцены, что полезно для комбинированных анимаций с интерактивностью.
scene.on("enter", () => {
console.log("Анимация начала воспроизводиться");
});
scene.on("progress", event => {
console.log(`Прогресс анимации: ${event.progress}`);
});
scene.on("leave", () => {
console.log("Анимация завершена или сцена покинута");
});
Преимущества использования событий:
duration, чтобы анимация была привязана к
прокрутке, а не только к времени.enter, leave,
progress позволяют управлять дополнительными
эффектами и интерактивностью.Эта структура комбинированных анимаций в ScrollMagic является базовой для построения сложных визуальных эффектов: последовательные, параллельные, параллаксные и многослойные анимации можно управлять централизованно через таймлайны и сцены, синхронизируя их с прокруткой и пользовательскими событиями.