Библиотека ScrollMagic предназначена для управления анимацией и поведением элементов при прокрутке страницы. Помимо стандартного взаимодействия через скролл мышью, возможно реализовать управление сценами с помощью клавиатуры, что особенно полезно для веб-презентаций, интерактивных лендингов и интерфейсов с полноэкранной прокруткой.
Клавиатурная навигация в ScrollMagic строится на сочетании слушателей событий клавиатуры и управления сценами через контроллер.
const controller = new ScrollMagic.Controller();
const scene1 = new ScrollMagic.Scene({
triggerElement: "#section1",
duration: "100%"
}).setClassToggle("#section1", "active")
.addTo(controller);
const scene2 = new ScrollMagic.Scene({
triggerElement: "#section2",
duration: "100%"
}).setClassToggle("#section2", "active")
.addTo(controller);
Ключевые моменты:
ScrollMagic.Controller() управляет всеми сценами на
странице.triggerElement задаёт DOM-элемент, при достижении
которого сцена активируется.duration может быть задан в пикселях или процентах от
высоты окна.setClassToggle позволяет менять состояние элемента
(например, активный/неактивный).Для навигации используется событие keydown:
let currentSceneIndex = 0;
const scenes = [scene1, scene2];
document.addEventListener("keydown", function(e) {
switch (e.key) {
case "ArrowDown":
case "PageDown":
goToNextScene();
break;
case "ArrowUp":
case "PageUp":
goToPreviousScene();
break;
}
});
Особенности:
ArrowDown и PageDown перемещают
вперёд.ArrowUp и PageUp перемещают назад.currentSceneIndex хранит текущую сцену для
синхронизации.Функции перехода:
function goToNextScene() {
if (currentSceneIndex < scenes.length - 1) {
currentSceneIndex++;
scrollToScene(currentSceneIndex);
}
}
function goToPreviousScene() {
if (currentSceneIndex > 0) {
currentSceneIndex--;
scrollToScene(currentSceneIndex);
}
}
function scrollToScene(index) {
const scene = scenes[index];
const offset = scene.triggerElement().offsetTop;
window.scrollTo({
top: offset,
beh * avior: "smooth"
});
}
Важные моменты:
scene.triggerElement().offsetTop позволяет узнать
вертикальное смещение сцены.window.scrollTo({ beh * avior: "smooth" }) обеспечивает
плавный скролл.При наличии форм или кнопок важно не блокировать стандартное поведение клавиш. Можно добавить проверку:
document.addEventListener("keydown", function(e) {
const activeTag = document.activeElement.tagName.toLowerCase();
if (activeTag === "input" || activeTag === "textarea") return;
switch (e.key) {
case "ArrowDown":
case "PageDown":
goToNextScene();
break;
case "ArrowUp":
case "PageUp":
goToPreviousScene();
break;
}
});
Пояснение:
document.activeElement отслеживает текущий элемент с
фокусом.Часто сцены ScrollMagic управляют анимациями через GSAP:
const tween = gsap.from("#section1 .box", {
y: 100,
opacity: 0,
duration: 1
});
const scene = new ScrollMagic.Scene({
triggerElement: "#section1",
duration: "100%"
}).setTween(tween)
.addTo(controller);
При клавиатурной навигации важно синхронизировать положение скролла с анимацией:
function scrollToScene(index) {
const scene = scenes[index];
const offset = scene.triggerElement().offsetTop;
gsap.to(window, { scrollTo: offset, duration: 1 });
}
Особенности:
gsap.to(window, { scrollTo }) позволяет
плавно перемещать страницу и одновременно проигрывать сцены.Можно объединять управление мышью и клавиатурой, сохраняя текущую сцену:
controller.scrollTo(function(target) {
gsap.to(window, { scrollTo: target, duration: 1 });
});
Теперь вызов controller.scrollTo(scene.triggerElement())
можно использовать как для клика по кнопке, так и для клавиш
ArrowDown / ArrowUp.
Эти подходы позволяют построить полнофункциональную клавиатурную навигацию в ScrollMagic, интегрированную с анимациями и плавным скроллом, без конфликтов с интерактивными элементами на странице.