usePrefersReducedMotion — это специализированный хук из
библиотеки Chakra UI, который позволяет определять
предпочтения пользователя относительно анимаций на уровне операционной
системы. Он является частью подхода доступности
(accessibility) и особенно полезен для создания интерфейсов,
которые учитывают ограничения или предпочтения пользователей с
повышенной чувствительностью к анимации.
import { usePrefersReducedMotion } from '@chakra-ui/react';
function ExampleComponent() {
const prefersReducedMotion = usePrefersReducedMotion();
return (
<div>
{prefersReducedMotion
? 'Анимации отключены'
: 'Анимации активны'}
</div>
);
}
Пояснение:
true
если пользователь предпочитает минимальные анимации, false
если ограничений нет.Chakra UI предоставляет множество компонентов с анимационными
эффектами: Collapse, ScaleFade,
Slide, Fade.
usePrefersReducedMotion позволяет их адаптировать под
настройки пользователя:
import { Collapse, Button, usePrefersReducedMotion } from '@chakra-ui/react';
import { useState } from 'react';
function CollapsibleSection() {
const [isOpen, setIsOpen] = useState(false);
const prefersReducedMotion = usePrefersReducedMotion();
return (
<>
<Button onCl ick={() => setIsOpen(!isOpen)}>
Показать / Скрыть
</Button>
<Collapse
in={isOpen}
animateOpacity={!prefersReducedMotion} // отключаем анимацию если пользователь выбрал reduced motion
>
<div>Содержимое секции с адаптивной анимацией</div>
</Collapse>
</>
);
}
Ключевые моменты:
animateOpacity или аналогичные пропсы можно отключать,
основываясь на значении prefersReducedMotion.Для пользовательских анимаций через framer-motion или CSS-переходы:
import { motion } from 'framer-motion';
import { usePrefersReducedMotion } from '@chakra-ui/react';
function AnimatedBox() {
const prefersReducedMotion = usePrefersReducedMotion();
return (
<motion.div
animate={prefersReducedMotion ? {} : { x: 100, opacity: 1 }}
transition={prefersReducedMotion ? {} : { duration: 0.5 }}
style={{ width: 100, height: 100, backgroundColor: 'tomato' }}
/>
);
}
Объяснение:
prefersReducedMotion равен true,
анимации полностью отключаются.prefersReducedMotion для
сложных анимаций. Даже короткие анимации могут вызывать
дискомфорт у некоторых пользователей.transition или
animation-duration на ноль.import { extendTheme } from '@chakra-ui/react';
const theme = extendTheme({
styles: {
global: (props) => ({
'*': {
transitionDuration: props.prefersReducedMotion ? '0ms' : undefined,
},
}),
},
});
usePrefersReducedMotion опирается на медиа-запрос
@media (prefers-reduced-motion: reduce).usePrefersReducedMotion позволяет создавать более
доступные и комфортные интерфейсы, одновременно упрощая управление
анимациями и обеспечивая соответствие стандартам WCAG
2.1. Адаптация компонентов и пользовательских анимаций к этому
хуку повышает качество UX для широкой аудитории.