ScrollMagic предоставляет мощный инструментарий для управления анимациями и событиями на основе прокрутки страницы. Якорная навигация — это один из ключевых сценариев использования библиотеки, когда положение страницы автоматически отслеживается и элементы интерфейса реагируют на текущий скролл.
Ключевая идея: каждая секция страницы выступает в
роли «якоря», и при достижении этого якоря активируются соответствующие
анимации или меняется состояние меню. Для реализации этого используются
сцены (Scene) и контроллеры (Controller).
Контроллер является центральным элементом библиотеки, который отслеживает скролл и управляет всеми сценами.
var controller = new ScrollMagic.Controller({
globalSceneOptions: {
triggerHook: 0.5, // Положение триггера на экране (0 — верх, 1 — низ)
duration: '100%' // Длина сцены, можно указать пиксели или процент высоты окна
}
});
Особенности настроек:
triggerHook определяет, где на экране срабатывает
событие.duration задаёт длину сцены, что позволяет создавать
плавные эффекты при скролле.globalSceneOptions упрощает настройку одинаковых
параметров для нескольких сцен.Каждому элементу, который будет использоваться как якорь, создаётся сцена:
var scene = new ScrollMagic.Scene({
triggerElement: "#section1" // ID или класс якорного блока
})
.setClassToggle("#nav-link1", "active") // Добавление класса активного состояния
.addTo(controller); // Подключение сцены к контроллеру
Пояснения:
triggerElement — элемент DOM, при достижении которого
срабатывает сцена.setClassToggle — метод для изменения классов элементов
меню при достижении якоря.addTo(controller) подключает сцену к контроллеру, делая
её активной.Для плавной навигации часто требуется, чтобы активный класс оставался
до следующего якоря. Это достигается за счёт указания
duration в сцене:
var scene = new ScrollMagic.Scene({
triggerElement: "#section2",
duration: document.querySelector("#section2").offsetHeight
})
.setClassToggle("#nav-link2", "active")
.addTo(controller);
Особенности:
window.addEventListener('resize', function() {
controller.update(true);
});
Чтобы при клике на элемент меню происходила анимация скролла к
соответствующей секции, используется метод scrollTo
контроллера:
controller.scrollTo(function(target) {
TweenMax.to(window, 1, {
scrollTo: {y: target, offsetY: 50} // offsetY — дополнительное смещение
});
});
document.querySelectorAll("#nav a").forEach(link => {
link.addEventListener("click", function(e) {
e.preventDefault();
var targetId = this.getAttribute("href");
controller.scrollTo(targetId);
});
});
Пояснения:
offsetY позволяет компенсировать фиксированные шапки
или дополнительные отступы.scrollTo интегрируется с якорными сценами, сохраняя
синхронизацию активного состояния меню.Для страниц с большим количеством секций рекомендуется использовать цикл для создания сцен динамически:
document.querySelectorAll(".section").forEach((section, index) => {
new ScrollMagic.Scene({
triggerElement: section,
duration: section.offsetHeight
})
.setClassToggle(`#nav-link${index+1}`, "active")
.addTo(controller);
});
Преимущества подхода:
ScrollMagic автоматически определяет направление скролла. В сочетании
с методами on("enter") и on("leave") можно
создавать сложные эффекты:
scene.on("enter", function() {
console.log("Секция активна");
});
scene.on("leave", function() {
console.log("Секция не активна");
});
Особенности:
enter срабатывает при входе в сцену, leave
— при выходе.Якорная навигация часто комбинируется с анимациями контента. Для этого сцены ScrollMagic интегрируются с библиотекой GSAP:
var tween = TweenMax.from("#section3-content", 1, {opacity: 0, y: 50});
var scene = new ScrollMagic.Scene({
triggerElement: "#section3",
triggerHook: 0.7
})
.setTween(tween)
.addTo(controller);
Пояснения:
setTween связывает анимацию с позицией прокрутки.triggerHook позволяет контролировать
момент начала анимации относительно видимой области.Этот подход обеспечивает точную, наглядную и плавную якорную навигацию, легко масштабируемую на большие страницы с множеством секций и сложными анимационными эффектами.