Skip to content
ExamsLibraryFor agentsConnect your agent
motionMotion·6/33

Animation durations

Specific durations by element type. UI < 300ms. Buttons 100–160ms.

Raw markdown On GitHub

There is no universal "feels right" duration. The right duration depends on what's moving and how often.

Reference table

ElementDurationNotes
Button press feedback100–160msAnything slower feels laggy
Hover state change120–200msFaster on inputs, slower on cards
Tooltip appearance125–200ms; 0ms for siblingsFirst tooltip: 400–700ms delay, then ~125ms. While one is open, neighbours skip delay and animation
Popover / dropdown150–250msShould feel instant, not theatrical
Modal200–300msSlightly slower because it's a hierarchy shift
Tab content swap200–250msCrossfade or directional slide
Page transition250–400msThe longest "ok" UI duration
Skeleton → content150msResolve fast; the skeleton already paid the wait
Confetti / celebration600–1200msRare moment, can be theatrical
Onboarding hero motion400–800msFirst-run gets a longer budget

Asymmetric enter/exit

The exit is usually 60–80% of the enter: the user has already moved on. A panel that takes 250ms to slide in should take ~180ms to slide out. Use transitions, not keyframes, so an open interrupted by a close reverses from where it is.

.panel { transition: transform 180ms var(--ease-out-quart); }            /* exit */
.panel[data-state="open"] { transition-duration: 250ms; }                /* enter */

A second asymmetry applies where the user is deciding: the deliberate phase is slow and the system's answer snaps (hold-to-confirm: 2s linear on press, 200ms ease-out on release; see clip-path-tricks).

Sonner itself is the counter-example: its toasts run a symmetric ~400ms ease, slower than the UI budget on purpose to match the component's calm personality (sonner-principles). Treat that as a deliberate exception, not a default.

How to choose

  • Smaller element, shorter duration. A 12px icon doesn't need 300ms.
  • More frequent, shorter duration. See delight-impact-curve.
  • More important, slightly longer. A modal earns more time than a tooltip.
  • If unsure, halve it. Most "feels slow" animations are too long. Most "feels jumpy" animations are too short.

Gotcha

prefers-reduced-motion does not mean "make everything 0ms." It means "no large translations or scale changes." A 120ms opacity fade is fine. See prefers-reduced-motion.

Sources

  • Emil Kowalski — button feedback timing.
  • Emil Kowalski, skills (MIT, github.com/emilkowalski/skills, a81dbca): skills/animate/SKILL.md and RECIPES.md (duration budgets, tooltip, toast, hold-to-confirm).
  • Emil Kowalski's design-engineering practice, distilled by HKTITAN (exits 20–30% faster than enters).
  • Vercel Design — internal duration tokens.

motionduration