Squash/stretch, anticipation, follow-through, staging, secondary action — re-read for interface motion, with the "Disney is Dead" counterpoint that UI motion solves a different problem.
In 1981 Disney animators Frank Thomas and Ollie Johnston distilled decades of studio craft into 12 principles of animation — squash and stretch, anticipation, follow-through,
and the rest. Four decades later we keep reaching for that same vocabulary to describe a button
press or a modal sliding in. The question this chapter asks is: how much of it actually transfers?
The twelve, in one breath
Thomas & Johnston's list, from The Illusion of Life: squash & stretch,
anticipation, staging, straight-ahead vs pose-to-pose, follow-through & overlapping action,
slow in & slow out, arcs, secondary action, timing, exaggeration, solid drawing, and appeal.
Some are about drawing a character (solid drawing, straight-ahead vs pose-to-pose) and
barely touch interfaces. The rest describe how things move — and those map onto UI motion
with surprising directness.
The mapping
The ten interface-relevant principles, each with a one-line gloss for UI:
Follow-through & overlapping action→modal overshoot-and-settle, staggered list reveals
Slow in / slow out→easing as affordance
Arcs→curved motion paths
Timing→the 200–500ms UI sweet spot
Secondary action→micro-interactions
Exaggeration→findability
Appeal→polish
Gallery: every principle, before & after
Each tile is a real CSS micro-interaction. Click a tile to replay it, toggle BEFORE/AFTER to see the motionless baseline, and drag intensity to scale the effect — the slider writes a --k custom property that the keyframes
read live (squash amount, overshoot distance, stagger delay, arc, wind-up…).
Squash & stretch
A body deforms to convey weight and impact while conserving volume.
in UI: button press deforms then snaps back — the tap feels physical.
Anticipation
A small reverse move before the main action telegraphs what's coming.
in UI: pull-to-refresh resistance, a button that dips before it launches.
Staging
Direct the eye: one clear idea per shot, everything else subordinate.
in UI: dimming a backdrop / scrim so the dialog owns attention.
Follow-through & overlap
Parts keep moving after the body stops and settle at different rates.
in UI: a modal flies in, overshoots, then settles back into place.
Overlapping action
Offsetting the timing of related parts reads as life, not a rigid block.
in UI: list rows reveal in a stagger instead of all at once.
Slow in / slow out
Things accelerate and decelerate; constant speed looks mechanical.
in UI: easing IS the affordance — ease-out for entrances, ease-in for exits.
Arcs
Natural motion follows curved trajectories, not straight lines.
in UI: an item arcs into place (offset-path) instead of sliding linearly.
Timing
Frame count sets weight and meaning; too fast or slow both mislead.
in UI: UI sweet spot ≈ 200–500ms. Drag intensity past 1 and it drags.
Secondary action
A supporting move enriches the main one without stealing focus.
in UI: a like-button's heart fills AND a small burst confirms the tap.
Exaggeration
Push the pose past realistic for clarity and read.
in UI: an error shakes; a badge pops — exaggerate to make it findable.
Appeal
The thing is pleasant to watch — charisma, not just correctness.
in UI: a toggle that springs and glows feels crafted, earns trust.
Featured: follow-through, dialed in
Follow-through and overlapping action are why a good modal doesn't just stop — it
flies in, overshoots, and settles. Below, every part of that settle is a knob.
The sliders feed CSS variables (--over, --dur, --squash)
that the keyframes consume; hit replay to re-fire.
Modal overshoot-and-settlelive demo
Confirm
Overshoot 0 = a flat, lifeless arrival. Push past ~1.5 and it reads as bouncy/toylike —
the sweet spot for product UI is a small overshoot with a fast settle.
Playground: squash + overshoot on a real button
The smallest complete example of two principles at once — pure CSS, no libraries. Press squashes the button (squash & stretch); release runs
a back-out settle that stretches past rest before resolving (follow-through). Edit the :active scale and the settle keyframe to taste.