ScrollMagic — это библиотека для управления анимациями на основе прокрутки страницы. Она позволяет создавать динамичные эффекты, синхронизированные с движением пользователя, что делает интерфейсы более интерактивными и выразительными. Адаптация анимаций под разные устройства и экраны является ключевым аспектом при работе с этой библиотекой, так как поведение прокрутки и размеры элементов могут сильно различаться.
Сцена (Scene) в ScrollMagic является основным блоком для анимации. Она связывает элемент DOM с анимацией, определяя момент её запуска и длительность. Для адаптации анимации важно динамически определять параметры сцены:
const scene = new ScrollMagic.Scene({
triggerElement: "#section1",
duration: window.innerHeight * 0.8, // длительность пропорциональна высоте окна
triggerHook: 0.5 // запуск в середине экрана
})
.setTween("#animateElement", { y: 200, opacity: 1 })
.addTo(controller);
Ключевой момент: использование
window.innerHeight или window.innerWidth
позволяет задавать длительность и смещение сцены пропорционально экрану,
обеспечивая одинаковое восприятие анимации на разных устройствах.
ScrollMagic не имеет встроенной поддержки медиазапросов, поэтому адаптация обычно достигается через пересоздание сцен при изменении размеров окна.
let scene;
function createScene() {
const duration = window.innerWidth < 768 ? 300 : 600;
if(scene) scene.destroy(true);
scene = new ScrollMagic.Scene({
triggerElement: "#section2",
duration: duration,
triggerHook: 0.7
})
.setTween("#animateBox", { x: 100 })
.addTo(controller);
}
window.addEventListener('resize', createScene);
createScene();
Важное замечание: метод destroy(true)
удаляет сцену и её связь с контроллером, предотвращая накопление старых
сцен и конфликт анимаций.
Для адаптивного дизайна часто необходимо учитывать размеры самого элемента. ScrollMagic легко интегрируется с библиотеками анимаций вроде GSAP, что позволяет рассчитывать параметры анимации динамически:
const element = document.querySelector("#dynamicElement");
const elementHeight = element.offsetHeight;
const scene = new ScrollMagic.Scene({
triggerElement: element,
duration: elementHeight * 1.5
})
.setTween("#dynamicElement", { y: elementHeight / 2 })
.addTo(controller);
Суть: длительность и смещение зависят от размера элемента, что сохраняет пропорции анимации независимо от контента и разрешения экрана.
Метод setPin() фиксирует элемент на экране на время
сцены. Для адаптивных интерфейсов важно задавать параметр
pushFollowers и динамически управлять размерами:
const pinScene = new ScrollMagic.Scene({
triggerElement: "#header",
duration: window.innerHeight
})
.setPin("#header", { pushFollowers: false })
.addTo(controller);
Особенности:
pushFollowers: false предотвращает сдвиг остальных
элементов страницы, что особенно важно на мобильных устройствах.duration позволяет пину корректно
работать при изменении высоты экрана.Контроллер управляет всеми сценами и их синхронизацией. Для адаптивного дизайна рекомендуется использовать один контроллер на страницу и пересоздавать сцены при изменении размеров окна:
const controller = new ScrollMagic.Controller();
window.addEventListener('resize', () => {
// пересоздание всех сцен
scenes.forEach(scene => {
scene.destroy(true);
scene.addTo(controller);
});
});
Преимущество: один контроллер обеспечивает согласованное управление анимациями, а пересоздание сцен при ресайзе гарантирует корректное поведение на всех устройствах.
Для адаптивной анимации полезно использовать CSS-переменные, чтобы управлять параметрами анимации из стилей:
:root {
--animation-distance: 200px;
}
@media (max-width: 768px) {
:root {
--animation-distance: 100px;
}
}
const distance = getComputedStyle(document.documentElement)
.getPropertyValue('--animation-distance');
const scene = new ScrollMagic.Scene({
triggerElement: "#responsive",
duration: distance
})
.setTween("#responsive", { y: distance })
.addTo(controller);
Преимущество: можно централизованно управлять параметрами анимации через CSS, что упрощает поддержку адаптивного дизайна.
При адаптивных анимациях важно учитывать производительность на мобильных устройствах:
resize.requestAnimationFrame для тяжёлых
анимаций.let resizeTimeout;
window.addEventListener('resize', () => {
clearTimeout(resizeTimeout);
resizeTimeout = setTimeout(createScene, 200);
});
Суть: дебаунс ресайза снижает нагрузку на пересоздание сцен и анимации, сохраняя плавность на слабых устройствах.
ScrollMagic предоставляет гибкие инструменты для адаптации анимаций под любые размеры экрана и устройства. Комбинация динамического расчёта параметров, пересоздания сцен, пинов и CSS-переменных позволяет создавать интерактивные и отзывчивые интерфейсы, полностью подстраивающиеся под поведение пользователя и размеры элементов.