Locomotive Scroll предоставляет мощный механизм для плавного скроллинга и параллакс-эффектов, однако его использование может создавать трудности для пользователей с ограниченными возможностями, включая людей, использующих вспомогательные технологии вроде экранных читалок или клавиатурного навигации. Поэтому важно реализовать корректное отключение библиотеки в таких случаях.
Существует несколько критериев, по которым скроллинг Locomotive Scroll следует отключить:
prefers-reduced-motion, который отражает
желание пользователя минимизировать анимации.const prefersReducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
Если prefersReducedMotion равен true,
использование Locomotive Scroll стоит отключить.
Для безопасного использования библиотеки рекомендуется создавать экземпляр Locomotive Scroll только при соблюдении условий доступности:
import LocomotiveScroll from 'locomotive-scroll';
let scrollInstance = null;
if (!prefersReducedMotion && !isTouchDevice()) {
scrollInstance = new LocomotiveScroll({
el: document.querySelector('[data-scroll-container]'),
smooth: true,
multiplier: 1,
smartphone: {
smooth: false
},
tablet: {
smooth: false
}
});
}
function isTouchDevice() {
return ('ontouchstart' in window) || navigator.maxTouchPoints > 0;
}
Ключевые моменты:
prefersReducedMotion предотвращает включение
анимаций для пользователей, предпочитающих минимальное движение.smartphone.smooth и
tablet.smooth позволяет локально отключать плавный
скроллинг, оставляя стандартную прокрутку.Иногда необходимо отключать Locomotive Scroll в процессе работы страницы, например, при изменении настроек доступности или при адаптивной подгрузке контента:
function destroyScroll() {
if (scrollInstance) {
scrollInstance.destroy();
scrollInstance = null;
document.documentElement.style.overflow = '';
}
}
window.matchMedia("(prefers-reduced-motion: reduce)").addEventListener('change', e => {
if (e.matches) {
destroyScroll();
} else {
initScroll();
}
});
function initScroll() {
if (!scrollInstance) {
scrollInstance = new LocomotiveScroll({
el: document.querySelector('[data-scroll-container]'),
smooth: true
});
}
}
Особенности реализации:
destroy() полностью удаляет обработчики
библиотеки и возвращает документ к нативной прокрутке.Locomotive Scroll управляет свойствами transform
контейнера, поэтому при отключении необходимо корректно вернуть нативный
скролл:
[data-scroll-container] {
overflow: auto;
height: 100vh;
transform: none !important;
}
transform: none гарантирует, что элементы вернутся в
свои исходные позиции.overflow: auto восстанавливает стандартное поведение
прокрутки.Locomotive Scroll может нарушать привычное перемещение по странице с
помощью клавиш Tab, Arrow и
PageUp/PageDown. Для пользователей, полагающихся на
клавиатуру, важно отключить кастомное управление скроллом или
реализовать соответствующие обработчики:
document.addEventListener('keydown', (e) => {
if (!scrollInstance) return;
const step = 100;
switch(e.key) {
case 'ArrowDown':
scrollInstance.scrollTo(window.scrollY + step);
e.preventDefault();
break;
case 'ArrowUp':
scrollInstance.scrollTo(window.scrollY - step);
e.preventDefault();
break;
}
});
scrollInstance
обработчики игнорируются, что сохраняет стандартное поведение
клавиш.prefers-reduced-motion для пользователей с
ограниченными возможностями.destroy() и повторную инициализацию.Такой подход обеспечивает совместимость Locomotive Scroll с принципами доступности, снижает риск конфликтов с вспомогательными технологиями и делает интерфейс удобным для всех категорий пользователей.