Библиотека Locomotive Scroll реализует плавную
прокрутку за счёт перехвата стандартного поведения браузера и
использования трансформаций (transform: translate). Такой
подход улучшает визуальное восприятие, но создаёт серьёзные ограничения
для вспомогательных технологий, включая скринридеры.
Скринридеры опираются на нативный поток документа и стандартную прокрутку, поэтому вмешательство в механизм скроллинга требует дополнительных мер для сохранения доступности.
При использовании Locomotive Scroll контент визуально перемещается, но DOM-структура остаётся статичной. Это приводит к рассинхронизации:
Трансформации через CSS могут вызывать:
Скринридеры ориентируются на scrollTop/scrollY, но Locomotive Scroll использует виртуальный скролл. В результате:
Контент должен оставаться:
header,
main, section, nav)Использование визуальных эффектов не должно менять порядок элементов в DOM.
Рекомендуется:
Пример:
const scroll = new LocomotiveScroll({
el: document.querySelector('.scroll-container'),
smooth: true
});
Контейнер .scroll-container не должен содержать
критически важную навигацию.
Пользователи с ограничениями могут включать системную настройку уменьшения анимации.
Проверка через CSS:
@media (prefers-reduced-motion: reduce) {
.scroll-container {
transform: none !important;
}
}
Отключение Locomotive Scroll в Jav * aScript:
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
if (!prefersReducedMotion) {
new LocomotiveScroll({
el: document.querySelector('.scroll-container'),
smooth: true
});
}
При переходе по ссылкам или кнопкам необходимо:
Пример:
document.querySelectorAll('a[href^="#"]').forEach(link => {
link.addEventListener('click', e => {
e.preventDefault();
const target = document.querySelector(link.getAttribute('href'));
scroll.scrollTo(target);
target.setAttribute('tabindex', '-1');
target.focus();
});
});
ARIA помогает компенсировать недостатки кастомного скролла:
aria-live — уведомления о динамических измененияхaria-hidden — скрытие декоративных элементовrole="region" — обозначение областейПример:
<section role="region" aria-labelledby="section-title">
<h2 id="section-title">Раздел</h2>
</section>
Фокус должен быть:
Пример CSS:
:focus {
outline: 2px solid #000;
outline-offset: 4px;
}
Locomotive Scroll предоставляет событие scroll, которое
можно использовать для синхронизации состояния:
scroll.on('scroll', (args) => {
// args.scroll.y — текущая позиция
});
Для скринридеров важно:
В условиях, где доступность критична, необходимо предусматривать fallback:
Простейший подход:
if (window.innerWidth > 1024) {
new LocomotiveScroll({
el: document.querySelector('.scroll-container'),
smooth: true
});
}
Ключевые инструменты:
Проверяются:
Locomotive Scroll изначально не проектировался как полностью доступное решение. Основные ограничения:
Поэтому в проектах с высокими требованиями к доступности рекомендуется:
Наиболее безопасная архитектура:
Такой подход позволяет сохранить: