ScrollMagic — это библиотека для JavaScript, предназначенная для создания интерактивных анимаций на основе прокрутки страницы. Последовательные анимации позволяют создавать плавные переходы нескольких элементов, синхронизированных с движением скролла. Основной принцип — привязка сцены к положению скролла и управление анимацией через Timeline.
Для последовательной анимации первым шагом является создание сцены. Сцена в ScrollMagic — это объект, который связывает триггер с определённой анимацией:
const controller = new ScrollMagic.Controller();
const scene = new ScrollMagic.Scene({
triggerElement: "#trigger", // элемент, при достижении которого начинается анимация
duration: 500, // длина сцены в пикселях прокрутки
triggerHook: 0.5 // точка запуска сцены (0 – верх окна, 1 – низ)
})
.setTween("#animate", { y: 100, opacity: 1 }) // простая анимация
.addTo(controller);
Ключевые моменты:
triggerElement задаёт начало анимации.duration определяет длительность сцены.triggerHook управляет моментом запуска относительно
видимой области окна.Для сложных анимаций используется Timeline, обычно через библиотеку GSAP. Timeline позволяет объединять несколько анимаций в последовательность и синхронизировать их с прокруткой:
const timeline = gsap.timeline();
timeline
.from("#elem1", { y: -50, opacity: 0, duration: 1 })
.from("#elem2", { x: 100, opacity: 0, duration: 1 }, "-=0.5")
.from("#elem3", { scale: 0, opacity: 0, duration: 1 }, "-=0.3");
const scene = new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: 1000,
triggerHook: 0.3
})
.setTween(timeline)
.addTo(controller);
Объяснение параметров:
"-=0.5" означает, что анимация начнётся за 0.5 секунды
до окончания предыдущей.С помощью ScrollMagic можно управлять не только началом анимации, но
и её обратным воспроизведением при прокрутке вверх. Для
этого используется параметр reverse:
const scene = new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: 800,
reverse: true
})
.setTween(timeline)
.addTo(controller);
reverse: true позволяет анимации «отматываться» назад
при прокрутке вверх, создавая плавные интерактивные эффекты.
Для больших страниц часто используется несколько последовательных анимаций, каждая для своей секции:
const sections = document.querySelectorAll(".section");
sections.forEach((section, index) => {
const tl = gsap.timeline();
tl.from(section.querySelector(".title"), { y: -50, opacity: 0, duration: 1 })
.from(section.querySelector(".content"), { x: 100, opacity: 0, duration: 1 }, "-=0.5");
new ScrollMagic.Scene({
triggerElement: section,
duration: "50%",
triggerHook: 0.7
})
.setTween(tl)
.addTo(controller);
});
Преимущества такого подхода:
"50%") делает анимацию
пропорциональной высоте секции.Для плавной работы на сложных страницах важно учитывать:
requestAnimationFrame через GSAP для
снижения нагрузки на рендер.gsap.set(".animated", { willChange: "transform, opacity" });
willChange подсказывает браузеру о будущих изменениях и
повышает производительность анимаций.
Последовательные анимации часто комбинируются с эффектом pinning, когда элемент фиксируется на экране на время сцены:
new ScrollMagic.Scene({
triggerElement: "#pin-section",
duration: 600,
triggerHook: 0
})
.setPin("#pin-section")
.setTween(timeline)
.addTo(controller);
setPin блокирует элемент на экране, позволяя анимации
разворачиваться внутри сцены, создавая эффект параллакса и динамического
повествования.
ScrollMagic позволяет использовать responsive triggerHook и duration, чтобы анимации выглядели одинаково на разных устройствах:
const duration = window.innerHeight * 0.8;
new ScrollMagic.Scene({
triggerElement: "#responsive",
duration: duration,
triggerHook: 0.5
})
.setTween(timeline)
.addTo(controller);
Привязка длительности к размеру окна обеспечивает корректное воспроизведение анимаций на мобильных и десктопных устройствах.
Последовательные анимации с ScrollMagic в сочетании с Timeline GSAP позволяют создавать сложные, интерактивные эффекты, синхронизированные с прокруткой страницы. Контроль порядка, времени начала, перекрытия и обратного воспроизведения делает их мощным инструментом для визуально насыщенных веб-интерфейсов.