On this page
Motion is a way to explain change. A panel arriving from the edge can show where it belongs; a selected indicator moving between tabs can preserve continuity. But animation also consumes attention and time. A useful motion system therefore begins with a reason for each transition, not a catalog of impressive effects that every component must adopt.
Give each animation a specific job
Describe the purpose in one sentence: confirm an action, show a spatial relationship, explain a state change, or guide attention to new information. If the only explanation is that the screen feels more polished, compare the animated version against a static version before committing. Purpose before style makes reviews less subjective.
Use the contrast checker when an animation changes foreground or background colors. Check the resting, active, and intermediate combinations you expect users to see. The tool validates color pairs, not motion comfort, but it helps ensure visual emphasis does not briefly make a label unreadable.
A saved-state indicator is a useful example. A short color change and a stable Saved label can confirm completion. A bouncing icon alone communicates less reliably because users must notice and interpret the movement. The micro-interaction guide provides further examples of connecting feedback to meaningful system events.
Write down what remains understandable with animation removed. That static version is your minimum complete experience, not a degraded afterthought. The same information should remain available when someone prefers reduced motion, uses assistive technology, or encounters an unsupported browser feature.
Set durations by scale and frequency
Use timing ranges as starting points, not immutable rules. A local pressed response might begin around 80 to 120 milliseconds. A compact surface transition might start around 160 to 220 milliseconds. A larger spatial transition may need 240 to 320 milliseconds to remain understandable. Test these values with actual distance and content.
Frequency changes the tradeoff. A drawer opened once per session can tolerate more ceremony than a control used forty times while editing a document. Watch how often the animation blocks the next action. If it repeatedly delays useful input, shorten it or decouple visual completion from interaction readiness.
Keep feedback immediate, even if completion is slow. A request that takes two seconds should acknowledge activation promptly, then show a truthful pending state. Do not stretch a button animation to disguise uncertain network time. Conversely, do not flash a loading spinner for every operation that finishes almost instantly.
Distance matters alongside duration. Moving four pixels over 200 milliseconds feels different from crossing half the screen over the same interval. Review the movement at the smallest and largest supported layouts. A duration token can provide consistency, but a responsive layout may still need a smaller travel distance or an entirely different transition.
Use easing to describe the relationship
Ease-out often suits elements arriving at a destination because movement begins promptly and settles gently. Ease-in can suit departures, though a short exit is often enough. A symmetrical ease-in-out curve can support movement between two visible positions. The MDN easing-function reference explains the available curve families.
Easing is not personality alone. It affects how quickly feedback becomes perceptible and how stable an endpoint feels. A curve that spends most of its time barely moving can look delayed even when its total duration is short. Compare the first few frames, not just the final pose.
Overshoot implies elasticity or stored energy. Use it where that metaphor helps, such as a direct-manipulation control returning to rest. Avoid overshoot in reading surfaces or serious confirmation flows simply because a spring preset is available. A calm endpoint often makes a product feel more responsive than a conspicuous bounce.
Keep implementation choices aligned with the purpose. The web.dev animation guide recommends considering transform and opacity to avoid unnecessary layout and paint work. Performance is part of perceived motion quality: an elegant curve with dropped frames no longer conveys the rhythm its designer intended.
Choreograph change without building a queue
Choreography determines which changes happen together and which should follow. Group related elements so the interface reads as one event. When a filter updates results, preserve the relationship between the selected filter and the new list instead of animating every label, divider, and card independently.
A modest stagger can suggest order, but cap the total sequence. Six items separated by 30 milliseconds add 150 milliseconds between the first and last starts. Thirty items with the same stagger add 870 milliseconds. The latter creates a queue users must watch even though the task may already be complete.
For an expanding settings panel, keep the heading and controls visually grouped. If the shell arrives first and fields trickle in later, users may begin interacting while targets are still shifting. Prefer a single coherent arrival, or a short overlap where the overall duration remains bounded.
Preserve spatial continuity when it helps users track an object. If a selected thumbnail becomes a detail view, a related transition can explain the connection. If the destination is conceptually unrelated, forcing a morph may imply a relationship that does not exist. A simple cut or fade can be the more accurate explanation.
Plan interruption as part of choreography. What happens if a person changes tabs twice, closes a panel while it opens, or navigates backward immediately? The newest intent should win without waiting for every previous animation to complete. Avoid sequences that lock input merely to protect a carefully staged presentation.
Document and test a usable motion contract
Capture a small motion contract with each component: purpose, trigger, properties, timing, interruption behavior, and reduced-motion alternative. Store it beside the component's other decisions rather than in a presentation that implementation teams rarely revisit. The design tokens guide explains how shared values can reduce accidental inconsistency.
A compact CSS starting point can express both reusable timing and a deliberate preference override:
:root {
--motion-feedback: 100ms;
--motion-surface: 180ms;
--motion-settle: cubic-bezier(.2, .8, .2, 1);
}
.notice {
transition: opacity var(--motion-surface) var(--motion-settle);
}
@media (prefers-reduced-motion: reduce) {
.notice { transition: none; }
}Reduced motion is not simply a faster version of every animation. Remove unnecessary travel, zoom, and parallax while retaining clear state changes. Consult MDN on prefers-reduced-motion and test the operating-system setting directly. A fast zoom can still be uncomfortable.
Review flows rather than isolated clips. Ask whether users can identify the current state, locate the next action, and recover from an interrupted transition. Test repeated use, slow devices, keyboard input, and changing content lengths. Record concrete failures such as a moving target or delayed confirmation instead of vague comments that motion feels wrong.
Key takeaways
- Assign every animation a communication purpose and a complete static alternative.
- Adjust duration for distance, scale, and repeated use.
- Choose easing for responsiveness and endpoint stability.
- Keep choreography bounded and let new user intent interrupt it.
- Document reduced-motion behavior alongside the ordinary interaction.
Reach designers & developers at work
Put your product next to the tools people use every day. One sponsor per placement, no tracking pixels.
Become a sponsor