Медиа-выражение prefers-reduced-motion позволяет
учитывать системные настройки пользователя, связанные с уменьшением
анимации. На уровне операционной системы или браузера пользователь может
указать, что избыточные движения интерфейса вызывают дискомфорт
(например, из-за вестибулярной чувствительности). В таком случае
веб-приложение должно адаптировать поведение анимаций.
Библиотека AOS (Animate On Scroll) активно использует трансформации и эффекты появления элементов, поэтому поддержка этой директивы становится важной частью доступности интерфейса.
prefers-reduced-motion — это CSS media query, которая
возвращает одно из двух значений:
no-preference — пользователь не ограничивает
анимацииreduce — пользователь предпочитает минимальное
количество анимацииПример использования в CSS:
@media (prefers-reduced-motion: reduce) {
* {
animation: none !important;
transition: none !important;
}
}
В контексте AOS такая глобальная отмена может быть слишком грубой, поэтому чаще применяются более точечные решения.
AOS по умолчанию управляет:
duration)delay)fade, slide,
zoom и др.)При включённом prefers-reduced-motion: reduce
рекомендуется:
AOS конфигурируется через JavaScript, поэтому логично обрабатывать
prefers-reduced-motion именно там:
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
Это значение можно использовать при инициализации AOS.
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
AOS.init();
}
В этом случае библиотека не запускается вообще.
const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
AOS.init({
duration: reduceMotion ? 0 : 800,
delay: reduceMotion ? 0 : 100,
easing: 'ease-out-cubic'
});
При активной настройке анимации становятся мгновенными.
AOS использует HTML-атрибуты вида:
<div data-aos="fade-up"></div>
Для адаптации под prefers-reduced-motion можно
динамически изменять атрибуты:
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
document.querySelectorAll('[data-aos]').forEach(el => {
el.setAttribute('data-aos', 'none');
});
}
Вместо полного отключения можно заменить анимации на менее агрессивные:
const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
document.querySelectorAll('[data-aos]').forEach(el => {
if (reduceMotion) {
el.setAttribute('data-aos', 'fade');
el.setAttribute('data-aos-duration', '200');
}
});
Таким образом сохраняется базовая визуальная динамика без резких перемещений.
AOS добавляет классы:
aos-initaos-animateМожно переопределить их поведение:
@media (prefers-reduced-motion: reduce) {
[data-aos] {
opacity: 1 !important;
transform: none !important;
}
}
Это позволяет элементам сразу отображаться без анимации, даже если AOS активен.
Настройка prefers-reduced-motion может изменяться во
время работы страницы. Для отслеживания используется слушатель:
const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)');
mediaQuery.addEventListener('change', (e) => {
if (e.matches) {
AOS.refreshHard();
}
});
refreshHard() пересчитывает все элементы и применяет
новые параметры.
Часто добавляется собственный переключатель анимаций:
const userDisabledAnimations = localStorage.getItem('noAnimations') === 'true';
const shouldReduceMotion =
userDisabledAnimations ||
window.matchMedia('(prefers-reduced-motion: reduce)').matches;
AOS.init({
duration: shouldReduceMotion ? 0 : 800
});
Это позволяет учитывать как системные, так и пользовательские предпочтения.
Минимизация движения:
slide, zoom,
flipfade или мгновенное появлениеСнижение нагрузки:
duration до 0–200 мсdelayИзбежание триггеров дискомфорта:
prefers-reduced-motionИгнорирование настройки Анимации остаются активными, несмотря на системные ограничения.
Частичное отключение Отключаются только CSS-анимации, но остаются JS-эффекты AOS.
Резкое исчезновение элементов При неправильной настройке элементы могут быть невидимыми до скролла.
Проверка выполняется через настройки системы:
После изменения настроек важно проверять:
Ленивая загрузка с учётом motion:
const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
if (reduceMotion) {
document.body.classList.add('no-motion');
}
.no-motion [data-aos] {
opacity: 1;
transform: none;
}
Интеграция с SPA-фреймворками
При использовании React/Vue:
prefers-reduced-motion выполняется при
монтировании| Состояние | Поведение |
|---|---|
no-preference |
Полная анимация |
reduce |
Упрощённые или отключённые эффекты |
| пользователь отключил вручную | Полное отключение AOS |
Грамотная интеграция prefers-reduced-motion делает
интерфейс не только визуально аккуратным, но и доступным для
пользователей с разными физиологическими особенностями, не нарушая при
этом общую архитектуру анимаций в AOS.