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 15 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.