Для использования ScrollMagic необходимо подключить саму библиотеку и
её зависимости. Основным зависимым компонентом является
GSAP (GreenSock Animation Platform) при работе с
анимациями, хотя базовый функционал ScrollMagic может работать и без
него. Подключение производится через <script> или
через менеджеры пакетов вроде npm:
<!-- ScrollMagic core -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.8/ScrollMagic.min.js"></script>
<!-- GSAP для анимаций -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/gsap.min.js"></script>
<!-- Плагин ScrollMagic для работы с GSAP -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.8/plugins/animation.gsap.min.js"></script>
Через npm:
npm install scrollmagic gsap
Подключение через модульный подход:
import ScrollMagic from "scrollmagic";
import { gsap } from "gsap";
import "scrollmagic/scrollmagic/uncompressed/plugins/animation.gsap";
1. Контроллер (Controller) Контроллер — это центр управления сценами. Он отслеживает скролл и синхронизирует события на странице. Создание контроллера:
const controller = new ScrollMagic.Controller({
globalSceneOptions: { triggerHook: 0.5 } // настройка поведения всех сцен по умолчанию
});
Параметр globalSceneOptions позволяет задать настройки,
которые будут применяться ко всем сценам контроллера, например
duration или offset.
2. Сцена (Scene) Сцена — это объект, который описывает поведение при скролле: когда оно запускается, какая анимация применяется и когда останавливается.
const scene = new ScrollMagic.Scene({
triggerElement: "#section1", // элемент, при котором срабатывает сцена
duration: 200, // длительность эффекта в пикселях прокрутки
offset: 50 // смещение относительно начала элемента
})
.setTween("#animateElement", {opacity: 1, y: -50}) // анимация через GSAP
.addIndicators({name: "scene 1"}) // отладочные индикаторы
.addTo(controller); // привязка к контроллеру
Ключевые свойства сцены:
duration: 0 сцена срабатывает один раз.3. Триггер и триггер-хуки Триггер указывает, где на
странице начинается действие сцены. Можно использовать
triggerHook в числовом формате или строками
'onEnter', 'onCenter',
'onLeave'.
triggerHook: 0 // срабатывает, когда верх элемента касается верхней границы окна
triggerHook: 0.5 // срабатывает в центре экрана
triggerHook: 1 // срабатывает при достижении нижней границы окна
ScrollMagic предоставляет встроенный инструмент для отладки — индикаторы сцены. Они визуализируют точки триггеров, длину сцены и направление анимации. Для их подключения:
scene.addIndicators({name: "my scene", colorStart: "#FF0000", colorEnd: "#00FF00"});
Параметры индикатора:
Индикаторы не влияют на анимацию и полезны при отладке сложных последовательностей.
1. Удаление сцены
scene.destroy(true); // true — удаляет также привязку к DOM
2. Остановка и возобновление сцены
scene.enabled(false); // отключает сцену
scene.enabled(true); // включает обратно
3. Изменение параметров сцены на лету
scene.duration(400); // меняет длину сцены
scene.offset(100); // меняет смещение триггера
4. Группировка сцен Сцены можно объединять в массивы и управлять ими циклически, что удобно при сложных скролл-анимациях:
const scenes = [];
document.querySelectorAll('.section').forEach((section, i) => {
const s = new ScrollMagic.Scene({triggerElement: section})
.setTween(section, {opacity: 1, y: -30})
.addTo(controller);
scenes.push(s);
});
ScrollMagic тесно интегрируется с GSAP. Основные функции:
Примеры:
// Анимация через GSAP
scene.setTween(gsap.to("#box", {duration: 1, x: 100, rotation: 360}));
// Изменение классов
scene.setClassToggle("#box", "active");
Можно комбинировать анимации, создавать цепочки с помощью
Timeline GSAP:
const tl = gsap.timeline();
tl.to("#box", {x: 100, duration: 1})
.to("#box", {y: 50, duration: 1})
.to("#box", {opacity: 0, duration: 0.5});
scene.setTween(tl);
transform и
opacity вместо изменения top,
left или margin.scene.enabled(false) для
экономии ресурсов.ScrollMagic хорошо работает с React, Vue и Angular, но важно управлять жизненным циклом компонентов, чтобы сцены создавались при монтировании и удалялись при размонтировании. Пример для React:
useEffect(() => {
const controller = new ScrollMagic.Controller();
const scene = new ScrollMagic.Scene({triggerElement: "#section"})
.setClassToggle("#box", "visible")
.addTo(controller);
return () => {
scene.destroy(true);
controller.destroy(true);
};
}, []);
Этот подход предотвращает утечки памяти и конфликты при повторной инициализации.
Эти инструменты позволяют управлять скролл-анимациями максимально гибко, делая интерфейс плавным, отзывчивым и визуально интерактивным.