Moro
Gallery
IFoundations
01Why motion exists in UI
02Timing & duration
03Easing
04Springs vs tweens
IIExpression
05Anticipation
06Follow-through & overlapping action
07Squash, stretch & impact
08Arcs
IIIEngineering
09Performance
10Layout animations & FLIP
11Interruptibility & interaction
12Accessibility & restraint
Tier IFoundations03

Easing

The four curves and their personalities

Easing is the DNA of how motion feels. Two identical animations at identical durations will read as completely different interfaces if one uses ease-in and the other ease-out. Most designers pick easings by habit; most developers pick whatever the library defaulted to. A week of practice choosing easings intentionally, and being able to name why, is the difference between animations that feel engineered and animations that feel alive.

#The idea

Easing is the acceleration curve of an animation: how its speed changes over time. There are four families, and each has a distinct personality:

  • Ease-out ([0, 0, 0.2, 1]). Fast start, slow landing. Reads as responsive: the motion launches instantly and settles gracefully. Use for anything entering or exiting the screen. This is the default for UI. When in doubt, pick this.
  • Ease-in-out ([0.4, 0, 0.2, 1]). Slow start, fast middle, slow end. Reads as deliberate: mimics real objects accelerating then braking. Use for elements already on screen that are moving or morphing, such as a slider thumb dragging or a card shifting to a new grid position.
  • Ease ([0.25, 0.1, 0.25, 1]). Asymmetric, slight acceleration at start. Reads as elegant for gentle changes. Use for hover states and color transitions, where you want polish without announcement.
  • Linear ([0, 0, 1, 1]). Constant speed. Reads as mechanical. Almost never correct for UI except for progress bars and continuous loops (marquees, loading ticks). If you find yourself using linear for a discrete animation, you're almost certainly wrong.

There's a fifth you should actively avoid: ease-in alone. Slow start, fast end, abrupt stop. It reads as sluggish because the user waits for visual feedback. The only place ease-in belongs is in the exit phase of an ease-in-out pair.

Canonical example

Open any macOS menu. The menu appears with a classic ease-out: instantly drops down, settles gently at its resting position. Now close it: the same ease-out, in reverse. That two-phase pattern (out-on-enter, out-on-exit) is used everywhere because it reads as responsive in both directions.

Ease-out: fast start, soft landing. The destination is clear from the first frame.

Controls

0.60s
0.00s

Ease-in: slow start, abrupt end. Notice how the motion feels laggy. This is why ease-in alone is almost always wrong for UI.

Controls

0.60s
0.00s

#When it applies

  • Ease-out: enter/exit transitions, revealed content, tooltips, menus, modals, notifications. The default for any UI motion you're unsure about.
  • Ease-in-out: sliders, draggables settling, layout shifts, elements morphing between positions. Things that don't enter or exit, they rearrange.
  • Ease: hover states, color/opacity transitions, subtle reveals where you want elegance without announcement.
  • Linear: progress bars, loading ticks, marquee text, visualized timers. Anywhere constant-speed is the message.

#When it doesn't

  • Never use ease-in alone for anything users interact with. The delay before visible motion is perceived as a lag.
  • Don't use linear for discrete motion. A menu opening linearly looks like a robot. Reserve linear for continuous or time-based motion only.
  • Don't mix easings on paired elements. If a modal uses ease-out and its backdrop uses ease-in-out at different durations, the two will feel disconnected. They should move as one unit.
Common mistake

Picking an easing from the library's dropdown without thinking. Most UIs default to ease-in-out or a generic ease, and every animation in the app inherits it. That uniformity is lazy. The payoff for choosing intentionally is small on any single animation and huge across the whole product: the interface starts to feel designed, not generated.

#Implementation

Motion's built-in keywords:

EasingExamples.tsx
<motion.div
  animate={{ x: 100 }}
  transition={{ duration: 0.2, ease: "easeOut" }}   // responsive
/>
 
<motion.div
  animate={{ x: 100 }}
  transition={{ duration: 0.3, ease: "easeInOut" }} // deliberate
/>
 
// For precision, use a cubic-bezier tuple directly:
<motion.div
  animate={{ x: 100 }}
  transition={{ duration: 0.2, ease: [0.19, 1, 0.22, 1] }} // ease-out-expo
/>

The four-easing palette shipped in Moro's lib/easings.ts is a reasonable default set. Expo variants feel especially crisp.

#Craft notes

  • Ease-out-expo ([0.19, 1, 0.22, 1]) is the most useful advanced easing. The motion nearly teleports to 90% of its destination in the first third, then glides. Perfect for content entries.
  • Overshoot curves ([0.34, 1.56, 0.64, 1]) add a subtle bounce past the target. Use for interactive feedback (a slider thumb on hover), never for content transitions.
  • Snap is not easing. cubic-bezier(1, 0, 1, 0) is a step function and shouldn't live in a smooth-easing context.
  • Emil's decision table is the simplest memorizable reference: entering/exiting, ease-out; morphing on-screen, ease-in-out; hover, ease; constant speed, linear.

#Exercises

  1. Identify easings by sight. Watch five animations in five different apps. For each, guess the easing family. Then look at the code (many sites expose this in DevTools). How often did you guess right?
  2. Break one intentionally. Take a good animation in your own project. Swap its easing to linear. Notice how immediately worse it feels.
  3. Compare expo variants. Set up three copies of the same motion with ease-out, ease-out-cubic, and ease-out-expo. At 300ms, all feel similar. At 150ms, expo is noticeably sharper. Why?

#Study this in the wild

  • Vercel Dashboard. Consistent ease-out-expo for every content surface. Gives the whole product a unified "snap" feel.
  • Apple macOS menus. Classic ease-out on enter and exit. The baseline to study: this is what UI motion feels like when done right.
  • Arc browser. Uses spring easings (lesson 4) for interactive elements, ease-out for transitions. Notice the distinction.

#Further reading

  • easings.net — the definitive visual reference for cubic-bezier curves.
  • Emil Kowalski: Easing.
  • Matt Perry: The spring-easing primer.
Lesson 02
Timing & duration
Lesson 04
Springs vs tweens

On this page

The ideaWhen it appliesWhen it doesn'tImplementationCraft notesExercisesStudy this in the wildFurther reading

Built by David Umoru