---
title: "Animations present but no `prefers-reduced-motion` handling anywhere (lint/no-reduced-motion)"
description: "lint/no-reduced-motion: People with vestibular disorders can get nauseous from motion; the OS setting exists for them."
canonical: https://void-design.vercel.app/rules/lint/no-reduced-motion
lastModified: 2026-09-16
---

# Animations present but no `prefers-reduced-motion` handling anywhere

`lint/no-reduced-motion` · severity **warn** · category Lint · detected by `void lint` and `void audit`

## Why it matters

People with vestibular disorders can get nauseous from motion; the OS setting exists for them. Without handling it, all entrances, parallax and ambient loops still run.

## How to fix it

Honor the preference: `motion-reduce:` / `motion-safe:` variants, a global `@media (prefers-reduced-motion: reduce)` rule, or `useReducedMotion()` / `<MotionConfig reducedMotion="user">`. Show the finished state instead of hiding content.

## Example

```css
@media (prefers-reduced-motion: reduce) {
  *, ::before, ::after { animation-duration: 1ms !important; animation-iteration-count: 1 !important; transition-duration: 1ms !important; }
}
```

## References

- https://web.dev/articles/prefers-reduced-motion
- https://motion.dev/docs/react-accessibility

## More lint rules

`void lint` reports 67 rules in this category. Static source checks with no browser: Tailwind v4 silent failures, Next.js 16 API traps, React render-body bugs, accessibility markup, SEO files and motion hygiene.

- `scale-zero-entry` Element enters from `scale(0)` — [lint/scale-zero-entry](https://void-design.vercel.app/rules/lint/scale-zero-entry)
- `scroll-timeline-no-fallback` Base rule hides an element; only an `@supports (animation-timeline: …)` block undoes it — [lint/scroll-timeline-no-fallback](https://void-design.vercel.app/rules/lint/scroll-timeline-no-fallback)
- `ease-in-enter` `ease-in` used for an entrance or hover — [lint/ease-in-enter](https://void-design.vercel.app/rules/lint/ease-in-enter)
- `long-ui-duration` UI feedback transition longer than 500ms — [lint/long-ui-duration](https://void-design.vercel.app/rules/lint/long-ui-duration)
- `overflow-x-hidden-sticky` `overflow-x: hidden` on html/body/root wrapper breaks `position: sticky` — [lint/overflow-x-hidden-sticky](https://void-design.vercel.app/rules/lint/overflow-x-hidden-sticky)
- `vh-hero` Hero sized with `100vh` / `h-screen` — [lint/vh-hero](https://void-design.vercel.app/rules/lint/vh-hero)
- `will-change-static` `will-change` applied statically to many elements — [lint/will-change-static](https://void-design.vercel.app/rules/lint/will-change-static)
- `z-index-soup` Many distinct z-index values — [lint/z-index-soup](https://void-design.vercel.app/rules/lint/z-index-soup)

Detected by `void lint` and `void audit`. Explain it in a terminal: `void rules lint/no-reduced-motion`
