Библиотека ScrollMagic предоставляет гибкий механизм отслеживания состояний сцен и контроллера через события. События позволяют реагировать на изменение положения прокрутки, вход и выход элементов из области видимости, прогресс анимации и другие ключевые моменты.
События генерируются объектами Controller и
Scene. Основная работа ведётся со сценами, поскольку именно
они описывают поведение элементов при прокрутке.
Для подписки на событие используется метод .on():
scene.on("eventName", function(event) {
// обработка события
});
Удаление обработчика осуществляется через .off():
scene.off("eventName", callback);
Также доступна одноразовая подписка через .once().
Каждое событие передаёт в обработчик объект event,
содержащий набор параметров, описывающих текущее состояние сцены. Эти
параметры являются ключевыми для построения логики.
Основные свойства:
typeОпределяет тип произошедшего события.
Примеры значений:
enterleavestartendprogressupdateИспользуется для универсальных обработчиков:
scene.on("enter leave", function(event) {
console.log(event.type);
});
targetСодержит ссылку на сцену, вызвавшую событие. Позволяет обращаться к методам сцены внутри обработчика.
scene.on("enter", function(event) {
console.log(event.target === scene); // true
});
progressОтражает степень выполнения сцены. Значение находится в диапазоне от
0 до 1.
0 — сцена ещё не началась1 — сцена полностью завершенаПрименяется для синхронизации анимаций:
scene.on("progress", function(event) {
console.log(event.progress);
});
Часто используется совместно с анимационными библиотеками, например GSAP.
stateОписывает текущее состояние сцены. Возможные значения:
BEFORE — сцена ещё не достигнутаDURING — сцена активнаAFTER — сцена завершенаПример:
scene.on("enter leave", function(event) {
console.log(event.state);
});
Это удобно для управления логикой отображения элементов.
scrollDirectionПоказывает направление прокрутки:
FORWARD — внизREVERSE — вверхPAUSED — без движенияscene.on("update", function(event) {
console.log(event.scrollDirection);
});
Полезно для создания адаптивных анимаций, зависящих от направления скролла.
scrollPosСодержит текущее значение прокрутки в пикселях относительно документа.
scene.on("update", function(event) {
console.log(event.scrollPos);
});
Позволяет синхронизировать поведение сцены с другими элементами страницы.
В зависимости от типа события могут передаваться дополнительные значения:
startPos и
endPosОпределяют позиции начала и конца сцены:
scene.on("update", function(event) {
console.log(event.startPos, event.endPos);
});
Используются для анализа диапазона действия сцены.
enterСрабатывает, когда сцена становится активной.
scene.on("enter", function(event) {
console.log("Сцена активирована");
});
Параметры:
scrollDirectionstateleaveСрабатывает при выходе из сцены.
scene.on("leave", function(event) {
console.log("Сцена завершена");
});
progressВызывается при изменении прогресса сцены.
scene.on("progress", function(event) {
console.log(event.progress);
});
Часто используется для:
updateСрабатывает при каждом обновлении позиции прокрутки.
scene.on("update", function(event) {
console.log(event.scrollPos);
});
Отличается высокой частотой вызова, поэтому требует оптимизации обработчиков.
start и
endstart — достижение начальной точки сценыend — достижение конечной точкиscene.on("start end", function(event) {
console.log(event.type);
});
ScrollMagic позволяет подписываться сразу на несколько событий:
scene.on("enter leave progress", function(event) {
console.log(event.type, event.progress);
});
Это упрощает централизованную обработку логики.
scene.on("enter", function(event) {
document.querySelector(".box").classList.add("active");
});
scene.on("leave", function(event) {
document.querySelector(".box").classList.remove("active");
});
scene.on("progress", function(event) {
animation.progress(event.progress);
});
scene.on("update", function(event) {
if (event.scrollDirection === "FORWARD") {
console.log("Вниз");
} else {
console.log("Вверх");
}
});
Высокочастотные события (progress, update)
могут создавать нагрузку. Рекомендуется:
Пример throttle:
let lastCall = 0;
scene.on("update", function(event) {
let now = Date.now();
if (now - lastCall > 100) {
console.log(event.scrollPos);
lastCall = now;
}
});
enter →
start → progress)leave →
end)Для визуального контроля используется плагин:
scene.addIndicators();
Он добавляет маркеры начала и конца сцены.
Пример полного объекта:
{
type: "progress",
target: scene,
progress: 0.5,
state: "DURING",
scrollDirection: "FORWARD",
scrollPos: 350,
startPos: 200,
endPos: 600
}
Такой набор параметров делает систему событий ScrollMagic мощным инструментом для точного контроля поведения интерфейса при прокрутке.