<aside> 💡 ~30% of users enable prefers-reduced-motion at the OS level (macOS, iOS, Windows, Android all support it). This includes people with vestibular disorders, motion sickness, attention difficulties, and those who simply find animation distracting.

</aside>

Understanding reduced motion

prefers-reduced-motion: reduce does NOT mean "no motion" — it means less motion. The user wants to reduce large movements, parallax, auto-playing animations, and unexpected transitions. Small, subtle animations (a 100ms opacity fade) are generally fine.


What to reduce vs what to remove

Animation type Normal mode Reduced motion
Page transitions (slide, zoom) Full animation Instant cut or subtle crossfade (≤200ms opacity)
Parallax scrolling Parallax active Remove entirely — static positioning
Auto-playing video/animation Plays automatically Pause by default; show first frame
Loading spinners Rotating animation Keep (essential for feedback) but reduce rotation speed
Hover micro-interactions Scale/bounce on hover Reduce to opacity or remove
Skeleton loaders Shimmer animation Static grey blocks (no shimmer)
Scroll-linked animations Elements animate on scroll Elements appear in final state immediately
Carousel auto-rotation Auto-rotates Pause; manual only
Error shake Input shakes left-right Remove — use colour + text only
Toast slide-in Slides from edge Appears instantly (opacity 0→1, ≤200ms)

💻 Developer checklist

CSS approach

JavaScript approach

Specific patterns