Фиксированное меню является распространённым элементом интерфейса, который остаётся видимым при прокрутке страницы. С помощью ScrollMagic можно управлять поведением меню и создавать динамические эффекты появления, фиксации и скрытия при скролле.
Для работы с ScrollMagic необходимо подключить библиотеку и её зависимости:
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.13.0/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>
gsap.min.js — библиотека для анимаций, используется
вместе с ScrollMagic.ScrollMagic.min.js — основной скрипт библиотеки.animation.gsap.min.js — плагин для интеграции с
GSAP-анимациями.Controller управляет всеми сценами на странице:
const controller = new ScrollMagic.Controller();
Controller необходим для того, чтобы сцены корректно отслеживали прокрутку и активировались в нужный момент.
Основная логика фиксации меню реализуется через ScrollMagic.Scene. Пример:
const menu = document.querySelector('.menu');
const scene = new ScrollMagic.Scene({
triggerElement: '#trigger', // элемент, с которого начинается фиксация
triggerHook: 0, // верх страницы (0 — начало, 1 — конец)
duration: 300 // длина действия сцены в пикселях
})
.setPin(menu) // фиксирование элемента
.addTo(controller); // добавление сцены в контроллер
Для более плавного поведения меню можно добавить GSAP-анимацию:
const tween = gsap.fromTo(menu,
{ y: -100, opacity: 0 },
{ y: 0, opacity: 1, duration: 0.5 }
);
const sceneWithAnimation = new ScrollMagic.Scene({
triggerElement: '#trigger',
triggerHook: 0
})
.setTween(tween)
.addTo(controller);
gsap.fromTo позволяет задавать начальное и конечное
состояние.Можно объединить setPin и анимацию в одной сцене для комплексного эффекта:
const combinedScene = new ScrollMagic.Scene({
triggerElement: '#trigger',
triggerHook: 0,
duration: 400
})
.setPin(menu)
.setTween(gsap.to(menu, { backgroundColor: '#333', duration: 0.5 }))
.addTo(controller);
Для корректной работы на мобильных устройствах важно учитывать:
if (window.innerWidth < 768) {
scene.destroy(); // отключение фиксации на маленьких экранах
}
new ScrollMagic.Scene({
triggerElement: 'body',
offset: 200, // меню появится после 200px прокрутки
triggerHook: 0
})
.setClassToggle(menu, 'visible') // добавление класса CSS
.addTo(controller);
let lastScroll = 0;
window.addEventListener('scroll', () => {
const current = window.scrollY;
if (current > lastScroll) {
menu.classList.add('hidden');
} else {
menu.classList.remove('hidden');
}
lastScroll = current;
});
setPin только для важных элементов, так
как это влияет на рендер страницы.transform, opacity) вместо изменения
top, left и height.triggerElement даже при простом
фиксировании, иначе сцена не сработает корректно.Эти приёмы позволяют создавать сложные и динамичные фиксированные меню, управляемые скроллом, с плавными анимациями и адаптивной логикой для различных устройств.