ScrollMagic организует анимацию и взаимодействие с прокруткой вокруг сцен (Scene). Сцена представляет собой область, на которой происходит триггер событий и анимаций. Понимание жизненного цикла сцены критично для корректного использования библиотеки и управления её поведением.
Жизненный цикл сцены можно разделить на несколько ключевых этапов:
Сцена создается через конструктор
ScrollMagic.Scene():
var scene = new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: 300,
offset: 50,
triggerHook: 0.5
});
Ключевые параметры:
triggerElement — элемент, который запускает сцену.duration — длина сцены в пикселях или функция,
возвращающая длину.offset — смещение начала сцены относительно
триггера.triggerHook — позиция на экране, при которой
срабатывает сцена (0 — верх, 1 — низ).На этапе инициализации сцена существует в памяти, но не привязана к контроллеру и не отслеживает прокрутку.
Чтобы сцена начала реагировать на скролл, её необходимо добавить в
ScrollMagic.Controller:
var controller = new ScrollMagic.Controller();
controller.addScene(scene);
Добавление в контроллер запускает внутренние процессы:
enabled,
progress).С этого момента сцена становится «живой» и готова реагировать на скролл пользователя.
Сцена поддерживает динамическое отслеживание прогресса:
scene.on("progress", function (event) {
console.log(event.progress);
});
Параметр progress изменяется от 0 до 1
в зависимости от прокрутки:
Прогресс может быть использован для привязки анимаций через
TweenMax или GSAP:
var tween = TweenMax.to("#box", 1, {x: 500});
scene.setTween(tween);
Сцена может находиться в двух основных состояниях:
progress = 0).0 < progress <= 1).События жизненного цикла для активации:
scene.on("enter", function(event) {
console.log("Сцена активирована");
});
scene.on("leave", function(event) {
console.log("Сцена покинута");
});
enter срабатывает, когда прокрутка достигает
триггера.leave срабатывает, когда прокрутка выходит за пределы
сцены.Эти события позволяют точно управлять анимациями, добавлением и удалением классов, изменением DOM.
Длительность сцены можно задавать как функцию для динамического расчета:
scene.duration(function() {
return document.querySelector("#content").offsetHeight;
});
Важные моменты:
duration в процессе работы сцены
автоматически пересчитывает прогресс.offset позволяет сдвинуть начало сцены относительно
триггер-элемента.scene.refresh() для пересчета позиции.Сцена может быть отключена или удалена:
scene.destroy(true); // полностью удаляет сцену и все слушатели
Параметр true очищает DOM от привязанных стилей и
событий. Также можно временно отключить сцену без удаления:
scene.enabled(false);
scene.enabled(true).scene.setTween(tween) — привязка анимации.scene.setPin(element, {pushFollowers: true}) —
закрепление элемента.scene.addIndicators() — вывод визуальных индикаторов
для отладки.scene.refresh() — пересчет позиции и длины сцены.scene.remove() — удаление сцены из контроллера без
уничтожения объекта.Эти методы позволяют полностью управлять сценой на всех этапах её жизненного цикла.
duration и
вызывать refresh() после изменений DOM.enter и leave для
синхронизации сложных анимаций.destroy(true) при
переходах между страницами, чтобы избежать утечек памяти.Жизненный цикл сцены — это последовательность состояний: создание → добавление в контроллер → отслеживание прогресса → активация → деактивация → удаление, каждая стадия которой предоставляет набор инструментов для тонкой настройки прокрутки и анимации.