Skip to main content
← 🎨 CSS as a design systemΒ·Module B7 Β· Lesson 11
TaskAdd the canonical reduced-motion override at the end of CSS. Plus add a pulse animation on .heart, and a hover transition on .card. The override should kill both for opted-out users.

prefers-reduced-motion enforcement

75 XP5 min
Theory

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 animationend events.
  • 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.

← PreviousNext lesson β†’

Get one Python or web tip a day β€” by email

Short, hand-written, no spam. Unsubscribe in one click.