Библиотека Locomotive Scroll реализует скроллинг
через трансформации (transform: translate3d), а не через
стандартный поток документа. Это создает визуальный эффект плавности, но
нарушает нативное поведение браузера, на котором основаны многие
механизмы доступности.
Ключевая проблема — разрыв между визуальным положением элементов и их фактическим положением в DOM. Браузер продолжает считать, что страница находится в исходной позиции, в то время как пользователь видит смещённый контент.
Это приводит к следующим последствиям:
#anchor)scrollTo, scrollIntoView)При использовании кастомного скролла фокусируемые элементы (ссылки, кнопки, формы) могут оказаться вне видимой области, даже если браузер считает их доступными.
Рекомендации:
element.addEventListener('focus', () => {
scroll.scrollTo(element);
});
focusin:document.addEventListener('focusin', (e) => {
scroll.scrollTo(e.target);
});
transform, если они
могут получить фокусПо умолчанию Locomotive Scroll не обрабатывает:
Это нарушает привычные сценарии навигации.
Добавление поддержки:
document.addEventListener('keydown', (e) => {
const step = 100;
switch (e.key) {
case 'ArrowDown':
scroll.scrollTo(scroll.scroll.instance.scroll.y + step);
break;
case 'ArrowUp':
scroll.scrollTo(scroll.scroll.instance.scroll.y - step);
break;
}
});
Анимации могут вызывать дискомфорт у пользователей с вестибулярной
чувствительностью. CSS-медиа-запрос prefers-reduced-motion
позволяет отключать анимации.
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
if (!prefersReducedMotion) {
const scroll = new LocomotiveScroll({
el: document.querySelector('[data-scroll-container]'),
smooth: true
});
}
Альтернативный подход — полное отключение библиотеки и возврат к нативному скроллу.
Экранные читалки ориентируются на DOM, а не на визуальное представление. При использовании Locomotive Scroll:
Практики улучшения:
aria-hidden,
aria-live)opacity: 0 или
transformПоисковые роботы анализируют HTML-разметку, а не визуальные трансформации. Это означает:
Locomotive Scroll часто используется вместе с ленивой загрузкой
(lazy loading). Если контент появляется только при скролле,
поисковый робот может его не увидеть.
Риск:
<div data-scroll data-scroll-call="loadContent"></div>
Контент, загружаемый через JS, может не индексироваться.
Решения:
noscript как fallback:<noscript>
<div>Контент без JavaScript</div>
</noscript>
Несмотря на визуальные эффекты, структура HTML должна оставаться семантически корректной:
header, main, section,
articleh1–h6 в логическом порядкеul, ol) вместо декоративных
блоковЭто критически важно для:
Locomotive Scroll увеличивает нагрузку за счёт:
requestAnimationFrame)transform)Это влияет на метрики:
Оптимизация:
data-scrollАнимации, основанные на скролле, могут вызывать неожиданные сдвиги элементов.
Пример проблемы:
.element {
transform: translateY(100px);
}
При загрузке элемент “прыгает”, что ухудшает CLS.
Решение:
will-change осторожноСтандартные якоря (#section) не работают корректно, так
как браузер не управляет прокруткой.
Реализация:
document.querySelectorAll('a[href^="#"]').forEach(link => {
link.addEventListener('click', (e) => {
e.preventDefault();
const target = document.querySelector(link.getAttribute('href'));
scroll.scrollTo(target);
});
});
Для SEO важно:
Если JavaScript отключен:
Подход progressive enhancement:
if ('scrollBehavior' in document.documentElement.style) {
// подключение кастомного скролла
}
Использование Locomotive Scroll оправдано в:
Ограничения в:
Ключевой принцип — разделение:
Избыточная анимация и вмешательство в нативное поведение прокрутки почти всегда ухудшают доступность и могут косвенно влиять на SEO через пользовательские метрики.