ScrollMagic позволяет управлять анимацией элементов в зависимости от
позиции скролла страницы. По умолчанию библиотека отслеживает
вертикальный скролл, но для более сложных проектов может понадобиться
поддержка горизонтального направления или одновременное использование
обоих направлений. Основной объект, определяющий сцену, — это
ScrollMagic.Scene, который реагирует на
событие scroll, а его свойства duration,
offset и triggerElement задают, когда и как
будет происходить анимация.
Для работы в обоих направлениях важно понимать, что
ScrollMagic не делает преобразование осей
автоматически. Если проект включает горизонтальный скролл,
необходимо явно указывать это через настройку
vertical: false при инициализации контроллера:
var controller = new ScrollMagic.Controller({vertical: false});
Одним из ключевых подходов является создание отдельного контроллера для каждого направления:
var verticalController = new ScrollMagic.Controller({vertical: true});
var horizontalController = new ScrollMagic.Controller({vertical: false});
Такой подход предотвращает конфликт сцен и позволяет точно управлять
анимациями для каждой оси. При этом сцены связываются с нужным
контроллером через метод .addTo(controller):
var verticalScene = new ScrollMagic.Scene({
triggerElement: "#verticalTrigger",
duration: 500
}).setTween("#verticalElement", {opacity: 1}).addTo(verticalController);
var horizontalScene = new ScrollMagic.Scene({
triggerElement: "#horizontalTrigger",
duration: 800
}).setTween("#horizontalElement", {x: 200}).addTo(horizontalController);
При одновременной работе вертикального и горизонтального скролла
важно минимизировать нагрузку на прослушку событий
scroll:
requestAnimationFrame или сторонние утилиты для
троттлинга:window.addEventListener('scroll', throttle(updateScenes, 16));
tweenChanges Свойство
tweenChanges: true позволяет плавно обновлять значения
анимации без лишних пересчетов, что особенно критично при больших сценах
с параллакс-эффектами.var scene = new ScrollMagic.Scene({
triggerElement: "#element",
duration: 600
})
.setTween("#animatedElement", {x: 300}, {tweenChanges: true})
.addTo(controller);
transform: translateX и
translateY, а не left или top,
чтобы задействовать GPU и минимизировать перерисовку.Для проектов, где элементы реагируют как на вертикальный, так и на
горизонтальный скролл, стоит использовать события
progress и update для синхронизации
анимаций:
horizontalScene.on("progress", function(event) {
var progress = event.progress;
verticalScene.progress(progress); // синхронизируем прогресс вертикальной сцены
});
Это позволяет создавать координированные анимации, например, слайдеры с параллаксом или сложные интерактивные эффекты, где положение по X влияет на движение по Y.
Для горизонтального скролла часто используют кастомные контейнеры,
где overflow-x: scroll. В этом случае контроллеру
необходимо указать container:
var horizontalController = new ScrollMagic.Controller({
vertical: false,
container: "#scrollContainer"
});
Сцены внутри этого контейнера будут отслеживать прокрутку именно
элемента #scrollContainer, а не всей страницы. Это
позволяет создавать локальные горизонтальные секции без влияния на
основной вертикальный скролл.
ScrollMagic идеально работает с GSAP, особенно при анимациях для обоих направлений. Важные моменты:
x и
xPercent.y и yPercent.gsap.timeline() позволяет объединять
несколько анимаций и контролировать их через единую сцену.var tl = gsap.timeline();
tl.to("#element", {x: 400, duration: 1})
.to("#element", {y: 200, duration: 1});
var scene = new ScrollMagic.Scene({
triggerElement: "#trigger",
duration: 1000
})
.setTween(tl)
.addTo(controller);
Такой подход обеспечивает плавные и отзывчивые анимации независимо от направления скролла.
При оптимизации для обоих направлений важно учитывать:
touchstart,
touchmove) могут конфликтовать с горизонтальными
контейнерами.passive: true для событий скролла
улучшает отзывчивость и предотвращает лаги.Эта методология позволяет создавать сложные, интерактивные страницы, где вертикальный и горизонтальный скролл взаимодействуют плавно, сцены синхронизированы, а производительность остаётся высокой даже при большом количестве анимаций.