ScrollMagic предоставляет мощный инструмент для управления анимацией и поведением элементов на странице в зависимости от прокрутки. API расширений библиотеки позволяет создавать кастомные эффекты, интегрировать сторонние анимационные библиотеки и управлять сценами с высокой точностью. В основе работы лежат сцены (Scenes) и контроллеры (Controller), расширяемые через плагины и собственные методы.
Расширения ScrollMagic чаще всего реализуются через подключение
дополнительных скриптов поверх базовой библиотеки. Например, для
интеграции с GSAP используется animation.gsap.js, для
управления классами — debug.addIndicators.js.
Пример подключения:
Создание контроллера:
var controller = new ScrollMagic.Controller();
Контроллер является ядром системы, через него сцены отслеживаются и обновляются при прокрутке.
Сцена в ScrollMagic имеет стандартный набор методов:
duration(), offset(),
triggerElement(), setTween(),
setClassToggle(). Расширения позволяют добавлять кастомное
поведение через:
Пример добавления пользовательского события:
var scene = new ScrollMagic.Scene({
triggerElement: "#section1",
duration: 300
})
.on("enter leave", function(e) {
console.log("Событие:", e.type);
})
.addTo(controller);
Ключевым моментом является использование события enter
при входе в зону сцены и leave при выходе. Эти события
могут быть расширены для выполнения сложных логик, например, запуск
анимации только при достижении определённого условия.
ScrollMagic не ограничивается внутренними методами анимации.
Расширение animation.gsap позволяет синхронизировать сцены
с Timeline и Tween объекта GSAP:
var tween = gsap.to("#box", {x: 400, rotation: 360, duration: 2});
var scene = new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: 500
})
.setTween(tween)
.addIndicators()
.addTo(controller);
Особенности работы:
setTween() принимает как отдельный Tween, так и
Timeline, что позволяет строить сложные последовательные анимации.duration сцены определяет, на каком отрезке
прокрутки будет выполняться анимация.Расширение debug.addIndicators используется для
визуализации триггеров и зон действия сцен. Методы индикаторов
поддерживают кастомизацию:
scene.addIndicators({
name: "Scene 1",
colorStart: "#FF0000",
colorEnd: "#00FF00",
indent: 20
});
Параметры:
name – отображаемое название сцены.colorStart и colorEnd – цвета начала и
конца зоны действия.indent – отступ индикатора от края страницы.Индикаторы не влияют на производительность анимации и служат исключительно для отладки и точного позиционирования сцен.
ScrollMagic предоставляет возможность создавать полностью кастомные расширения через прототип сцены:
ScrollMagic.Scene.prototype.addCustomEffect = function(options) {
this.on("progress", function(event) {
var progress = event.progress;
options.target.style.opacity = progress;
});
return this;
};
var scene = new ScrollMagic.Scene({triggerElement: "#section2", duration: 400})
.addCustomEffect({target: document.getElementById("fadeBox")})
.addTo(controller);
Принципы:
this для цепочки вызовов
(chaining).progress позволяет отслеживать
состояние анимации относительно прокрутки.Расширения также позволяют создавать сцены на лету, управлять их количеством и удалять их без утечек памяти:
function createScene(id, duration) {
var scene = new ScrollMagic.Scene({
triggerElement: id,
duration: duration
})
.setClassToggle(id, "active")
.addTo(controller);
return scene;
}
var scenes = [];
["#sec1", "#sec2", "#sec3"].forEach((el) => {
scenes.push(createScene(el, 300));
});
// удаление сцены
scenes[0].destroy(true);
Особенности:
destroy(true) удаляет сцену полностью и очищает все
обработчики.Иногда требуется независимое управление прокруткой разных блоков. ScrollMagic поддерживает несколько контроллеров:
var controller1 = new ScrollMagic.Controller({vertical: true});
var controller2 = new ScrollMagic.Controller({vertical: false});
var scene1 = new ScrollMagic.Scene({triggerElement: "#vert"})
.setClassToggle("#vert", "active")
.addTo(controller1);
var scene2 = new ScrollMagic.Scene({triggerElement: "#hor"})
.setTween("#hor", {x: 300})
.addTo(controller2);
Особенности:
API расширений предоставляет ряд событий, полезных для сложных сценариев:
enter – элемент входит в зону действия.leave – элемент покидает зону действия.start / end – сцена достигла начала или
конца.progress – изменение прогресса в диапазоне 0–1.Пример комбинированного использования:
scene.on("enter leave progress", function(event) {
if(event.type === "progress") {
console.log("Прогресс:", event.progress);
} else {
console.log("Событие:", event.type);
}
});
Такой подход позволяет реализовать гибкую анимацию, зависящую от точного состояния прокрутки и пользовательских условий.