ScrollMagic изначально разрабатывался для управления анимациями на основе скролла страницы, но возможности библиотеки можно расширять до обработки жестов и свайпов, особенно при интеграции с сенсорными устройствами. Жесты в ScrollMagic реализуются через события, которые отслеживают положение и движение указателя или пальца на экране.
Для работы с жестами требуется подключить саму библиотеку ScrollMagic и, при необходимости, GSAP для анимаций:
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.8/ScrollMagic.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.8/plugins/animation.gsap.min.js"></script>
Для сенсорного контроля часто используют Hammer.js или
нативные события touchstart, touchmove и
touchend.
Контроллер в ScrollMagic управляет всеми сценами, включая сцены с жестами:
const controller = new ScrollMagic.Controller();
Сцена создаётся с параметрами triggerElement,
duration и triggerHook, которые задают условия
активации анимации:
const scene = new ScrollMagic.Scene({
triggerElement: "#section1",
duration: 300,
triggerHook: 0.5
});
Для отслеживания свайпов используют события touchstart и
touchend. Разница координат по оси X или Y определяет
направление свайпа.
let startX = 0;
let startY = 0;
document.addEventListener('touchstart', function(e) {
startX = e.touches[0].clientX;
startY = e.touches[0].clientY;
}, false);
document.addEventListener('touchend', function(e) {
const endX = e.changedTouches[0].clientX;
const endY = e.changedTouches[0].clientY;
const deltaX = endX - startX;
const deltaY = endY - startY;
if (Math.abs(deltaX) > Math.abs(deltaY)) {
if (deltaX > 50) {
handleSwipe('right');
} else if (deltaX < -50) {
handleSwipe('left');
}
} else {
if (deltaY > 50) {
handleSwipe('down');
} else if (deltaY < -50) {
handleSwipe('up');
}
}
}, false);
Функция handleSwipe может запускать ScrollMagic-сцены
или анимации GSAP:
function handleSwipe(direction) {
switch(direction) {
case 'left':
gsap.to("#box", {x: -200, duration: 1});
break;
case 'right':
gsap.to("#box", {x: 200, duration: 1});
break;
case 'up':
gsap.to("#box", {y: -200, duration: 1});
break;
case 'down':
gsap.to("#box", {y: 200, duration: 1});
break;
}
}
Сцену можно запускать не только по скроллу, но и по событию свайпа,
используя метод scene.trigger():
const swipeScene = new ScrollMagic.Scene({
triggerElement: "#section2",
duration: 400
}).setTween(gsap.to("#circle", {scale: 1.5, rotation: 360}));
function handleSwipe(direction) {
if (direction === 'up') {
swipeScene.trigger();
}
}
Можно реализовать кастомную прокрутку с плавным скроллом через свайпы, изменяя позицию контроллера ScrollMagic:
let scrollPosition = 0;
function handleSwipe(direction) {
if (direction === 'up') scrollPosition += 200;
if (direction === 'down') scrollPosition -= 200;
controller.scrollTo(scrollPosition);
}
// Поддержка плавного скролла
controller.scrollTo(function(newPos) {
gsap.to(window, {scrollTo: {y: newPos}, duration: 1});
});
Сочетание ScrollMagic, GSAP и жестов позволяет создавать сложные интерактивные сцены:
Пример параллакса:
function handleSwipe(direction) {
const distance = direction === 'up' ? -100 : 100;
gsap.to("#background", {y: "+=" + distance, duration: 0.8, ease: "power2.out"});
}
will-change для элементов, подвергающихся
частой трансформации.touchmove, добавляя
passive: true к событию:document.addEventListener('touchmove', function(e){}, {passive: true});
Hammer.js для распознавания направлений и
скорости, чтобы снизить количество вычислений вручную.Controller.touchstart и
touchend для определения направления свайпа.controller.scrollTo().passive события и will-change.Эта структура позволяет комбинировать скролл и жесты, обеспечивая гибкую и интерактивную анимацию интерфейса с использованием ScrollMagic.