Для эффективной работы с ScrollMagic важно структурировать сцены логически и минимизировать дублирование кода. Каждая сцена должна иметь чётко определённое назначение: анимация конкретного элемента, триггер эффекта на определённой позиции страницы или управление последовательностью анимаций.
Рекомендации по структуре сцен:
Scene,
чтобы легко управлять ими при необходимости включения, отключения или
уничтожения.fadeInHeaderScene,
pinSectionScene.Scene. Это позволяет централизованно менять
параметры триггера или длительность.function createFadeInScene(elementSelector, duration) {
return new ScrollMagic.Scene({
triggerElement: elementSelector,
duration: duration,
triggerHook: 0.8
})
.setClassToggle(elementSelector, "visible")
.addTo(controller);
}
Контроллер — центральный объект, управляющий всеми сценами. Один экземпляр контроллера обычно создаётся на всю страницу, чтобы избежать лишней нагрузки на рендеринг и событийную модель.
ScrollMagic.Controller и добавлять все сцены к нему.refreshInterval, чтобы управлять частотой пересчёта позиций
элементов при изменении размера окна.var controller = new ScrollMagic.Controller({
globalSceneOptions: {
triggerHook: 0.9
},
refreshInterval: 100
});
ScrollMagic работает на основе события scroll, поэтому
высокая частота срабатываний может негативно влиять на
производительность, особенно при множестве сцен и сложных анимациях.
Методы оптимизации:
scroll.new ScrollMagic.Scene({ triggerElement: "#section" })
.setTween("#animate", {opacity: 1, y: 0, duration: 1})
.addTo(controller);
triggerHook определяет, в какой части
окна запускается сцена. Значения от 0 (верх окна) до
1 (низ окна) позволяют гибко управлять моментом старта
анимации.
triggerHook: 0.9 – элемент появится почти в нижней части
экрана.triggerHook: 0 – сцена активируется сразу после достижения
верхней границы.Принципы:
triggerHook в зависимости от визуальной
логики анимации, а не от произвольных чисел.offset,
использовать относительные значения, чтобы адаптироваться к различным
разрешениям экрана.var pinScene = new ScrollMagic.Scene({
triggerElement: "#section",
triggerHook: 0,
duration: "100%"
})
.setPin("#section")
.addTo(controller);
Каждая сцена может реагировать на события: enter,
leave, start, end, что позволяет
выполнять дополнительные действия вне анимаций.
Примеры использования событий:
scene.on("enter", function () {
console.log("Элемент появился на экране");
});
scene.on("leave", function () {
console.log("Элемент ушел из экрана");
});
Совет: для больших проектов лучше группировать
обработчики в отдельные функции и подключать их через
scene.on, чтобы избежать «разбросанных» колбэков по всему
коду.
ScrollMagic не предназначен для сложных анимаций сам по себе, поэтому его часто комбинируют с библиотеками вроде GSAP.
Преимущества такой интеграции:
var tween = gsap.from("#box", {duration: 1, y: 100, opacity: 0});
new ScrollMagic.Scene({
triggerElement: "#section",
triggerHook: 0.8
})
.setTween(tween)
.addTo(controller);
triggerHook, duration, offset)
для упрощения изменений.scene.destroy(true), чтобы снизить нагрузку на страницу при
динамическом контенте.if (oldScene) {
oldScene.destroy(true);
}
controller.update()
после вставки новых элементов, чтобы пересчитать позиции триггеров.Эти практики обеспечивают стабильную работу ScrollMagic на страницах любого объёма и позволяют легко масштабировать проект без потери производительности и контроля над анимациями.