Библиотека ScrollMagic предназначена для управления
анимациями и элементами страницы в зависимости от позиции скролла. Одной
из частых задач является активация пунктов меню при
достижении соответствующих секций на странице. Для реализации этого
создаются сцены (Scene) и контроллер
(Controller), которые отслеживают положение прокрутки и
меняют состояние элементов интерфейса.
Для работы с ScrollMagic требуется создать контроллер, который будет отслеживать прокрутку страницы и управлять всеми сценами:
// Инициализация контроллера
var controller = new ScrollMagic.Controller();
Контроллер может быть стандартным или расширенным, с поддержкой горизонтального скролла или кастомных опций. Основная роль – связывать сцены с прокруткой страницы.
Каждая секция страницы должна иметь сцену, которая активирует соответствующий пункт меню при попадании секции в зону видимости. Основные параметры сцены:
triggerElement – элемент, при достижении которого
срабатывает сцена.duration – длина сцены, определяющая диапазон
прокрутки, в котором элемент активен.triggerHook – точка на экране, где срабатывает триггер
(значения от 0 до 1; 0 — верх страницы, 1 — низ страницы, 0.5 —
центр).Пример создания сцены:
var scene = new ScrollMagic.Scene({
triggerElement: "#section1",
duration: "100%",
triggerHook: 0.25
})
.setClassToggle("#menu-item-1", "active") // добавляет класс "active" к пункту меню
.addTo(controller); // привязывает сцену к контроллеру
Метод setClassToggle(element, className) позволяет
автоматически добавлять и удалять CSS-класс при активации сцены. Это
ключевой способ реализовать подсветку пунктов меню без необходимости
писать сложные обработчики скролла вручную.
Преимущества такого подхода:
Для удобства можно использовать цикл, чтобы создать сцены для всех секций страницы и связать их с пунктами меню:
var sections = document.querySelectorAll("section");
var menuItems = document.querySelectorAll("#menu li");
sections.forEach(function(section, index){
new ScrollMagic.Scene({
triggerElement: section,
duration: section.offsetHeight,
triggerHook: 0.3
})
.setClassToggle(menuItems[index], "active")
.addTo(controller);
});
В этом примере каждая секция получает свою сцену, а пункт меню
подсвечивается при попадании секции в область видимости, определяемую
triggerHook.
Для более точной работы с длинными секциями и плавными эффектами
можно использовать комбинацию duration и
offset:
new ScrollMagic.Scene({
triggerElement: "#section2",
offset: 50, // отступ сверху для срабатывания сцены
duration: "80%", // активность сцены на 80% высоты секции
triggerHook: 0.2
})
.setClassToggle("#menu-item-2", "active")
.addTo(controller);
offset позволяет смещать начало активации сцены
относительно верхнего края триггерного элемента, а duration
задаёт диапазон, в котором пункт меню остаётся активным.
Если используется библиотека для плавного скролла (например,
GSAP или нативный scroll-behavior), необходимо
учитывать, что ScrollMagic отслеживает фактическое положение скролла. В
таких случаях рекомендуется:
scrollContainer в контроллер:var controller = new ScrollMagic.Controller({
container: "#scroll-container"
});
.on("progress", callback) или
.on("enter leave", callback) для динамического управления
классами меню.GSAP с .setTween().triggerElement,
duration, triggerHook.setClassToggle для управления состоянием
меню.offset для точной
настройки активации.Такой подход обеспечивает полностью автоматическую подсветку пунктов меню при скролле с полной поддержкой обратного движения и адаптацией под любые размеры экранов.