Spring Physics & Gesture Design

Apple-style parameters you can tune by hand

10 min read16 rulesIntermediate

Why springs feel better

Duration-based animation has a fundamental problem: it always takes exactly the same time, regardless of distance or interruption. Springs respond to velocity — tap a toggle mid-flight and it reverses naturally, without awkward restarts.

Toggle — Duration vs Spring
Loading...

Tuning spring parameters

Every spring is defined by three values:

  • Stiffness — how taut the spring is. Higher = snappier.
  • Damping — how quickly the spring settles. Lower = more bounce.
  • Mass — how heavy the object feels. Higher = more inertia.
Spring Parameter Playground
Loading...

Battle-tested presets

You don't need to hand-tune every spring. These presets cover 90% of UI animation needs. Click each card to see the spring in action on a real notification component.

Spring Presets — Notification
Loading...

Interruptibility

The killer feature of springs: they handle interruption gracefully. Click the heart rapidly — the spring preserves velocity and direction, creating a natural "rubber-band" feel. Duration-based animation restarts from scratch every time.

Rapid Click — Spring vs Duration
Loading...

Framer Motion defaults

Framer Motion uses a simpler API: duration and bounce instead of raw stiffness/damping. Apple's recommended defaults:

Use casedurationbounce
Subtle (toggle, checkbox)0.250
Default (modal, dropdown)0.40.15
Playful (notification, like)0.50.25
Bouncy (onboarding, celebration)0.60.4
Framer Motion Spring — Duration & Bounce
Loading...

Key takeaways

  • Use springs instead of duration for anything interactive — they handle interruption gracefully
  • Higher stiffness = snappier, lower damping = more bounce, higher mass = more inertia
  • Default preset: duration 0.4, bounce 0.15 — works for most UI
  • Springs preserve velocity on interruption — duration-based animation restarts from scratch
  • Reserve bouncy springs (bounce > 0.3) for celebrations and onboarding, not everyday UI
springdampingstiffnessbouncegesturemomentumframer-motion