Современные веб-приложения должны учитывать настройки
пользователей на уровне операционной системы, связанные с
доступностью. Одной из ключевых таких настроек является
prefers-reduced-motion. Этот медиа-запрос указывает на
предпочтение пользователя минимизировать анимации и
переходы, что критично для Smooth Scroll, так как плавная
прокрутка является анимацией.
prefers-reduced-motionВ CSS и JavaScript prefers-reduced-motion проверяется с
помощью медиа-запроса:
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
Для Smooth Scroll это означает возможность отключить или упростить плавную прокрутку, чтобы избежать неприятных ощущений у чувствительных пользователей.
Библиотека Smooth Scroll обычно инициализируется так:
import SmoothScroll from 'smooth-scroll';
const scroll = new SmoothScroll('a[href*="#"]', {
speed: 600,
speedAsDuration: true
});
Чтобы учесть prefers-reduced-motion, добавляется
проверка:
import SmoothScroll from 'smooth-scroll';
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
if (!prefersReducedMotion) {
const scroll = new SmoothScroll('a[href*="#"]', {
speed: 600,
speedAsDuration: true
});
} else {
// Альтернатива: мгновенная прокрутка
document.querySelectorAll('a[href*="#"]').forEach(anchor => {
anchor.addEventListener('click', e => {
e.preventDefault();
const target = document.querySelector(anchor.getAttribute('href'));
if (target) target.scrollIntoView({ beh * avior: 'auto' });
});
});
}
Ключевые моменты:
prefers-reduced-motion выполняется до
инициализации Smooth Scroll.Настройка prefers-reduced-motion может измениться во
время работы приложения. Для отслеживания изменений используется
слушатель:
const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)');
mediaQuery.addEventListener('change', (event) => {
if (event.matches) {
// Пользователь включил "уменьшение движения"
scroll.destroy(); // Отключение Smooth Scroll
} else {
// Пользователь выключил ограничение движения
scroll = new SmoothScroll('a[href*="#"]', { speed: 600, speedAsDuration: true });
}
});
.destroy() удаляет все обработчики Smooth Scroll
и возвращает прокрутку к стандартному поведению.Некоторые опции Smooth Scroll можно адаптировать, не отключая полностью анимацию:
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
const scroll = new SmoothScroll('a[href*="#"]', {
speed: prefersReducedMotion ? 0 : 600, // мгновенная прокрутка при reduced motion
easing: prefersReducedMotion ? 'linear' : 'easeInOutCubic'
});
speed: 0 или beh * avior: 'auto' — мгновенная
прокрутка без анимации.easing) может быть упрощена для
пользователей с ограничением движения.prefers-reduced-motion есть в Chrome,
Firefox, Safari, Edge.false по умолчанию.prefers-reduced-motion перед
инициализацией анимаций..destroy() при динамических
изменениях, чтобы корректно освобождать ресурсы.Эти подходы позволяют создавать веб-страницы с доступной плавной прокруткой, которая учитывает индивидуальные настройки пользователя и соблюдает рекомендации WCAG по минимизации анимаций.