prefers-reduced-motion enforcement
The full reduced-motion override
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}This block goes at the END of your stylesheet (so it overrides everything). Wipes:
- All animations to ~0ms (essentially instant) β preserves
animationendevents. - All transitions to ~0ms.
- Smooth scroll behavior.
Why not just animation: none?
Some libraries rely on animationend event firing. Setting duration to 0.01ms guarantees the event still fires (it just fires almost-instantly). animation: none would skip the event entirely and break the library.
Per-element exceptions
If you have ONE animation that's content (not decoration) β a chart that animates in real time, a video β you can opt back in:
.chart-animation { animation: chart 2s ease-in-out !important; }But check whether it's truly content. Most "marketing-feel" animations should follow reduced-motion.
Test it
Mac: System Settings β Accessibility β Display β Reduce motion.
Chrome DevTools: Rendering panel β "Emulate CSS media feature prefers-reduced-motion."
Run both your animations + a real reduced-motion test before shipping.
Sign up to start coding
Theory is open to everyone. The interactive editor, live preview, and check are unlocked with a 7-day free trial β card required, cancel anytime.
Sign up β free trial βFirst 10 lessons in each track are free. No card needed for those.