The Journal

Interface Craft3 min read

Motion Design for Engineers: Making Interfaces Feel Alive

Good animations aren't just pretty. They guide users, give feedback, and make your React app feel polished. Here's how to do motion right with CSS and Framer Motion.

Most engineers set transition: all 0.3s ease and move on. That’s why their UIs feel mechanical. The duration barely matters; the easing curve is what your eye reads as natural or fake. Get the curve right and the rest falls into place.

Easing beats duration

ease and linear are the two curves you should almost never use.linear reads as robotic because nothing in the physical world moves at a constant speed — real motion accelerates and decelerates. Reach for ease-out as your default. It covers about 90% of interface motion. Save a custom cubic-bezier for when you can say out loud why the default feels wrong.

Ease-out for entrances

When something enters — a modal, a toast, a menu — it should decelerate into place with ease-out. It arrives fast, then settles, which reads as confident. When something leaves, use ease-in: it starts slow and accelerates away, so exits feel final and don’t linger. Then match duration to distance, not to a fixed number. A tooltip travelling 8px wants roughly 120ms; a panel crossing the screen wants around 300ms. Same curve, different time.

Springs for gestures

CSS timing functions are perfect for taps and state changes. But the moment a user is dragging — a sheet, a swipe-to-dismiss, a slider — switch to a spring. A spring has no fixed duration; it responds to velocity, so when someone flicks fast the animation moves fast. That’s the trick behind why iOS feels alive. In React, Framer Motion’s spring transitions do this for free: give them a stiffness and damping and skip hand-tuned keyframes entirely.

Always respect reduced motion

None of this ships without one guard: prefers-reduced-motion. A real slice of your users get nauseous from motion, and the OS already knows their preference. When reduce is set, drop transforms and large movements to a near-instant fade or to nothing. Keep the feedback, cut the travel.

Frequently asked questions

What matters most for good UI animation, duration or easing?
The easing curve matters far more than duration; it is what your eye reads as natural or fake. Avoid linear and the plain ease default, and reach for ease-out, which suits about 90% of interface motion. Save a custom cubic-bezier for when you can explain why the default feels wrong.
When should I use ease-out versus ease-in for animations?
Use ease-out for entrances so elements like a modal or toast decelerate into place and read as confident, and ease-in for exits so they accelerate away and feel final. Match duration to distance: roughly 120ms for an 8px tooltip, around 300ms for a panel crossing the screen.
When should I use a spring animation instead of CSS easing in React?
Use a spring the moment a user is dragging, such as a sheet, swipe-to-dismiss, or slider, because a spring responds to velocity so fast flicks animate fast. In React, Framer Motion springs do this for free with a stiffness and damping value, skipping hand-tuned keyframes.