В основе работы библиотеки лежит связка Controller → Scene → события. Контроллер отслеживает положение прокрутки, сцены реагируют на изменения состояния и генерируют события в строго определённой последовательности.
Каждая сцена проходит через три ключевых состояния:
Переход между этими состояниями сопровождается цепочкой событий, порядок которых критически важен при разработке сложной анимации и логики.
ScrollMagic генерирует следующие события:
enter — вход в область сценыleave — выход из области сценыstart — достижение начальной точки сценыend — достижение конечной точки сценыprogress — изменение прогресса сцены (от 0 до 1)update — обновление сцены при прокруткеchange — изменение параметров сценыshift — изменение позиции сценыПри прокрутке вниз порядок событий выглядит так:
enterstartprogress (многократно)endleaveПри прокрутке вверх последовательность меняется:
enterendprogress (в обратном направлении)startleaveenter)Срабатывает в момент, когда сцена впервые становится активной.
Особенности:
scene.on("enter", function (event) {
console.log("Вход в сцену");
});
start)Фиксирует достижение стартовой позиции.
Особенности:
enter при прокрутке внизprogressprogress)Самое часто вызываемое событие. Отражает текущее состояние сцены.
scene.on("progress", function (event) {
console.log(event.progress);
});
Особенности:
0 до 1end)Фиксирует достижение конца сцены.
Особенности:
leaveenterleave)Срабатывает при полном выходе из диапазона сцены.
scene.on("leave", function () {
console.log("Выход из сцены");
});
Каждое событие получает параметр:
event.scrollDirection
Возможные значения:
"FORWARD" — прокрутка вниз"REVERSE" — прокрутка вверхЭто позволяет различать сценарии:
scene.on("enter", function (event) {
if (event.scrollDirection === "FORWARD") {
console.log("Вход сверху");
} else {
console.log("Вход снизу");
}
});
duration: 0)Упрощённый порядок:
Прокрутка вниз:
enterstartleaveПрокрутка вверх:
enterstartleaveОсобенность:
progress и endduration > 0)Полный жизненный цикл:
Прокрутка вниз:
enter → start → progress → end → leave
Прокрутка вверх:
enter → end → progress → start → leave
update и его место в цепочкеupdate вызывается каждый раз при изменении
scroll-позиции, до остальных событий:
scene.on("update", function () {
console.log("Обновление сцены");
});
Фактический порядок при прокрутке:
updateprogressstart / endenter / leavechange и
shiftchangeСрабатывает при изменении параметров сцены:
scene.on("change", function (event) {
console.log(event.what + " изменено");
});
Пример:
scene.duration(500); // вызовет change
shiftСвязан с изменением позиции сцены относительно документа:
scene.on("shift", function () {
console.log("Сцена смещена");
});
Причины:
var scene = new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: 300
})
.addTo(controller);
scene
.on("enter", () => console.log("enter"))
.on("start", () => console.log("start"))
.on("progress", e => console.log("progress:", e.progress))
.on("end", () => console.log("end"))
.on("leave", () => console.log("leave"));
При прокрутке вниз консоль покажет:
enter
start
progress: 0.1
progress: 0.2
...
progress: 1
end
leave
1. enter и leave — границы
активности
2. start и end — точечные
триггеры
3. progress — непрерывное
управление
4. update — самый ранний сигнал
При высокой скорости прокрутки события могут происходить почти одновременно. ScrollMagic гарантирует порядок, но:
progress может пропустить промежуточные значенияstart и end могут сработать подряд без
заметной задержкиЧасто используется комбинация:
scene.on("enter start", function () {
// запуск логики
});
scene.on("leave end", function () {
// завершение
});
Из-за высокой частоты вызовов:
progressrequestAnimationFrameПрокрутка вниз:
update → enter → start → progress → end → leave
Прокрутка вверх:
update → enter → end → progress → start → leave
Понимание этой последовательности позволяет точно контролировать анимации, синхронизировать состояние интерфейса и избегать логических ошибок при сложных сценариях прокрутки.