Библиотека ScrollMagic с момента своего появления прошла через несколько версий, каждая из которых привносила значительные изменения в API. Понимание этих изменений критически важно для корректного использования библиотеки и миграции старого кода на новые версии.
Ранее: сцены создавались через прямой конструктор
new ScrollMagic.Scene({ options }), где опции включали
duration, offset, triggerElement
и triggerHook.
Теперь: подход к опциям стал более гибким, появились дополнительные параметры:
reverse — управляет возможностью обратного проигрывания
анимации при скролле назад.loglevel — задает уровень логирования событий сцены для
отладки.tweenChanges — определяет, обновлять ли анимацию плавно
при изменении прогресса сцены.const scene = new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: 300,
triggerHook: 0.5,
reverse: true,
tweenChanges: true
});
ScrollMagic не содержит встроенной анимации, но интегрируется с популярными библиотеками, такими как GSAP.
Изменения:
.setTween() теперь принимает как одиночный tween,
так и массив tween-объектов для последовательного запуска.scene.setTween(TweenMax.to("#animate", 1, {x: 100}));
или с динамическим созданием:
scene.setTween(() => TweenMax.to("#animate", 1, {y: Math.random() * 500}));
События: start, end,
enter, leave, progress API
событий стало более последовательным:
.on(event, callback) — теперь поддерживает цепочку
вызовов, возвращая сам объект сцены..off(event, callback) — удаление конкретного
обработчика событий..trigger(event) — ручной вызов события для тестирования
и отладки.scene
.on("enter leave", function (event) {
console.log(event.type, event.scrollDirection);
})
.on("progress", function (event) {
console.log("Progress:", event.progress);
});
Функционал закрепления элементов (.setPin()) стал более
гибким:
pushFollowers, управляющая поведением
последующих элементов при закреплении.spacerClass позволяет задавать пользовательский
класс для временного контейнера, создаваемого ScrollMagic.scene.setPin("#pinned", {pushFollowers: false, spacerClass: "custom-spacer"});
Контроллер теперь выполняет больше функций по управлению сценами:
addScene(scene) / removeScene(scene) —
добавление и удаление сцены из контроллера.update() — обновление состояния всех сцен при изменении
DOM или размеров окна.enabled(boolean) — включение или отключение контроллера
без удаления сцен.scrollTo(target, [options]) — плавный скролл к
определенному элементу, заменивший собственные сторонние плагины.const controller = new ScrollMagic.Controller({vertical: true, globalSceneOptions: {triggerHook: 0.5}});
controller.addScene(scene);
controller.scrollTo("#target");
globalSceneOptions:
позволяет задать опции, которые будут применяться ко всем сценам
контроллера.addIndicators() для дебага теперь доступны только через
отдельный плагин.const controller = new ScrollMagic.Controller({
globalSceneOptions: {triggerHook: 0.2, reverse: false}
});
new ScrollMagic.Scene({triggerElement: "#section"})
.setTween("#animate", {x: 200})
.addTo(controller);
resize и refresh помогают
динамически обновлять сцены при изменении размеров окна.controller.on("resize", () => {
controller.update(true);
});
ScrollMagic теперь проще интегрировать с React, Vue и Angular через
использование ref и прямое добавление сцены к элементу:
// React пример
useEffect(() => {
const scene = new ScrollMagic.Scene({triggerElement: ref.current})
.setTween("#animate", {opacity: 1, y: 0})
.addTo(controller);
return () => scene.destroy(true);
}, []);
Эта методика позволяет корректно монтировать и демонтировать сцены при обновлениях компонентов.