Smooth Scroll — библиотека для плавной прокрутки страниц на JavaScript, изначально ориентированная на навигацию с помощью ссылок и скроллинг мышью. Однако интеграция управления с клавиатуры позволяет создавать более доступный и удобный интерфейс, особенно для пользователей, которые предпочитают клавиатурные сокращения или используют экранные читалки.
В JavaScript для отслеживания нажатий клавиш применяются события
keydown, keyup и keypress. Для
управления прокруткой чаще всего используется keydown, так
как оно срабатывает в момент нажатия клавиши и позволяет предотвратить
стандартное поведение браузера с помощью
event.preventDefault().
document.addEventListener('keydown', function(event) {
switch(event.key) {
case 'ArrowUp':
// действия для прокрутки вверх
break;
case 'ArrowDown':
// действия для прокрутки вниз
break;
case 'PageUp':
// прокрутка на одну страницу вверх
break;
case 'PageDown':
// прокрутка на одну страницу вниз
break;
}
});
Ключевые моменты:
ArrowUp и ArrowDown — стандартные клавиши
для вертикального скроллинга.PageUp и PageDown — позволяют прокручивать
контент на высоту видимой области.event.preventDefault() блокирует стандартный скролл
браузера и позволяет полностью контролировать анимацию.Smooth Scroll предоставляет метод
animateScroll.scrollTo() для программного управления
прокруткой. Для клавиатуры необходимо определить величину смещения и
продолжительность анимации.
const scroll = new SmoothScroll();
document.addEventListener('keydown', function(event) {
let distance = 100; // количество пикселей для прокрутки
switch(event.key) {
case 'ArrowUp':
scroll.animateScroll(window.pageYOffset - distance);
event.preventDefault();
break;
case 'ArrowDown':
scroll.animateScroll(window.pageYOffset + distance);
event.preventDefault();
break;
}
});
Особенности:
window.pageYOffset возвращает текущую позицию
прокрутки.animateScroll() принимает координату, до которой должна
прокрутиться страница.Smooth Scroll может работать не только по вертикали. Для
горизонтального скроллинга используются свойства scrollLeft
и метод animateScroll.scrollTo() с указанием горизонтальной
позиции.
document.addEventListener('keydown', function(event) {
let distance = 100;
if(event.key === 'ArrowLeft') {
scroll.animateScroll(window.pageXOffset - distance);
event.preventDefault();
}
if(event.key === 'ArrowRight') {
scroll.animateScroll(window.pageXOffset + distance);
event.preventDefault();
}
});
Примечание: Для элементов с горизонтальным скроллом
можно использовать element.scrollLeft вместо
window.pageXOffset.
Для сайтов с лендингами и одностраничными интерфейсами полезно реализовать переход по секциям с клавиатуры. Smooth Scroll позволяет прокручивать к конкретным якорям.
const scroll = new SmoothScroll();
const sections = document.querySelectorAll('section');
let currentIndex = 0;
document.addEventListener('keydown', function(event) {
if(event.key === 'ArrowDown') {
if(currentIndex < sections.length - 1) currentIndex++;
scroll.animateScroll(sections[currentIndex]);
event.preventDefault();
}
if(event.key === 'ArrowUp') {
if(currentIndex > 0) currentIndex--;
scroll.animateScroll(sections[currentIndex]);
event.preventDefault();
}
});
Особенности реализации:
currentIndex отслеживает текущую видимую секцию.Smooth Scroll поддерживает конфигурацию скорости и длительности анимации. Для клавиатуры важно выбирать более короткую длительность, чтобы реакция на нажатие клавиш была мгновенной, но при этом сохранялась плавность.
const scroll = new SmoothScroll({
speed: 500, // время анимации в миллисекундах
offset: 0, // смещение от верхней границы
easing: 'easeInOutCubic' // функция плавности
});
speed между 200–600 мс обеспечивает комфортное
управление.offset позволяет компенсировать фиксированные элементы,
например шапку.easing) обеспечивают естественный
вид движения.Для более сложных интерфейсов можно отслеживать сочетания клавиш,
например Shift + ArrowDown для ускоренной прокрутки.
document.addEventListener('keydown', function(event) {
let distance = event.shiftKey ? 300 : 100;
if(event.key === 'ArrowDown') {
scroll.animateScroll(window.pageYOffset + distance);
event.preventDefault();
}
if(event.key === 'ArrowUp') {
scroll.animateScroll(window.pageYOffset - distance);
event.preventDefault();
}
});
Преимущества:
Shift, Ctrl,
Alt) расширяет возможности интерфейса.Smooth Scroll с клавиатурой особенно полезен при навигации через
элементы с tabindex. Прокрутка к текущему элементу с
фокусом обеспечивает видимость активного блока.
document.addEventListener('focusin', function(event) {
if(event.target.tabIndex >= 0) {
scroll.animateScroll(event.target);
}
});
PageUp/PageDown.