Motion & Feel. How things move, and why it matters more than how they look.

Motion is the part of an interface you cannot see in a screenshot. It tells people where things came from, what caused what, and whether the app heard them. This guide teaches you to time, ease, choreograph and build motion that explains instead of decorates, and to make a product feel fast, calm and physical even when you are the only person building it.

Reading timeAbout 3.5 hours, in 5 sittings
Practice time2 weeks, 30 minutes a day
Before thisThe Human Mind and Structure & Interaction
TeachersThomas & Johnston, Matas, Ording, Brichter, Willenskomer, Val Head, Rachel Nabors, Paul Lewis, Apple and Material motion teams

By the end you will be able to

  • Explain the six jobs motion does in an interface, and tell explaining motion from decoration (understand)
  • Choose a duration and easing curve for any transition and justify it with distance, size and frequency (apply)
  • Describe a spring with stiffness, damping and mass, and say why springs handle interruption better than fixed durations (understand)
  • Spot broken feel in any app: lag behind the finger, ease-in on entry, layout shift, loaders that flash, motion that ignores Reduce Motion (analyse)
  • Design perceived performance with optimistic updates, skeletons and the right progress indicator (create)
  • Build it yourself with CSS, the Web Animations API, View Transitions, SwiftUI springs or Motion, at 60 to 120 frames per second (create)
  • Write a one-page motion spec your future self can follow (create)

Warm-up: what do you already feel?

You have used thousands of animated interfaces. You already have strong opinions about motion, you just have not put words to them yet. Before reading, answer the three questions below without looking anything up. Do not worry about getting them right. The point is to notice what your gut already knows, so the rest of the guide has something to attach to.

Then do one small thing: pick up your phone, open the app you use most, and do five ordinary actions (open, scroll, go back, delete, refresh). Watch only the motion. Write down one moment that felt good and one that felt wrong. Keep that note. You will diagnose it properly by chapter 6.

Warm-up 1

A menu opens when you tap a button. Which duration will most people describe as "snappy but smooth" on a phone?

Warm-up 2

A sheet slides up from the bottom of the screen. Which curve fits best?

Warm-up 3

You tap "Like" and the server takes 1.5 seconds to confirm. What should the heart do?

How to study this guide

Motion is learned with the eyes and hands, not by reading. Every chapter has a demo or a drawing, and most have a lab. Play with each one before reading the text under it. Then do the exercise on your own product, in code, the same day. If you only read, you will know the vocabulary and still ship a menu that eases in. If your system has Reduce Motion turned on, the demos jump straight to their end states and show a note; the diagrams still teach everything.

Part one

Why things move

Before any curve or millisecond, you need a reason. These two chapters give you a test for whether a piece of motion earns its place, and a vocabulary borrowed from a century of animators and a decade of interface designers.

1

What motion is for

Taught by Mike Matas, with Apple's Human Interface Guidelines and Material Design

Good interface motion carries information the static screen cannot: where something came from, where it went, what caused it, and whether the system heard you. If removing an animation loses no information, it was decoration.

A screen is a series of states. Between any two states, something changed. Without motion, the change is a cut: one frame shows the old state, the next frame shows the new one, and the person has to compare them to work out what happened. That comparison costs attention. With well-designed motion, the change is shown instead of implied. The eye follows the object, and the brain gets the answer for free, through the same visual system that tracks a ball thrown across a room.

This is why motion is not a garnish you add at the end. It is part of the structure. When Mike Matas designed interfaces at Apple (he worked on the original iPhone and iPad software), then at Push Pop Press and on Facebook Paper (2014), his work was admired less for being flashy than for being legible: you always knew where a photo came from because it grew out of the thumbnail you touched, and you could push it back with your finger. The motion was the explanation.

The six jobs

Almost every useful animation in software does one or more of these six jobs. Learn the list; it is the test you will apply to every motion decision for the rest of your career.

Continuity Same object, new place. The eye never loses it. Orientation Where am I in the space? Deeper is to the right. Causality This tap caused that change, over there. Feedback I heard you, and here is what happened. Attention Look here, once. Spend it rarely. Personality Calm, crisp, playful. A by-product, not a goal.
The six jobs. The top row is about understanding (where, which, why). The bottom row is about conversation and character. Personality should come out of how you do the other five, not from extra animation added for its own sake.
Continuity
An object keeps its identity across a change. A thumbnail grows into the full photo, so you know it is the same photo. Without continuity, the person has to re-find things after every change.
Orientation
Motion builds a mental map of where screens live. If drilling in slides content from the right, then "back" must slide it to the right again. The map is only as good as its consistency.
Causality
Motion links an action to its result, especially when they are far apart. Add to cart, and the item visibly travels to the cart icon. Delete a row, and its neighbors close the gap so you see what moved.
Feedback
The system acknowledges input instantly, before the result is ready: the button depresses, the switch slides, the field shakes. This is the job most often skipped, and the one people notice most when it is missing.
Attention
Motion is the strongest attention signal in vision; our peripheral vision is tuned to it. One moving element on a still screen will be seen. Two moving elements fight. Use it for things that truly need eyes now.
Personality
The way something moves says a lot about its character. A crisp, quick settle feels precise. A soft spring feels friendly. Personality is real, but it is the last job, never the first.

Explains versus decorates

Here is the test. Imagine the animation replaced with an instant cut. Then ask: what does the person no longer know? If the answer is "where the item went" or "that my tap registered", the motion is doing work. If the answer is "nothing, but it looked nice", it is decoration. Decoration is not always wrong: a small moment of delight on a rare event (finishing a project, the first launch) can be worth it. But decoration on a frequent path is a tax. People pay it every time, and after the tenth time it stops being charming and starts being slow.

Don't
| 1 Which one went?
A hard cut. The list reflowed and a badge appeared. The person has to compare two frames from memory to work out which message left and where it went.
Do
Rows rise to fill the gap
Motion as explanation. The row slides toward the archive, the badge receives it, the rows below close the gap. Same end state, but the person saw what happened instead of deducing it.
Cut it to zero. Is information lost? yes Keep it. Tune it. Shortest duration that still reads. no Rare and emotional? First run, a goal reached, a project finished yes Small delight allowed, skippable no Remove it. Frequent path, no info.
The cut-to-zero test. Run it on every animation in your product. Most survivors will need to be made shorter, not longer.
Key idea

Motion is information delivered through the visual system's fastest channel. Spend it on explanation; ration it for delight.

Do

  • Name the job (continuity, orientation, causality, feedback, attention, personality) before you design any animation.
  • Animate the thing that changed, from where it was to where it went.
  • Give every user input a visible response within one frame or two.
  • Keep delight for rare moments and let people skip it.

Don't

  • Add motion because a screen "feels static". Still is good; still is calm.
  • Animate things that did not change (a whole page bouncing in when one value updated).
  • Use motion to hide slowness. A long transition over a slow load just makes the wait longer.
  • Let two things compete for attention by moving at the same time for different reasons.

In the wild

  • iOS app launchApple, since iPhone OS
    Opening an app zooms it out of its icon; closing it shrinks back to the icon's position. On a full home screen, this tells you which icon you just left. Continuity: the window and the icon are one object.
  • macOS Dock minimizeApple, Mac OS X
    The Genie effect pours a window into its Dock slot. It is theatrical, but it answers "where did my window go?" for someone who has never used a Mac. Causality across distance. Scale is a separate question (the Scale effect does the same job more quietly).
  • Facebook PaperFacebook, 2014
    Stories unfolded from cards you could pull up with a finger and push back down; the transition tracked the gesture continuously. Mike Matas was one of its lead designers. When motion is driven by the finger, it becomes the interface itself.
  • Google MaterialGoogle, 2014 onward
    Material made "motion provides meaning" a core principle: surfaces grow from the point of touch, and shared elements carry identity between screens. A design system can make explanatory motion the default instead of an afterthought.
For the solo creator

You do not have time to animate everything, and you should not. Your best return is feedback (press states, toggles, instant responses) and continuity on the two or three transitions people do most. That is perhaps a day of work. Character animation and delight come later, if ever.

Common mistakes

Motion as polish, added last

Why it happens: animation feels like a finishing touch, so it lands in the last week, after the structure is fixed, and becomes decoration layered on cuts.

Fix: decide the spatial model and the key transitions while you design structure. Sketch where each screen "lives" and how you get there (chapter 7).

Animating to look modern

Why it happens: you have seen a polished launch video and want that feeling. Then every card fades and slides on every load.

Fix: run the cut-to-zero test. Keep only motion that loses information when removed, plus one or two rare delights.

Silent inputs

Why it happens: the button calls an API and the screen changes when the response arrives, so nothing happens for 300 to 800ms after the tap.

Fix: separate acknowledgement from result. Show the press state immediately; show the result when it arrives (chapter 10).

Check yourself

Your notes app fades every note in the list from 0 to 100% opacity, one after another, each time the app opens. People open it 20 times a day. Which job does this motion do?

Exercise 1.1 40 minutes · on your own product

The motion inventory

  1. List every animation in your product (open each screen and do every main action). Include the ones the platform gives you for free, like navigation pushes and sheets.
  2. For each, write the job it does in one word, or write "none".
  3. Mark how often it plays: per session, per day, or rarely.
  4. Run the cut-to-zero test. Mark each one keep, shorten or remove.
  5. List every input that has no immediate visual response. These are your feedback gaps.
You're done when: you have a table of animations with job, frequency and verdict, plus a list of silent inputs to fix.
BeginnerCompetentStrong
Lists the obvious transitions only.Includes platform defaults and assigns a job to each, with honest "none" verdicts.Also finds silent inputs and ranks the fixes by how often people hit them.
2

Borrowed principles: from Disney to UX in Motion

Taught by Frank Thomas & Ollie Johnston, with Issara Willenskomer, Val Head and Rachel Nabors

Animators spent a century learning what makes movement believable, and interface designers spent a decade learning which of those lessons survive on a screen people are trying to use. Borrow both vocabularies, but keep only what serves the person, not the show.

In 1981, two of Disney's senior animators, Frank Thomas and Ollie Johnston, published The Illusion of Life. In it they set out the twelve principles the studio had worked out since the 1930s for making drawings feel alive: squash and stretch, anticipation, staging, straight ahead and pose to pose, follow through and overlapping action, slow in and slow out, arcs, secondary action, timing, exaggeration, solid drawing, and appeal. Almost every motion designer since has learned them.

But a cartoon and an interface have opposite goals. A cartoon wants you to watch. An interface wants you to finish your task and forget it was there. So the principles translate unevenly. Some carry over almost directly (slow in and slow out is just easing). Some need to shrink by a factor of ten (exaggeration). And some, like squash and stretch on a text field, would be ridiculous.

Disney principleWhat it means in animationIn an interface
Slow in, slow outObjects accelerate and decelerate rather than starting and stopping instantly.Easing (chapter 4). The single most useful principle. Use always.
TimingNumber of frames sets weight and mood.Duration by size, distance and frequency (chapter 3). Use always.
Follow through, overlapping actionParts keep moving after the main body stops, at different rates.Stagger and offset: list items settle one after another; a spring's small settle. Use subtly.
AnticipationA small movement that prepares for a big one (a wind-up before a throw).A press state before release; a card lifting slightly when a long press starts a drag. Use for gestures.
ArcsNatural motion follows curved paths.Items flying to a cart or folder on a curve rather than a straight line. Use when travel is long.
StagingPresent one idea clearly; direct the eye.One thing moves at a time; dim the background behind a sheet. Use always.
Squash and stretchDeformation shows mass and flexibility.Almost never on UI chrome. Maybe a playful pull indicator or a bouncing logo on an empty state.
ExaggerationPush poses past reality for clarity.Only as a tiny overshoot in springs, or in onboarding illustrations. Rare.
Secondary actionA smaller action supports the main one.A badge count ticking up as an item lands. Use sparingly.
Appeal, solid drawing, straight ahead vs pose to poseCraft of drawing and animation workflow.Mostly about illustration and how you author keyframes, not about UI behavior.
Anticipation rest dip lift Dip on press, then lift into a drag. Follow-through Arrives, overshoots a hair, settles. Keep it tiny. Arcs Long travel curves, like a thrown object. Staging One thing at a time; dim the rest. Each principle shrinks when it moves from film to interface: same idea, a fraction of the size.
Disney, scaled down. In film, a follow-through can be half a second of wobble. In a sheet, it is a 2 to 4% overshoot that settles in under 100ms, or none at all.

The interface's own principles

In 2017 the designer Issara Willenskomer published "Creating Usability with Motion: The UX in Motion Manifesto", which named twelve principles specific to interfaces. Where Disney's list is about believability, his is about usability: how motion helps people understand relationships, hierarchy and change. The names are worth learning because they give you precise words for things you will see every day.

PrincipleWhat it doesEveryday example
EasingMakes temporal behavior feel natural and expected.A sheet that decelerates into place.
Offset and delayShows that elements are related but distinct, by starting them at slightly different times.List rows arriving 30ms apart.
ParentingLinks the motion of one element to another, so they read as connected.A header shrinking as the content under it scrolls.
TransformationOne element changes into another, showing they are the same thing in a new state.A "Submit" button morphing into a spinner, then a check.
Value changeNumbers or values visibly change, so the person sees they are live.A balance counting from old to new value.
MaskingRevealing or hiding parts of an element changes its meaning or use.A thumbnail cropped into a square that opens to full aspect.
OverlayShows layering in flat space by moving one layer over another.A swipe on a row revealing actions underneath.
CloningNew elements emerge from an existing one, showing where they came from.A new card splitting out of the "+" button.
ObscurationFrosting or dimming what is behind, so you know it is still there.A blurred background behind a sheet.
ParallaxLayers moving at different speeds show depth and priority.A hero image scrolling slower than text (use with care; see chapter 13).
DimensionalityElements seem to have depth or sides, like cards that flip.A card flipping to show its settings on the back.
Dolly and zoomMoving the camera or scaling the space to go into detail.Zooming from a month view into a day in a calendar.
Offset & delay Same move, staggered start Parenting Header shrinks as list scrolls Transformation Button becomes the result Masking Crop opens to full frame Overlay Delete Row slides over its actions Cloning + New card grows out of "+"
Six of the twelve UX in Motion principles. Each one answers a relationship question: are these related, is this the same thing, where did this come from, what is underneath.

Two teachers worth reading in full

Val Head's Designing Interface Animation (2016) is the most practical book on choosing motion for interfaces: purpose, timing, easing and how to talk about animation with others (including your future self). She also wrote one of the first widely read pieces on motion sensitivity, "Designing Safer Web Animation for Motion Sensitivity" (A List Apart, 2015), which shaped how the industry thinks about reduced motion. Rachel Nabors' Animation at Work (2017) is short and sharp on why animation helps cognition, and on how to make it part of a design system instead of a one-off. Both treat animation as a tool for understanding, which is the stance of this whole guide.

Animation is not the art of drawings that move but the art of movements that are drawn.Norman McLaren, animator, National Film Board of Canada

McLaren's line is about film, but it fits interfaces well. The question is never "what should this look like while it moves?" It is "what is the movement, and what does it say?" Design the movement first; the visuals ride on it.

Do

  • Use slow in and slow out, timing, staging and offset on almost everything.
  • Use anticipation and follow-through at a tenth of film scale.
  • Name the UX in Motion principle when you describe an animation in a spec: "cloning from the plus button, 250ms, ease-out".

Don't

  • Squash and stretch interface chrome. Buttons are not rubber balls.
  • Exaggerate on frequent paths. What reads as charming in a demo reads as wobbly by the hundredth use.
  • Treat a principle as a requirement. Most screens need two or three, not twelve.

In the wild

  • Apple MusicApple, iOS
    The mini player at the bottom expands into the full player, with the album art growing from its small position. Transformation and masking: the mini player and the full player are visibly the same object.
  • Mail swipe actionsApple Mail, iOS
    Swiping a message reveals colored actions under the row; a full swipe commits the action and the row leaves. Overlay: the row is a layer over its actions.
  • Google CalendarGoogle, Android and iOS
    Moving between month, week and day views scales the space rather than swapping screens. Dolly and zoom: time is a space you move closer to.

Common mistakes

Cartoon physics on productivity tools

Why it happens: you learned motion from motion-design showreels, where exaggeration is the point.

Fix: cap overshoot at a few percent and settle times well under half a second for anything people use daily.

Principles as a checklist to fill

Why it happens: a list of twelve feels like twelve boxes to tick.

Fix: start from the job (chapter 1), then pick the one principle that does that job best.

Check yourself

You add a "New project" button. When tapped, a blank project card appears at the top of the grid. People are not sure where it came from. Which principle fixes this most directly?

Exercise 2.1 30 minutes · on apps you use daily

Name it like a motion designer

  1. Pick three apps you use every day. In each, find two animations.
  2. For each of the six, write: the UX in Motion principle(s) it uses, the Disney principle(s) it uses, and the job from chapter 1.
  3. Slow them down if you can (on iOS, use a screen recording and scrub it; on Android, Developer options has animation scale settings).
  4. Note one that breaks a principle (for example, ease-in on entry, or two things competing).
You're done when: you have six short descriptions in the form "Cloning plus easing, 250ms, causality job", and one written diagnosis of a broken one.
BeginnerCompetentStrong
Describes what moves in plain words.Names principles and jobs correctly for most.Also estimates duration and curve from the slowed recording, and proposes a fix for the broken one.
Part one recap: connect the ideas

In The Human Mind you met preattentive processing: some visual features are seen before conscious attention. How does that change how you use motion?

Part two

The physics of feel

Four chapters on the raw material: how long things take, how they speed up and slow down, how springs replace both, and how to make content feel attached to a finger. Each has a lab. Play first, read second.

3

Timing: how long things take

Taught by Material Design's motion guidance, with Walter Doherty, Val Head and Jakob Nielsen

Most interface transitions should last between 150 and 300 milliseconds. Go shorter for small, nearby and frequent changes; go longer, up to about 500ms, only for large, far-traveling and rare ones. When in doubt, go shorter.

Duration is the first thing people feel and the last thing they can name. Too short and the eye cannot follow: the change reads as a jump, and continuity is lost. Too long and the person notices they are waiting for your animation to finish before they can act. Between those two failures there is a fairly narrow band, and it depends on three things: how far the element travels, how big it is, and how often people see it.

Why the band is where it is

A display at 60Hz draws a frame every 16.7ms. An animation of 100ms is only six frames: enough to register that something moved, not enough to see much of the path. At 200ms you get twelve frames at 60Hz (twenty-four on a 120Hz screen), which is enough for the eye to track an object smoothly. Beyond about 400 to 500ms, a transition starts to feel like a wait. That boundary is not arbitrary: in 1982, Walter Doherty and Ahrvind Thadani at IBM reported that people's productivity rose sharply when system response time fell below about 400ms, because they stayed in a flow of work instead of drifting while waiting. The "Doherty threshold" is about system response, not animation, but the same human clock is ticking in both cases. Your animation is part of the response time.

0 100 200 300 500 1000 ms jump micro standard large, rare feels like waiting Where common transitions land Hover color, press state: 50 to 100 Toggle, checkbox, tooltip: 100 to 200 Menu, dropdown, sheet, card expand: 200 to 300 Full-screen push, shared-element hero: 300 to 450 Onboarding, celebrations: up to ~1000, only if rare and skippable Each 60Hz frame is 16.7 ms; 200 ms is 12 frames (24 at 120Hz).
The duration map. Treat these as starting points, then tune by eye on a real device. The band from about 150 to 300ms covers most of what you will build.

Rule 1: distance and size

An element that travels across a full screen needs more time than one that slides 20 pixels, or it will seem to teleport. A large surface (a full-screen sheet) needs more time than a small chip, because there is more to look at and more pixels changing. Material's older guidance put mobile transitions mostly between 200 and 300ms, made desktop transitions shorter (around 150 to 200ms, because pointer movements are quick and screens are seen at arm's length), and suggested longer durations on tablets, where elements travel further. You do not need precise rules; you need the habit of asking "how far, how big?"

Distance and duration do not scale in proportion, though. Doubling the distance does not mean doubling the time; it means adding a little. A sheet that rises 300px and a sheet that rises 700px might be 250ms and 320ms. If you scale linearly, long moves become sluggish.

Rule 2: frequency

This rule matters more than the first. Every animation is a tax paid each time it plays. A 300ms transition on an action people do twice a day is free. The same 300ms on an action people do 200 times a day (switching tabs, opening a command palette, moving between emails) is a minute of waiting, every day, made of tiny frustrations. So the more often something happens, the shorter its animation should be, down to zero.

duration how often people do it rare constant Onboarding, "goal reached" Open settings, new document Open message, push screen Switch tab, palette, shortcut ~500 0 to 100
The frequency rule. The duration a transition deserves falls as the number of times a day people see it rises. Keyboard-driven actions sit at the bottom right: they should feel instant.

Keyboard-triggered actions deserve special care. Someone pressing ⌘K to open a command palette, or J to move to the next email, has already decided; they want the result, not a show. macOS Spotlight appears essentially instantly for this reason. Fast email clients built around shortcuts move between messages without slide transitions. If you animate at all, keep it to a short fade under 100ms that never blocks the next keypress.

Rule 3: never block input

An animation that ignores taps while it plays turns duration into lag. If a person taps "back" during a 300ms push, the back should happen now, reversing from wherever the animation is, not after it finishes. This is called interruptibility, and it is the main reason springs (chapter 5) became the default on modern platforms.

Lab: duration

Reduced motion is on, so the box jumps to its end position. The verdict text and the waiting clock still work, and the rules hold.

medium travel
Time spent watching: 0 ms

Try 40ms, 250ms and 900ms at each distance. Then press "Do it 10 times" at 250ms and at 600ms: that is the frequency tax, made audible. The curve is a fixed ease-out so only time changes.
Don't
Menu opens in 600 ms waiting to choose
Slow on a frequent path. The person already knows which item they want. Every frame of the reveal is a frame they cannot act in.
Do
Menu opens in 160 ms choose while it lands; input is never blocked
Short, front-loaded, interruptible. An ease-out puts most of the movement in the first frames, so the menu is readable almost at once and taps go through.
Key idea

Short for small, near and frequent. A little longer for big, far and rare. Never block input. When unsure, cut 50ms.

Do

  • Start at 200 to 250ms for typical mobile transitions and about 150 to 200ms on desktop.
  • Use 100ms or less for press states, hovers and toggles.
  • Make keyboard and high-frequency actions instant or nearly so.
  • Add a little time for longer travel, not proportionally more.
  • Tune on the real device, at the real refresh rate.

Don't

  • Tune durations in a slow-motion recording and then ship them at the length that "looked good slowed down".
  • Use the same duration for everything.
  • Let an exit take as long as the entrance; exits can be shorter.
  • Hold the user's input hostage until an animation finishes.

In the wild

  • macOS SpotlightApple
    The search bar appears on the keystroke with no visible entrance animation. Keyboard-summoned tools should feel like they were already there.
  • iOS navigation pushApple, UIKit
    The standard push takes a fraction of a second, and you can grab the edge mid-transition to swipe back. Medium duration for a large move, made acceptable by being interruptible.
  • Material 3 duration tokensGoogle
    Material 3 publishes named duration tokens in steps from short (tens of milliseconds) to long and extra long, so designers pick a token, not a number. A small, named scale beats ad hoc values. You will build one in chapter 15.
For the solo creator

Pick three durations and use only those: fast about 120ms, base about 220ms, slow about 350ms. Put them in CSS variables or a Swift enum today. You will never again argue with yourself about 230 versus 250.

Common mistakes

The slow-motion trap

Why it happens: you watch an animation over and over while building it, get used to it, and keep lengthening it to "see it better".

Fix: set the duration, then do the real task ten times in a row at full speed. If you notice the animation by the fifth time, it is too long.

One duration for everything

Why it happens: a library default (often 300ms or 400ms) gets applied globally.

Fix: map your transitions to the three-step scale by size and frequency.

Animations queueing up

Why it happens: each tap starts a new animation that waits for the previous one, so fast tappers see the app replay their history.

Fix: retarget the running animation to the new end state instead of queueing (springs and the Web Animations API both support this).

Check yourself

In your email app, moving to the next message with the J key uses a 300ms horizontal slide. Power users press it hundreds of times a day. What should you do?

Exercise 3.1 45 minutes · on your own product

A three-step duration scale

  1. From your inventory (Exercise 1.1), list every animation you kept, with its current duration (read it from your code).
  2. Assign each to fast, base or slow using size, distance and frequency.
  3. Define the three as variables or constants in code and replace every hard-coded duration.
  4. Do your three most common tasks ten times each at full speed. Shorten anything you noticed.
You're done when: your codebase has one place where durations are defined, and no stray numbers remain.
BeginnerCompetentStrong
Defines tokens but some animations still use raw numbers.All animations use the scale; frequent ones are fast.Also makes keyboard actions instant and documents why each transition got its step.
4

Easing: how things speed up and slow down

Taught by Thomas & Johnston ("slow in, slow out"), with Robert Penner, Val Head and the CSS Working Group

Nothing in the physical world starts or stops instantly, so constant-speed motion looks mechanical. Use ease-out (fast start, gentle stop) for things that enter or respond, ease-in (gentle start, fast finish) for things that leave, and ease-in-out for things that move from one place to another on screen.

An easing curve maps time to progress. The horizontal axis is time, from 0 (start) to 1 (end). The vertical axis is how far along the movement is. A straight diagonal line is linear: equal progress in equal time. Any curve that bends is easing. Where the curve is steep, the object is moving fast; where it is flat, it is moving slowly. That one idea lets you read any easing curve at a glance.

In the early 2000s the designer and developer Robert Penner published a set of easing equations (quad, cubic, quint, sine, expo, back, elastic, bounce) for Flash animation. They spread into nearly every animation library since, which is why you will see names like easeOutCubic everywhere. On the web and in most design tools, easing is usually expressed as a cubic Bézier curve with two control points, written cubic-bezier(x1, y1, x2, y2). The first point shapes the start; the second shapes the end.

Linear Even spacing: robotic. Use for spinners, progress, color. Ease-in Slow start, fast end. For exits: leaves and gets out of the way. Ease-out Fast start, soft landing. For entrances and responses to input. Ease-in-out Gentle both ends. For moves within the screen, A to B.
Reading a curve. Each dot is the object's position at an equal slice of time. Where dots crowd together, the object is slow; where they spread, it is fast. Ease-out spends its speed at the start, which is why it feels responsive.

Why ease-out for entering

When you tap something, you want a response now. Ease-out moves the most in the first few frames: by a third of the duration, a typical ease-out curve has covered well over half the distance. So the element appears to react instantly, then slows down so the eye can land on it and read it. This also mirrors physics: a thrown or pushed object starts at speed and is slowed by friction.

Why ease-in for exiting

An element that leaves is no longer interesting. Ease-in starts slowly (so the departure is visible and the person sees where it went) and then accelerates away, like a car pulling off. Exits are also usually shorter than entrances, often by 20 to 30%. Material's older guidance, for example, used about 225ms for elements entering and about 195ms for elements leaving on mobile. The asymmetry is a feature: we care about arrivals more than departures.

Why ease-in-out for moving on screen

When an element is visible both before and after (a card moving to a new slot, a panel resizing), it should start gently, move, and land gently. Pure ease-in-out can feel a little slow to start, so many systems use an asymmetric "standard" curve that accelerates quickly and decelerates for longer. Material's long-standing standard curve, cubic-bezier(0.4, 0, 0.2, 1), is that shape.

Enter: ease-out, 240 ms Moves most at once, lands softly Exit: ease-in, 180 ms Starts visibly, then gets out of the way shorter exit
Asymmetric pairs. The same element uses different curves and durations for entering and leaving. Using one ease-in-out for both is a common reason sheets feel "floaty".
Lab: easing curves

Reduced motion is on, so the boxes jump to the end. The curve plot still updates as you change the controls, and it teaches the same thing: steep means fast, flat means slow.

time → progress → 0 1 1
your curve
linear, for comparison
cubic-bezier(0.25, 0.1, 0.25, 1)

The lab plays slowly (600ms) so you can see the shape; real UI would be a third of that. Compare ease-in and ease-out with the linear box: one lags, one leads. Then drag y2 above 1 to make an overshoot, and notice how quickly it starts to look cartoonish.
Don't
slams into place nothing happens at first
Ease-in on an entrance. The sheet seems to hesitate after the tap, then crashes to a stop at full speed. It feels both slow and abrupt.
Do
soft landing, easy to read responds on the first frame
Ease-out on an entrance. Speed when the person needs response, slowness when they need to read. Same duration, completely different feel.
Myth

"Ease-in-out is the safe default." It is the safest for elements moving on screen, but the worst common choice for responses to input, because its first 20% of time covers very little distance. That slow start reads as lag. Default to ease-out for anything that answers a tap.

Where linear belongs

Linear is not banned; it is specialized. Use it for things that loop or represent time: a spinning loader, a progress bar filling at a known rate, a marquee. Use it for color and opacity changes too, where there is no physical movement to ease (though a short ease-out fade looks fine as well). Avoid it for anything that travels.

Do

  • Ease-out for entrances and input responses.
  • Ease-in, a little shorter, for exits.
  • An asymmetric standard curve for on-screen moves.
  • Linear for loops, progress and pure color.
  • Keep two or three named curves, like your durations.

Don't

  • Use ease-in for anything that answers a tap.
  • Use bounce and elastic easings in productivity UI.
  • Use the browser default ease everywhere without deciding.
  • Mix six curves across one screen.

In the wild

  • CSS keywordsW3C
    ease is cubic-bezier(0.25, 0.1, 0.25, 1), ease-in is (0.42, 0, 1, 1), ease-out is (0, 0, 0.58, 1), ease-in-out is (0.42, 0, 0.58, 1). The built-in ease-out is gentle; many designers prefer a stronger one for snappier responses.
  • Material 3Google
    Publishes named easing tokens (standard, emphasized, with accelerate and decelerate variants) and, with Material 3 Expressive (2025), a spring-based motion system. Even a system built on Bézier curves moved toward springs for interactive motion.
  • LinearLinear, 2019 onward
    The issue tracker is known for crisp, quick transitions with fast starts and short settles, and for keyboard actions that do not wait on animation. Strong ease-out plus short durations reads as "fast software".

Common mistakes

Same curve both ways

Why it happens: a transition is defined once and reversed for the exit.

Fix: define enter and exit separately; ease-out in, ease-in out, exit about 20 to 30% shorter.

Overshoot everywhere

Why it happens: a back-out curve looks lively in isolation.

Fix: keep overshoot for playful, rare moments; use a spring with no bounce for serious UI.

Check yourself

A toast appears at the bottom of the screen, stays three seconds, then leaves. Which pair is best?

Exercise 4.1 40 minutes · in code

Curves with a reason

  1. Define three named curves in your product: enter (ease-out), exit (ease-in), move (standard).
  2. Find every transition in your code and assign one, with the matching exit duration about 25% shorter than enter.
  3. Record your screen at 60fps, step through frame by frame, and confirm entrances cover most of the distance in the first third.
You're done when: every transition references a named curve, and no entrance uses ease-in.
BeginnerCompetentStrong
Named curves exist but defaults remain.All transitions use named curves; exits are shorter.Verified frame by frame, and linear is used only for loops and progress.
5

Springs and physics

Taught by Apple's "Designing Fluid Interfaces" team (WWDC 2018), with Facebook's Paper and Origami designers and the SwiftUI team

A spring has no fixed duration. It pulls an element toward a target with a force, and the motion ends when the energy runs out. That makes springs naturally interruptible: they can change target mid-flight and carry their current velocity with them, which a fixed-duration curve cannot do.

A Bézier curve is a timeline: at 40% of the time, be at 70% of the distance. That works perfectly until something interrupts it. Suppose a sheet is halfway up and moving fast when the person flicks it down. A timeline animation has two bad options: finish going up first (ignoring the person), or start a new animation downward from zero velocity, which makes the sheet stop dead and then start again. Either way, the motion has a visible kink. In the real world, a moving object you push the other way slows down, reverses and accelerates; its velocity changes smoothly.

A spring simulation models exactly that. At every frame it asks: how far am I from the target, and how fast am I moving? The spring force pulls toward the target in proportion to the distance; the damping force resists motion in proportion to the speed. Change the target, and the same simulation just keeps running from the current position and velocity. No kink.

m stiffness k damping c force = −k × distance − c × velocity acceleration = force ÷ mass target underdamped: bounces critical: fastest, no bounce overdamped: sluggish time →
A spring in three parameters. Stiffness is how hard it pulls, damping is how much it resists motion, and mass is how heavy the object feels. The ratio between them decides whether it bounces.

The three knobs, and the one that matters

Stiffness (k) is the strength of the pull. Higher stiffness means faster motion. Damping (c) is friction. Higher damping means less bounce and, past a point, slower settling. Mass (m) is inertia. Higher mass makes the object slower to start and slower to stop, as if it were heavier.

Designers rarely think in those raw numbers. The useful derived quantity is the damping ratio, usually written ζ (zeta): ζ = c ÷ (2 × √(k × m)). When ζ = 1, the spring is critically damped: it reaches the target as fast as possible without overshooting. Below 1 it overshoots and oscillates; the lower, the bouncier. Above 1 it creeps in slowly. For most interface motion you want ζ between about 0.8 and 1: a hint of liveliness, or none, and no visible wobble.

Apple's designers, in the WWDC 2018 talk "Designing Fluid Interfaces", recommended thinking in two designer-friendly parameters instead of three physical ones: damping ratio (how bouncy) and response (roughly how quickly it gets there). SwiftUI follows the same idea; since iOS 17 you can write a spring as a perceived duration and a bounce, and use presets named .smooth (no bounce), .snappy (a little) and .bouncy (more). You still get a physically correct spring, but you specify it in words a designer would use.

Lab: spring

Reduced motion is on, so the puck jumps to its target. The graph and the numbers still update live, so you can explore how stiffness, damping and mass shape a spring.

target start 0 s 1 s 2 s
damping ratio1.00
overshoot0%
settles in0 ms
Drag the black puck and throw it: it follows your finger exactly, and when you let go it carries your throw's speed into the spring and settles on whichever side your throw was heading. Grab it again mid-flight: it stops under your finger. That is interruptibility. Then try the presets and watch the damping ratio.
Don't
Velocity, timeline animation interrupted: speed snaps to 0 The element jerks, then restarts
A kink in velocity. When a timeline animation is replaced mid-flight, speed jumps. The eye reads that discontinuity as a glitch.
Do
Velocity, spring new target: speed bends smoothly Momentum is preserved
Continuous velocity. The spring keeps its current speed and simply starts pulling the other way, like a real object would.

Duration-based or spring?

Use a spring when the motion is connected to a gesture, can be interrupted, or is triggered by something the person might immediately reverse (open and close, expand and collapse). Use a duration and curve when the motion is short, not interactive and needs to be exactly synchronized with something else, like a crossfade that must end at a specific time, or a loading progress indicator. Most modern platforms default to springs for interactive transitions; SwiftUI's default animation became a spring in iOS 17.

On the web, CSS transitions are timeline-based, but you can fake a spring with the linear() easing function, which accepts many points and can approximate any curve (including a spring's settle). It is still a timeline, so it will not preserve velocity when interrupted. For real interruptible springs on the web, use a library such as Motion (chapter 14) or a small simulation like the one in the lab above, which is about 30 lines of JavaScript.

Key idea

A spring is defined by forces, not time. That is why it can be interrupted and still feel physical. Keep the damping ratio near 1 for serious UI.

Do

  • Use springs for anything gesture-driven or reversible.
  • Specify springs as damping ratio plus response (or duration plus bounce), not raw stiffness numbers.
  • Pass the gesture's release velocity into the spring.
  • Keep bounce near zero for productivity, a little for playful touch moments.

Don't

  • Use bouncy springs on text and dense layouts; wobbling text is hard to read.
  • Chain timeline animations to fake interruption.
  • Let a spring take a second to settle a 1px wobble; check the settle time.

In the wild

  • Facebook Pop and OrigamiFacebook, 2014
    Built alongside Paper, Pop was an open-source animation engine with springs and decay, and Origami was the prototyping tool its designers used to tune them. Springs went mainstream in app design partly because designers had tools to feel them before engineering them.
  • iOS sheets and app switcherApple, iOS
    Sheets, the app switcher and home gesture track your finger and hand off to springs on release, carrying your flick's velocity. The gesture and the animation are one continuous motion.
  • SwiftUI springsApple, iOS 17 and later
    Spring presets .smooth, .snappy and .bouncy, and springs defined by duration and bounce. The platform made the designer-friendly vocabulary the default API.
For the solo creator

You do not need to understand differential equations. Pick two springs and name them: snappy (fast, ζ around 0.85 to 1) for small things, and smooth (a little slower, ζ = 1) for large surfaces. Use them for every interactive transition. Revisit only if something feels wrong.

Common mistakes

Bouncy by default

Why it happens: bounce is the most visible thing a spring can do, so demos show it, and you copy the demo numbers.

Fix: start critically damped (ζ = 1) and only add bounce where a gesture has energy to spend, like a flick.

Ignoring release velocity

Why it happens: the drag code and the animation code are written separately, so the animation starts from rest.

Fix: measure velocity over the last few pointer events and pass it as the spring's initial velocity.

Check yourself

A spring has stiffness 400, damping 10, mass 1. Without the lab, what will it look like?

Exercise 5.1 60 minutes · in code

Replace one timeline with a spring

  1. Pick the one transition in your product that people most often reverse (a sheet, a sidebar, an expanding card).
  2. Reimplement it as a spring (SwiftUI .spring or .snappy, Motion's type: "spring", or a small simulation).
  3. Test interruption: open and immediately close it, five times fast. Compare with the old version.
  4. Tune until the damping ratio is between 0.8 and 1 and the settle feels finished, not wobbly.
You're done when: rapid open and close never jerks, and you can state your spring as "response X, damping ratio Y".
BeginnerCompetentStrong
Uses a spring but with a library's bouncy default.Tuned spring; interruption is smooth.Also passes gesture velocity in, and documents the spring as a named token.
6

Direct manipulation: following the finger

Taught by Bas Ording, with Ben Shneiderman and Apple's fluid interfaces team

When a person drags something, it must stay under their finger, exactly, every frame. At the edges, it should resist rather than stop. When they let go, it should keep the speed they gave it. Those three rules (1:1 tracking, rubber-banding, momentum) are what make a touch interface feel like a physical object instead of a picture of one.

Ben Shneiderman coined "direct manipulation" in 1983 to describe interfaces where you act on visible objects with continuous, reversible actions and see the results immediately. Touch screens made the idea literal. And the moment the finger is on the glass, the bar for motion rises. With a mouse, a few milliseconds of lag hide in the gap between hand and pointer. With a finger, any lag is visible as the content sliding away from your fingertip, and the illusion breaks.

Rule 1: track 1:1, with no smoothing

During a drag, set the element's position from the pointer position directly. Do not ease toward it, do not animate to it, do not smooth it. Smoothing is tempting because it hides jittery input, but it turns into lag: the content trails the finger like it is on a rubber leash. Also preserve the grab point: if the person grabbed the card 30px from its left edge, it should stay 30px from its left edge under the finger, rather than jumping to center itself.

1:1 tracking offset kept Card and finger move as one. Smoothed (laggy) lag gap
The finger is the truth. Any gap between fingertip and content, even 30 or 40 milliseconds of it, reads as "this is not really attached".

Rule 2: resist at the edges (rubber-banding)

What should happen when you drag a list past its end? A hard stop feels broken: your finger keeps moving and the content refuses, so you wonder whether the app froze. The iPhone answer, credited to Apple designer Bas Ording and central to one of the patents in Apple's 2012 case against Samsung, is rubber-banding: the content keeps moving, but with increasing resistance, so it travels a fraction of your finger's distance and the fraction shrinks the further you pull. Let go, and it springs back. You learn the boundary physically, without an error message.

A widely shared approximation of the iOS curve, reverse-engineered by developers, is offset = (1 − 1 ÷ (distance × 0.55 ÷ size + 1)) × size, where size is the height of the view. It starts close to 1:1 for small pulls and flattens toward a limit for big ones. The exact constant matters less than the shape.

finger distance past the edge → content offset 1:1 (no edge) rubber band: resists more and more hard stop: feels frozen
The rubber-band curve. Small pulls feel nearly direct. Large pulls give less and less, so you feel the boundary without ever hitting a wall.
Three ways to scroll a list

Reduced motion is on. Dragging still tracks your pointer (that is direct manipulation, not decorative motion), but momentum and spring-back are replaced with an instant settle.

Drag the list up and down with a mouse or finger, past the top and bottom, and flick it.

Hard stop: it tracks your finger, but at the ends the content freezes while your finger keeps going, and a flick stops dead at the edge.

Rule 3: keep the momentum, and project it

When the finger lifts, the content is moving at some speed. Throwing that speed away (stopping dead) feels like the content hit glue. Keeping it means letting the content glide and decelerate by friction. iOS scroll views decelerate by multiplying velocity by a constant every millisecond (0.998 at the normal rate, 0.99 at the "fast" rate used for paging-like views).

Apple's fluid interfaces talk added a subtle, powerful idea: projection. When someone flicks a sheet or a picture-in-picture video, do not choose where it lands from where the finger let go. Choose it from where the motion would come to rest, given the release velocity. A gentle flick near the middle should go back; a fast flick from the same position should carry through. This is how the iOS app switcher and PiP window feel like they read your intent.

snap: open snap: closed midpoint released here, slow returns open same spot, fast flick projected rest point closes
Projection. Decide the destination from where the throw would land, not from where the finger lifted. The same position plus a different speed means a different intent.

Do

  • Update position from the raw pointer every frame during a drag.
  • Keep the grab offset.
  • Rubber-band at edges and spring back on release.
  • Project release velocity to choose a snap point.
  • Let any in-flight animation be grabbed and stopped by a new touch.

Don't

  • Smooth or ease the drag position.
  • Hard-stop content at the edge.
  • Start the release animation from zero velocity.
  • Pick snap points by position alone.
  • Build your own scrolling when the platform's will do; native scroll views already do all of this.

In the wild

  • iPhone scrollingApple, 2007
    From the first iPhone, lists tracked the finger, carried momentum and bounced at the ends. It was one of the moments in the original keynote that made the device feel physical. Feel can be the product's first impression.
  • Picture in PictureApple, iOS 14 and later
    Flick a PiP video toward a corner and it lands in the corner your throw was heading to, not the nearest one to your finger. Projection reads intent from velocity.
  • MapsApple Maps, Google Maps
    Pan, pinch and rotate all track 1:1, glide on release, and resist at zoom limits. Rubber-banding works for any bounded value, including zoom level.
For the solo creator

On iOS and Android, use the native scroll and gesture components; they already do all three rules and you will not beat them in a weekend. On the web, native scrolling also does this on touch devices. Only build custom drag physics for your product's signature interaction (a canvas, a card stack, a timeline), and then copy the three rules exactly.

Common mistakes

Scroll-jacking on the web

Why it happens: a landing page wants scroll-driven theatrics, so it intercepts the wheel and replaces native momentum with its own easing.

Fix: never replace native scroll physics. Drive effects from scroll position (CSS scroll-driven animations) while letting the browser scroll.

Laggy drag from heavy work

Why it happens: each pointer move triggers layout or a React re-render of a large tree, so frames drop and the content trails.

Fix: move the dragged element with a transform outside your rendering cycle, and commit state only on release.

Check yourself

Your bottom sheet has two snap points. People complain it "snaps back open" when they try to dismiss it with a quick flick from near the top. What is the most likely cause?

Exercise 6.1 30 minutes · on apps you use daily, then your own

The finger test

  1. On three apps, drag every draggable thing slowly while watching the gap between fingertip and content. Note any lag.
  2. Drag past the edges. Note hard stops versus rubber bands.
  3. Flick sheets and cards gently and hard from the same spot. Note whether the result changes.
  4. Repeat on your own product. List every failure of the three rules.
You're done when: you have a list of direct-manipulation failures in your product, each tagged with the rule it breaks.
BeginnerCompetentStrong
Notices obvious lag only.Checks all three rules on every gesture.Fixes one failure and verifies it with a slow-motion recording.
Part two recap: connect the ideas

A colleague's expanding card uses a 450ms ease-in-out timeline and people say it "feels slow and stuck". Using parts one and two, what is the best single change?

Part three

Motion in the interface

With timing, easing and springs in hand, you can compose. These four chapters cover how several things move together, how one state becomes another, the small motions inside controls, and the biggest lever of all: making software feel fast.

7

Choreography: space, sequence and stagger

Taught by Material Design's choreography guidance, with Issara Willenskomer and Apple's navigation model

When several things move, they need a director. Decide where every screen lives in space, move things in an order that tells one story, and offset related items by a few tens of milliseconds so the eye can follow them as a group without waiting for them.

A spatial model: where screens live

Every navigation animation makes a claim about space. A push from the right says "the new screen was to the right, and you moved deeper". A sheet from the bottom says "this is a temporary layer on top; dismiss it downward". A crossfade says "this replaced that, in the same place". People build a mental map from these claims, and they use it to predict where "back" goes. The map only works if your claims are consistent.

Depth: push right, pop left Inbox Message Attachment Peers: tabs, same level Crossfade or short lateral slide, never a depth push. Height: the z-axis base screen sheet: up from below dialog: fades and scales in, on top
Draw your app's map. Depth goes left to right, peers sit side by side, temporary layers rise on the z-axis. Each kind of move gets its own transition, and "back" always reverses it.

The z-axis deserves a note. A layer above (sheet, popover, dialog) should come from where it is anchored and cast a shadow or dim what is behind, so you know the base is still there underneath (Willenskomer's "obscuration"). It leaves the way it came. If a sheet slides up, it slides down; a sheet that fades out after sliding in breaks the model.

Don't
push right, then rise from below, then back fades. Where am I?
Three spatial claims. Each transition looked fine on its own, but together they contradict each other and the person loses their place.
Do
Deeper is always right. Back always reverses.
One claim, kept everywhere. After two uses, people predict the motion before it happens, which is exactly when motion becomes invisible and helpful.

Sequence: one story at a time

When a change involves several elements, order them by cause and effect. The thing the person touched responds first. The thing that results comes next. Supporting elements (counts, badges, secondary content) follow. If everything starts at once, the eye does not know where to look; if the order is wrong, causality reads backwards. Keep the whole sequence short: a choreographed transition that takes longer than about 400 to 500ms in total is usually showing off.

Add to cart: a sequence, not a pile 1 Button press 2 Item flies to cart 3 Badge count pops 4 Toast (optional) 0200400600800 ms
Overlap, but in order. Each step starts a little before the previous one ends, so the whole thing reads as one gesture. The steps run in causal order: touch, travel, result, confirmation.

Stagger: related, but separate

When a group of similar items appears (list rows, grid cards, menu items), animating them all together makes the group read as one blob. Animating them one fully after another makes the person wait. Staggering each item's start by a small offset, usually 20 to 50ms, gives the best of both: the eye perceives a wave that reveals the order and grouping, and the whole group is visible within a quarter of a second. Cap the number of staggered items (the first six to ten); anything below the fold should simply appear with the last one, or the stagger becomes a slow drip.

List entrance

Reduced motion is on, so the rows appear instantly in every mode. With motion on, the difference is the timing of each row.

    All at once: the list arrives as one slab. Fine, but it gives no sense of order, and a large block moving at once feels heavy.

    Shared elements

    The strongest continuity tool is the shared element transition: an element present on both screens (a photo, a title, an avatar) moves and resizes from its old position to its new one, while the rest of the screen changes around it. The person's eye stays on the thing they tapped, and the new screen assembles around it. Photos opening from a grid, an album cover growing into a player, a card expanding into a detail page: all shared-element transitions. Material calls this the "container transform". On the web, the View Transitions API makes it a few lines of code (chapter 14).

    Do

    • Write down your spatial model: depth, peers, layers.
    • Reverse every transition exactly on the way back.
    • Order motion by cause and effect.
    • Stagger groups by 20 to 50ms and cap the count.
    • Use shared elements when the same object appears on both screens.

    Don't

    • Mix push directions for the same kind of navigation.
    • Use a depth push for switching tabs.
    • Stagger fifty rows.
    • Let total choreography exceed half a second on a common path.

    In the wild

    • iOS PhotosApple
      Tapping a thumbnail grows it into the full photo; swiping down shrinks it back into its exact grid cell, which may have scrolled. Shared elements must land back where they came from, even if that place moved.
    • Material container transformGoogle
      A card or button expands into the full screen it opens, keeping its edges continuous. A container can become the page.
    • Things 3Cultured Code, 2017
      A to-do expands in place into an editable card, pushing neighbors aside, rather than navigating to a new screen. Sometimes the best spatial claim is "it opens right here".

    Common mistakes

    Every element gets its own entrance

    Why it happens: each component was built with its own animation, and a screen assembles ten of them.

    Fix: choreograph at the screen level. Decide the one or two things that move; everything else appears with them.

    Tabs that push

    Why it happens: the navigation library uses the same transition for everything.

    Fix: tabs are peers. Switch them instantly or with a short crossfade.

    Check yourself

    Your settings screen opens as a sheet from the bottom on iPhone. To close it, you have a "Done" button that pops the sheet to the left. What is wrong?

    Exercise 7.1 45 minutes · on your own product

    Draw the map

    1. On paper, draw every screen in your product placed in space: depth left to right, peers side by side, layers stacked above.
    2. Label each arrow with the transition you currently use.
    3. Circle every inconsistency (same relationship, different transition; or a back that does not reverse).
    4. Pick your most common multi-element change and draw its timeline like the cart example.
    You're done when: you have a one-page spatial map with inconsistencies circled and one timeline drawn.
    BeginnerCompetentStrong
    Map exists but transitions are not labeled.Every arrow labeled; inconsistencies found.Inconsistencies fixed in code, and the timeline totals under 500ms.
    8

    State changes, morphing and FLIP

    Taught by Paul Lewis (FLIP), with Issara Willenskomer (transformation) and the View Transitions spec authors

    When content reflows (an item is removed, a list is filtered, a card resizes), animate each element from its old position to its new one. The FLIP technique makes this cheap: measure where things were, measure where they are, and animate the difference with transforms.

    Most interface changes are not navigation; they are layout changes within one screen. A row is deleted and the rows below jump up. A filter hides half a grid and the rest snap into new places. A panel opens and the content beside it jumps sideways. Each jump breaks continuity: the person has to find their place again. Animating the reflow fixes that, but it used to be hard, because layout positions are computed by the browser or UI framework, not by you.

    FLIP: First, Last, Invert, Play

    In 2015, Paul Lewis (then at Google) described a technique he called FLIP. It turns any layout change into a smooth animation using only transforms, which are cheap to animate (chapter 14).

    First Measure where it is now. Last Apply the change, measure again. Invert Transform it back to the old spot. Play Animate the transform to zero.
    FLIP in four steps. The layout change happens instantly and invisibly; the animation is just a transform running from "where it was" back to "nothing". Because only transform changes during the animation, it runs smoothly even on slow devices.
    // FLIP for any set of elements (vanilla JS, Web Animations API)
    const first = new Map([...items].map(el => [el, el.getBoundingClientRect()]));
    applyTheLayoutChange();                       // e.g. reorder, filter, remove
    for (const el of items) {
      const a = first.get(el), b = el.getBoundingClientRect();
      const dx = a.left - b.left, dy = a.top - b.top;
      if (!dx && !dy) continue;
      el.animate(
        [{ transform: `translate(${dx}px, ${dy}px)` }, { transform: 'none' }],
        { duration: 260, easing: 'cubic-bezier(.2, 0, 0, 1)' }
      );
    }
    Reflow a grid

    Reduced motion is on, so both versions reflow instantly. That instant reflow is also the correct reduced-motion behavior.

    Without: tiles teleport. After a shuffle, try to find tile 5: you have to scan the whole grid.

    Morphing: one thing becoming another

    Transformation (chapter 2) is the UX in Motion name for an element that changes into another element while staying recognizably itself. Icon morphs are the small version: a play triangle becoming a pause pair, a hamburger becoming a close cross, a "Send" button shrinking into a spinner and then a check. They work because the control stays where your eye already is and tells you its new state without a separate message. They fail when the morph is slow (anything over about 250ms for an icon), or when the two states have nothing in common visually, so the in-between frames are a mess.

    play → pause menu → close Send button → busy → done
    Morphs keep the eye in place. The control itself reports its new state. Good morphs share geometry between states (the three menu bars become two crossed bars).
    Don't
    gone in one frame Rows teleport up; your place is lost
    Instant collapse. If you were about to tap the next row, it is now under your finger somewhere else.
    Do
    Fade, collapse, neighbors glide up
    Animated collapse. About 200ms: the row fades as its space closes, and the rows below visibly move into the gap.

    Do

    • Animate reflows after insert, delete, filter and sort.
    • Use transforms (FLIP) rather than animating top, left, width or height.
    • Keep icon morphs under about 250ms.
    • Morph between shapes that share geometry.

    Don't

    • Animate layout properties directly on large lists.
    • Animate a reflow the person did not cause (a background sync reshuffling the list while they read).
    • Morph with distortion; FLIP with scale can squash text, so counter-scale children or crossfade.

    In the wild

    • iOS Mail deleteApple
      Deleting a message collapses its row while the rest slide up. The collapse is the confirmation.
    • Trello and Linear boardsAtlassian; Linear
      Dragging a card makes the other cards in the column slide apart to make room, live, as you move. Animated reflow previews the result before you drop.
    • SwiftUI matchedGeometryEffectApple, iOS 14 and later
      Marks two views as the same element so SwiftUI animates position and size between them. Platforms now treat "this is the same thing" as a first-class idea.

    Common mistakes

    Animating height on every row

    Why it happens: transition: height is the first thing that comes to mind for a collapse.

    Fix: for one element it is fine; for lists, use FLIP on the neighbors so only transforms change, or use your framework's layout animation.

    Surprise reshuffles

    Why it happens: new data arrives and re-sorts the list while the person is reading or about to tap.

    Fix: hold background changes and show a "3 new items" pill; apply the reflow when they ask.

    Check yourself

    A filter chip hides 12 of 20 cards in a grid. You want the remaining 8 to glide into their new places. Which approach is most robust and smooth?

    Exercise 8.1 60 minutes · in code

    Animate one reflow

    1. Find the list or grid in your product where items are added, removed or reordered most often.
    2. Implement FLIP (the snippet above, your framework's layout animation, or View Transitions).
    3. Add the removed item's exit: a short fade and collapse.
    4. Check it with 3, 30 and 300 items; cap animation to visible items if needed.
    You're done when: removing, adding and reordering all animate smoothly at 60fps with 300 items.
    BeginnerCompetentStrong
    Animates removal only.All reflows animate with transforms.Also skips off-screen items, respects reduced motion, and holds background reshuffles.
    9

    Microinteraction motion

    Taught by Dan Saffer, with Apple's and Material's control guidelines

    The smallest motions do the most work: a button that depresses on touch-down, a switch that slides, a field that shakes on a wrong entry, a check that draws itself on success. They are fast (50 to 200ms), they answer the person directly, and they are where most products feel cheap or crafted.

    Dan Saffer's book Microinteractions (2013) breaks every small interaction into a trigger, rules, feedback, and loops and modes. Motion lives mostly in the feedback part: it is how the control says "got it" and "here is the new state". Because microinteractions happen hundreds of times a day, they must be fast, quiet and completely consistent. A good press state is never noticed; a missing one is noticed every time.

    Press: respond on touch-down

    The most important microinteraction is the press state, and the most important rule is when it appears: on touch-down (or mouse-down), not on release. The press state is the acknowledgement. It must happen within a frame or two of contact, before the action runs. A slight darkening, a scale to about 0.96 to 0.98, or both, over 50 to 100ms in, and a slightly slower release. On release, the action fires.

    touch-down release press in: 50 to 100 ms, ease-out held: scale ~0.97, darker return: ~150 ms action fires here Anatomy of a press
    Acknowledge first, act second. The press state appears on contact, so even a slow action feels heard. If the finger slides off before release, the press state reverts and nothing fires.

    Toggles, checkboxes and selection

    A switch should slide its knob (about 150 to 200ms, ease-out or a crisp spring) and change color with it, so the new state is unmistakable. A checkbox can draw its check quickly (a 100 to 150ms stroke animation) instead of popping in. Selection in a list (highlighting a row) should be near-instant; it is a very frequent action. None of these should bounce in productivity software. A tiny overshoot in a switch is tolerable; more is noise.

    Success and errors

    Success is usually best shown in place: the button becomes a check, the row gets a brief tint. Avoid modal celebrations for ordinary actions. Errors should also appear where the problem is. The classic motion for "no" is a short horizontal shake, the way a head shakes. macOS has shaken its login password field on a wrong entry for many years. A shake works because it is fast (about 300 to 400ms, three or four oscillations of a few pixels), localized, and universally understood. It must come with a text explanation for anyone who cannot see the motion or has motion turned off.

    Three microinteractions

    Reduced motion is on, so the press, slide and shake are replaced with instant state changes. Notice the "with" version still wins because of where and when the feedback appears, and that the error text carries the meaning without the shake.

    PressSaved 0 times
    SwitchSync
    Wrong PIN
    Without motion: the button gives no sign of being pressed, the switch snaps, and the error is a generic message in a box below, away from the field.

    Loaders inside controls

    When an action takes more than about a second, the control that started it should show that it is working: the button label replaced by a small spinner, the button kept the same width so the layout does not jump, and the button disabled to prevent double submission. When the action completes, morph to a check briefly, then return to normal. Chapter 10 covers the bigger question of what to show while whole screens load.

    Attention cues, used sparingly

    Sometimes you need the person to notice something: a new message, a required field, a feature they have not found. Motion is the strongest way to do it, which is exactly why it must be rationed. Rules: one cue at a time; play it once or twice, never loop forever; tie it to an event the person cares about; and stop the moment they have seen it. A badge that pulses until clicked is a nag. A badge that scales up once when it changes is information.

    Don't
    New! Try this! Look here! Three loops, forever. The eye learns to ignore all of them.
    Attention inflation. When everything pulses, nothing does, and the screen becomes tiring to look at.
    Do
    1 One badge, one pop, once. It scaled 1 → 1.2 → 1 in 250 ms when the message arrived.
    One cue, tied to an event. The motion marks the moment of change, then the screen goes still again.

    Do

    • Show press states on touch-down, within a frame.
    • Slide switches and draw checks in under 200ms.
    • Shake an invalid field once, with a text message beside it.
    • Keep buttons the same width when they show a spinner.
    • Play attention cues once, on a real event.

    Don't

    • Wait for release (or the network) before showing a press.
    • Use ripples or bounces that outlast the action.
    • Rely on the shake alone to say "wrong".
    • Loop attention animations until clicked.

    In the wild

    • macOS loginApple
      A wrong password shakes the password field side to side. A shake is a fast, culturally obvious "no", right where the problem is.
    • iOS switchesApple
      The knob slides and the track fills with color; you can also drag the knob. Even a toggle can be directly manipulated.
    • Material rippleGoogle, 2014 onward
      A ripple spreads from the touch point, showing exactly where the surface was touched. Feedback can carry location, not just "pressed".
    • Stripe CheckoutStripe
      The pay button shows progress in place and then a check on success, without navigating away. The control that started the action reports its result.
    For the solo creator

    Write one press state and one disabled-and-busy state for your button component, and use them everywhere. That single afternoon improves every screen of your product at once. On the web, :active with a 80ms transform transition is enough to start.

    Common mistakes

    Hover effects instead of press effects

    Why it happens: you design on a desktop with a mouse, where hover is visible.

    Fix: design the pressed state explicitly, and test on a phone, where hover does not exist.

    Success modals for routine actions

    Why it happens: you want to reassure people that the save worked.

    Fix: confirm in place (a check on the button, a tint on the row), and save modals for consequential events.

    Check yourself

    Your "Pay ₹499" button calls a payments API that takes 1 to 3 seconds. What should the button do from tap to result?

    Exercise 9.1 45 minutes · in code

    Three states for every control

    1. For your button, switch and text field components, define pressed, busy and error states.
    2. Implement press on touch-down with a 50 to 100ms transition.
    3. Implement a once-only shake (with a text message) for invalid input.
    4. Test with a 3-second artificial network delay; confirm there are no double submissions.
    You're done when: every tap anywhere in your app shows a press within one frame, and slow actions show busy in place.
    BeginnerCompetentStrong
    Press states on buttons only.Press, busy and error states on all core controls.States are in shared components, respect reduced motion, and are verified on a slow network.
    10

    Perceived performance

    Taught by Robert Miller and Jakob Nielsen (response limits), with Luke Wroblewski (skeletons), Mike Krieger (Instagram) and Rahul Vohra (Superhuman)

    How fast software feels matters more than how fast it is. Respond within 100ms, show progress after about a second, keep people oriented past ten seconds, and wherever you can, do the work before or behind the moment instead of in front of it.

    Three numbers have guided interface speed for decades. Robert Miller described them in 1968, and Jakob Nielsen popularized them in Usability Engineering (1993). About 0.1 second is the limit for feeling that the system reacts instantly, as if you were acting on a physical object. About 1 second is the limit for your flow of thought staying uninterrupted, though you notice the delay. About 10 seconds is the limit for keeping attention on the task at all; beyond it, people switch to something else. Doherty's 400ms (chapter 3) sits between the first two.

    < 0.1 s 0.1 to 1 s 1 to 10 s > 10 s Feels instant.No indicator. Noticed, flow kept.Press state; maybea delayed spinner. Attention drifts.Skeleton or spinner;progress if known. People leave.Determinate progress,run in background,notify when done. The three limits (Miller 1968, Nielsen 1993) Doherty threshold (~0.4 s) sits inside the second band: below it, people stay productive and engaged.
    Match the feedback to the wait. The right indicator depends on how long the wait will be. Under a tenth of a second, any indicator only adds flicker.

    Optimistic UI: assume success

    Most actions in most apps succeed. Likes, stars, marking as read, reordering, renaming, checking off a to-do: their failure rate is tiny. So instead of waiting for the server, update the interface immediately as if the action succeeded, send the request in the background, and only if it fails, roll back and say so clearly. The person feels zero latency. In early Instagram, Mike Krieger described a related trick: the photo upload started in the background while people were still writing the caption, so by the time they pressed share, much of the work was done.

    Pessimistic UIServer tap 800 ms working UI updates Optimistic UIServer UI updates now confirmed Use optimistic UI when • failure is rare (likes, stars, reorder) • the action is easy to undo • a rollback would not surprise anyone Do not use it when • money moves (payments, transfers) • it is irreversible (send, delete for all) • failure is common (flaky validation)
    Move the wait out of the way. Optimistic UI does not make the server faster; it moves the waiting from in front of the person to behind them, and keeps a plan for the rare failure.
    A like button with 1.2 seconds of latency

    Finished the first chapter of my reading app's redesign. Calm by default.

    Pessimistic: the heart waits for the server. Tap it a few times quickly and feel how a trivial action becomes a chore.

    Spinner, skeleton or progress bar?

    When you must wait, pick the indicator by what you know about the wait. A spinner (indeterminate) says "working, no idea how long"; fine for short, unknown waits, but it focuses the eye on the waiting itself. A skeleton screen shows the shape of the content that is coming (grey blocks where text and images will be); the term was popularized by Luke Wroblewski around 2013. Skeletons make waits feel shorter because the page appears to be already loading in place, and because nothing jumps when content arrives. A determinate progress bar says "this much done, this much left"; use it whenever you can estimate progress and the wait exceeds a few seconds, such as uploads, exports and imports.

    Two refinements matter as much as the choice. First, delay the indicator: if most loads finish in under about 300 to 500ms, showing a spinner immediately produces a flash that makes things feel slower. Start it after a short delay. Second, once an indicator appears, keep it for a minimum time (around 300 to 500ms) so it does not flicker on and off.

    Lab: waiting, four ways

    Reduced motion is on, so the spinner and skeleton shimmer are still. The comparison still works: watch what each column shows at each wait length.

    Spinner now
    Spinner after 400ms
    Skeleton
    Progress bar
    0.0 s
    At 0.25s, the immediate spinner flashes, while the delayed one never appears: that is the better experience. At 1.5s, the skeleton feels shortest because the layout is already in place. At 9s, only the progress bar tells you whether to wait or go make tea.

    Do the work before the moment

    The best loading state is the one that never appears. Prefetch the next likely screen. Start loading a link's page when the pointer hovers over it or a finger touches down (people usually hover for a few hundred milliseconds before clicking; tools like instant.page are built on this idea). Cache aggressively and show cached content first, then update. Do heavy work in the background and notify when done. Superhuman, the email client, made "every action within 100ms" a design principle: it keeps mail locally so most actions never wait on the network at all.

    Never let the page jump

    Layout shift is when content moves after it first appears because something above it loaded late: an image without dimensions, an ad, a banner, a font swap. It is the worst kind of unrequested motion, because it often moves the thing you were about to tap. Google's Core Web Vitals measure it as Cumulative Layout Shift, and treat a score of 0.1 or lower as good. The fix is not animation; it is reserving space. Give images and embeds explicit dimensions or an aspect ratio, reserve slots for late content, and use skeletons that match the real layout.

    Don't
    image arrives late Buy tap lands on the image; button moved down
    Layout shift. The button was at the top a moment ago. The person's tap hits whatever moved into its place.
    Do
    space reserved (aspect-ratio) Buy Button never moves. Image fills its slot.
    Reserved space. Content arrives into a slot that already exists, so the only motion is the image fading in.

    Do

    • Respond to every input within 100ms, even if only with a press state.
    • Use optimistic updates for frequent, reversible, low-risk actions.
    • Delay indicators by a few hundred milliseconds, then hold them for a minimum time.
    • Use skeletons that match the real layout; use determinate progress for long tasks.
    • Prefetch on hover and touch-down; show cached data first.
    • Reserve space for everything that loads late.

    Don't

    • Spin a full-screen loader for a sub-second fetch.
    • Use optimistic UI for payments or irreversible actions.
    • Show a progress bar that sits at 99%.
    • Use long transitions to mask a slow load.
    • Let ads, banners or fonts push content after it appears.

    In the wild

    • SuperhumanSuperhuman, late 2010s onward
      Built around speed as a feature: actions aim to complete within about 100ms, with mail stored locally so most actions do not wait for the network. Perceived speed is architecture, not animation.
    • Instagram uploadsInstagram, early 2010s
      Started uploading a photo while the person was still writing the caption, so sharing felt instant. Do the work during the moment people are busy anyway.
    • YouTube, LinkedIn, Facebook feeds2010s onward
      Grey content-shaped placeholders appear first and fill in as data arrives. Skeletons became the default for content feeds.
    • Things 3, Apple NotesCultured Code; Apple
      Local-first: everything you do is saved on the device instantly and synced later. The fastest network request is the one the person never waits for.
    For the solo creator

    Perceived performance is where a one-person app can beat big teams, because you control the whole stack. Cache the last state locally and show it on launch; make the three most common actions optimistic; reserve space for every image. Those three changes often matter more than any server optimization.

    Common mistakes

    The flash of spinner

    Why it happens: the loading state is shown the instant a fetch starts, and most fetches are fast.

    Fix: delay indicators about 300 to 400ms; once shown, keep them at least 300ms.

    Silent rollback

    Why it happens: an optimistic update fails and the state quietly reverts, so people think the app is haunted.

    Fix: on failure, revert visibly and show a short message beside the control, with a retry.

    Skeletons that lie

    Why it happens: a generic skeleton is used everywhere, so the real content reflows when it arrives.

    Fix: shape each skeleton like its real layout, including image ratios and line counts.

    Check yourself

    Your app's search results usually load in 200 to 600ms, occasionally 3 seconds. What loading treatment fits best?

    Check yourself

    Which action should NOT be optimistic?

    Exercise 10.1 90 minutes · on your own product

    A speed pass

    1. Throttle your network (browser devtools "Slow 3G" or the iOS Network Link Conditioner) and do your top five tasks. Write down every wait over 100ms and what you see during it.
    2. For each, pick a fix: optimistic, cached first, prefetch, delayed indicator, skeleton or progress bar.
    3. Implement the two fixes that affect the most frequent tasks.
    4. Check layout shift: load each main screen and watch for anything that moves after appearing. Reserve space for it.
    You're done when: your two most frequent actions feel instant on a slow network, and no main screen shifts after first paint.
    BeginnerCompetentStrong
    Adds spinners where waits were silent.Uses optimistic updates and delayed indicators appropriately.Also prefetches, caches the last state, and measures layout shift.
    Part three recap: connect the ideas

    You delete a row optimistically. The server rejects it two seconds later. Using chapters 8, 9 and 10, what should happen?

    Part four

    Beyond the eye

    Feel is not only visual. Touch and sound carry feedback too, and the whole is more than the parts: a few products are remembered for how they feel. And motion that delights one person can make another physically ill, so the last chapter of this part is about reducing it responsibly.

    11

    Haptics and sound

    Taught by Apple's haptics guidelines and Android's haptics design principles

    Haptics and sound are motion you feel and hear. Used well, they confirm a moment the eye might miss (a snap, a success, a boundary). Used badly, they are a buzzing, beeping nuisance. Keep them rare, tied to meaningful events, consistent with what the eye sees, and always optional.

    Since the iPhone 7 (2016) and its Taptic Engine, phones can produce crisp, short taps rather than the old rattling buzz. That changed haptics from an alarm into a design material. A good haptic is like a good press state: you feel a detent when a picker ticks over a value, a soft knock when a sheet snaps into place, a distinct double tap when something succeeds. The best haptics are synchronized exactly with a visual event; a tap that arrives 50ms after the snap feels wrong in the same way as a lagging drag.

    The vocabulary on each platform

    UIKit's UIFeedbackGenerator family (iOS 10 and later) gives three semantic types. Impact (UIImpactFeedbackGenerator) for physical collisions: light, medium and heavy, plus soft and rigid since iOS 13. Selection (UISelectionFeedbackGenerator) for a value ticking over, like a picker wheel. Notification (UINotificationFeedbackGenerator) for outcomes: success, warning, error. Core Haptics (iOS 13) allows custom patterns. In SwiftUI, the .sensoryFeedback modifier (iOS 17) attaches feedback to a value change declaratively.

    // SwiftUI: tick when the selection changes, success when saved
    Picker("Size", selection: $size) { … }
      .sensoryFeedback(.selection, trigger: size)
    Button("Save") { save() }
      .sensoryFeedback(.success, trigger: savedCount)
    Impact, light small things land Impact, heavy big snap, a drop Selection detents as a value ticks Success it worked Warning attention, not failure Error it failed
    Haptics are semantic. Schematic shapes, not exact waveforms: pick the type by meaning (impact, selection, outcome), and let the platform render it for the device.
    Don't
    buzz on every row while scrolling
    Haptic noise. Constant taps during a continuous action numb the sense and drain the battery. People turn system haptics off because of apps like this.
    Do
    threshold reached one tap: "release now will refresh"
    One haptic at a meaningful boundary. It tells you something the eye might miss while your thumb covers the screen: you crossed the line.

    Sound: subtle, synchronized, optional

    Sound is the most intrusive feedback channel: it leaves the device and reaches everyone in the room. So in most software, sound should be reserved for a few events where it truly helps (a message sent, a payment completed, a timer finished), quiet, short, and off when the device is silenced. Good UI sounds share a family: the same timbre and tone, like a typeface for the ear. A sound must be perfectly synchronized with the visual; even small offsets feel like a dubbed film. Always provide a setting to turn sounds off, and never put information only in sound.

    Do

    • Use semantic haptic types and let the platform render them.
    • Fire a haptic exactly at the visual event (snap, threshold, success).
    • Prepare the generator ahead of time to avoid latency (iOS prepare()).
    • Keep sounds short, quiet, from one family, and respect silent mode.

    Don't

    • Vibrate on every tap, row or keystroke of your own invention.
    • Use long buzzes for UI feedback.
    • Use haptics or sound as the only signal.
    • Play sounds on launch or on routine navigation.

    In the wild

    • iOS pickersApple
      The date and time wheels tick with a light selection haptic as each value passes the center line. A detent you can feel, like a physical dial.
    • Apple PayApple
      A completed payment combines a check animation, a success haptic and a short chime. For a consequential success, all three channels agree, once.
    • Long press menusiOS and Android
      A haptic marks the moment a long press becomes a menu or a drag. Haptics mark mode changes the finger cannot see.

    Common mistakes

    Haptics as decoration

    Why it happens: haptics feel premium, so they get added to every button.

    Fix: limit them to boundaries, snaps, selections and outcomes. Buttons already have visual press states.

    Out-of-sync feedback

    Why it happens: the haptic is fired from the network callback rather than the visual event.

    Fix: trigger haptics from the same code path that drives the animation frame.

    Check yourself

    In your habit tracker, which moment most deserves a haptic?

    Exercise 11.1 30 minutes · on your own product

    A haptic and sound budget

    1. List every place your app uses haptics or sound (or could).
    2. Classify each as impact, selection, success, warning, error, or "none needed".
    3. Remove any that fire during continuous actions or on routine navigation.
    4. If you are on iOS or Android, add one well-chosen haptic at your app's most important success moment.
    You're done when: you have a short list of at most five haptic or sound moments, each tied to a visual event and a meaning.
    BeginnerCompetentStrong
    Lists current uses.Budget defined; noisy ones removed.New haptic is synchronized with its animation and tested on a real device with system haptics on and off.
    12

    Feel as a whole: three products that got it right

    Taught by Loren Brichter, FiftyThree and Cultured Code

    "Feel" is what happens when timing, easing, physics, feedback and gesture all agree. You cannot add it at the end; it comes from one idea about how the product should behave in the hand, applied everywhere. Three small products show how.

    The earlier starter guide met Loren Brichter as a teacher of focus. Here we look at his most copied idea purely as motion, alongside two other products whose reputations were built largely on feel. For each, notice the same pattern: one gesture, designed with care for every frame, that teaches itself.

    Pull-to-refresh: a gesture that explains itself

    In Tweetie 2 for iPhone (2009), Loren Brichter replaced the refresh button with a gesture people were already making: scrolling up to the top of the timeline, then a little further. Pull past the top and a hidden strip appears; pull far enough and it tells you to let go. Twitter acquired Tweetie in 2010 and later patented the mechanism, and the pattern spread to nearly every feed on every platform.

    MakerLoren Brichter (atebits)
    Year2009
    CategoryTwitter client, iPhone
    Study it forThresholds, state change mid-gesture, rubber-band reuse
    Pull down torefresh 1 Release torefresh 2 Loading… 3 4 Schematic recreation, not a screenshot.
    Four states in one gesture. Pull, cross the threshold, release, receive. Each state has its own visual, and the change at the threshold happens while your finger is still down, so you can still back out.
    1. Reuse an existing motion. Scrolling past the top already rubber-banded on iPhone. Brichter gave that overscroll a meaning instead of inventing a new gesture. Cost: it is invisible until you try it, which early users learned by accident or from friends.
    2. A visible threshold that changes state mid-gesture. The arrow flips and the label changes at the trigger distance. You know what will happen before you commit, and you can cancel by pushing back up. Cost: an extra state to design and animate.
    3. Hold the list open while loading. The strip stays at its height with a spinner, so the cause (your pull) stays connected to the effect (loading). Cost: content is pushed down briefly.
    4. Insert new items at the top, then collapse. New content arrives where you are already looking. Later versions in other apps added a haptic at the threshold, which is the same idea in another sense.

    Paper by FiftyThree: undo as a gesture in time

    Paper (2012) was a sketching app for iPad. Journals opened and closed with a pinch that tracked your fingers continuously, pages turned like paper, and undo was a gesture called Rewind: circle two fingers counter-clockwise on the canvas and the drawing unwinds stroke by stroke, faster or slower with your circling, clockwise to redo. Apple named it iPad App of the Year for 2012, and it became a reference for gestural feel.

    MakerFiftyThree
    Year2012
    CategorySketching, iPad
    Study it forContinuous gestures, scrubbing time
    Rewind Two fingers circle counter-clockwise. Strokes disappear newest first. Faster circles, faster rewind. history scrubbed like a tape
    Undo with a dial. Instead of a button that steps back one action at a time, Rewind turns history into something you scrub continuously, at your own speed, and reverse. Schematic recreation.
    1. Continuous over discrete. A button press is one step; a circling gesture is a dial, so you can go back ten strokes in one motion and stop exactly where you want. Cost: it must be discovered and learned.
    2. Every gesture tracks. Pinching a journal open follows your fingers the whole way and finishes with a spring on release. Nothing plays as a canned animation once the finger is involved.
    3. Minimal chrome. With almost no buttons on screen, motion and gesture carry most of the interface. That only works because every motion is consistent and reversible.

    Things 3's Magic Plus: create exactly where you mean

    Things 3 (2017) has a floating plus button. Tap it and a new to-do appears in the obvious place. But you can also drag the button into the list: as you drag, the to-dos part to open a gap under your finger, and when you let go, a new to-do opens right there, already in position. The same button can be dropped in other places to create other kinds of items.

    MakerCultured Code
    Year2017
    CategoryTask manager, iOS and Mac
    Study it forLive reflow as a preview, one control with depth
    + Drag the plus into the list Rows part under your finger (live FLIP), previewing exactly where it will land. Release A new to-do opens in the gap, ready to type. No "move to position" step. Tap instead Simple default for beginners.
    One control, two depths. Tap for the default, drag for precision. The animated gap is the explanation: you see the result before you commit. Schematic recreation.
    1. Preview by reflow. The list making room is chapter 8's animated reflow used as a live preview. Cost: smooth reflow on every pointer move must be fast, even with long lists.
    2. Progressive depth. Beginners tap; experts drag. The same object serves both, with no settings or modes.
    3. Motion matches the brand. Things' transitions are quick, soft, rarely bouncy. The calm feel of the whole app comes from many small consistent choices rather than one show-piece.

    Steal this for your software

    • Find a motion people already make (scrolling, dragging, pinching) and give its edge or continuation a meaning, instead of inventing a new gesture.
    • Show the threshold before commitment: let state change while the finger is still down, so people can back out.
    • Turn stepwise controls into continuous ones where precision matters (scrubbing history, adjusting values).
    • Use live reflow as a preview of where something will land.
    • Keep one feel across the product: the same springs, the same durations, the same restraint.

    Do

    • Design one signature interaction with frame-by-frame care.
    • Make every gesture track, threshold, and reverse.
    • Provide a visible or tappable alternative to every gesture.

    Don't

    • Hide essential actions behind gestures only.
    • Copy a signature gesture without its physics; a pull-to-refresh without rubber-banding feels broken.
    • Give the product five signature gestures; one or two is plenty.

    Common mistakes

    Gesture without a fallback

    Why it happens: a clever gesture feels so good that it replaces the button.

    Fix: keep a visible path (a button, a menu item, a keyboard shortcut) for every gesture-only action. Paper's Rewind, for example, worked best for people who already knew it existed.

    Feel spread thin

    Why it happens: you try to make every screen special and run out of time, so all of them are half-finished.

    Fix: pick one signature interaction and make it perfect; keep everything else simple and consistent.

    Check yourself

    You want a signature gesture for your reading app: swipe left on an article to save it for later. What would make it feel as good as pull-to-refresh?

    Exercise 12.1 2 hours · on your own product

    Design one signature interaction

    1. Choose the most frequent meaningful action in your product.
    2. Sketch a gesture or direct-manipulation version: what tracks, where the threshold is, what changes at the threshold, what happens on release, how to cancel.
    3. Prototype it in code (not in a design tool) and use it 50 times over two days.
    4. Keep the existing button as a fallback.
    You're done when: you have a working prototype with tracking, threshold, release and cancel, and a note on what you changed after 50 uses.
    BeginnerCompetentStrong
    Gesture triggers an action but does not track.Tracks, thresholds and reverses.Also has haptic at the threshold, velocity-aware release, reduced-motion behavior and a fallback.
    13

    Reduced motion and safe motion

    Taught by Val Head, with Eric Bailey, WCAG and Apple's Reduce Motion setting

    For some people, motion on screen causes dizziness, nausea, migraines or worse. Every operating system lets people ask for less. Honoring that request is not about removing all animation; it is about replacing large spatial motion with gentle alternatives, while keeping the feedback and meaning.

    The vestibular system in the inner ear senses balance and movement. When the eyes report large motion that the inner ear does not feel (a screen zooming toward you, a background sliding at a different speed than the foreground, a whole page swooping sideways), people with vestibular disorders can experience real physical symptoms that last hours. Vestibular problems are not rare: one US study (Agrawal and colleagues, 2009) estimated that about a third of adults over 40 had some evidence of vestibular dysfunction. Motion sensitivity also comes with migraines, concussion recovery, some attention conditions and simply age.

    In 2013, iOS 7 introduced heavy zoom transitions and a parallax home screen. Many people reported feeling sick, and Apple soon added a Reduce Motion setting. Today every major platform has an equivalent: Reduce Motion on iOS and macOS, Remove animations on Android, an animation effects switch on Windows. Browsers expose all of them through one CSS media query, prefers-reduced-motion.

    Reduce, do not remove

    A common mistake is to treat reduced motion as "no motion". That throws away feedback and continuity that everyone needs. The better model: identify which motion is spatial and large (the triggers) and swap it for something calmer, usually a crossfade or an instant change, while keeping small, non-spatial feedback.

    Reduce or replace Zoom and scale transitions Parallax and depth effects Large slides and full-screen pushes Spinning, rotating, flipping Scroll-linked and scroll-jacked effects Auto-playing and looping animation Bouncy springs and overshoot → crossfade, or change instantly Keep (maybe shorter) Crossfades and opacity changes Color and tint changes Small press and toggle states Progress (a filling bar, not a spin) Focus rings and highlights Content tracking a finger 1:1 Error text (the shake can go) → meaning is preserved
    The reduced-motion swap. Large movement through space is the trigger. Changes in place (opacity, color, small scale) are usually fine and keep the interface understandable.
    Opening a photo

    Your system has reduced motion on, so both versions open instantly here. That is the right call for you; with motion on, the full version zooms from the tile and the reduced alternative crossfades in place.

    Full motion: the photo grows out of the tile you tapped (a shared-element zoom), and shrinks back into it on close. Great continuity, and exactly the kind of large scale change that can trigger symptoms.

    Flashing: the hard limit

    Separate from vestibular sensitivity, flashing content can trigger seizures in people with photosensitive epilepsy. WCAG success criterion 2.3.1 (Level A, the baseline) says content must not flash more than three times in any one-second period, unless the flash is below specific size and brightness thresholds. In practice: never flash. No strobing loaders, no rapidly blinking alerts, no full-screen color flips for celebrations. WCAG 2.2.2 also requires that anything that moves, blinks or scrolls automatically for more than five seconds alongside other content can be paused, stopped or hidden, and 2.3.3 (Level AAA) asks that motion triggered by interaction can be disabled.

    One second 0 s1 s At most 3 Never: 8
    WCAG 2.3.1. No more than three flashes in any one second (there are narrow exceptions for small, dim flashes, but a calm product does not need them).

    How to implement it

    /* Motion is opt-in: define it only when there is no preference against it */
    .sheet { transition: opacity 150ms ease-out; }
    @media (prefers-reduced-motion: no-preference) {
      .sheet { transition: transform 260ms cubic-bezier(.2,0,0,1),
                           opacity 200ms ease-out; }
    }
    /* View Transitions: swap the zoom for a fade */
    @media (prefers-reduced-motion: reduce) {
      ::view-transition-group(*) { animation-duration: 0s; }
    }

    Notice the CSS pattern: motion is defined inside no-preference, so the default is calm and motion is the enhancement. That way, if you forget a case, it fails safe. This "no-motion-first" approach has been advocated by accessibility writers such as Tatiana Mac and Eric Bailey.

    Do

    • Honor the system setting everywhere, including canvas, video backgrounds and JS animation.
    • Replace large spatial motion with crossfades or instant changes.
    • Keep feedback: press states, color changes, progress, error text.
    • Offer an in-app motion setting if your product is motion-heavy.
    • Pause auto-playing motion by default when reduced motion is on.

    Don't

    • Treat reduced motion as "turn off all feedback".
    • Use parallax, zoom-to-fill or scroll-jacking without a reduced alternative.
    • Flash more than three times a second, ever.
    • Rely on motion alone to communicate state.

    In the wild

    • iOS Reduce MotionApple, since 2013
      Replaces zooming app transitions with dissolves and turns off parallax. iOS also offers an option to prefer cross-fade transitions in navigation. The platform's own reduced mode swaps, it does not delete.
    • macOSApple
      With Reduce Motion on, switching full-screen spaces fades instead of sliding. Large lateral movement is the first thing to go.
    • prefers-reduced-motionAll major browsers
      Safari shipped it first, in 2017; it is now supported across modern browsers. There is no technical excuse on the web.
    For the solo creator

    Make it structural, not a task: put your motion tokens behind one function or set of variables that reads the reduced-motion preference. Then every new animation you write inherits the right behavior. Turn Reduce Motion on for one full day of using your product each month.

    Common mistakes

    Only CSS honors the setting

    Why it happens: you add the media query to your stylesheet, but JS-driven animations, canvas and Lottie files ignore it.

    Fix: read matchMedia once in a motion helper and route every JS animation through it.

    Removing the meaning with the motion

    Why it happens: the shake was the only error signal, so with reduced motion there is no error signal.

    Fix: every motion that carries meaning needs a non-motion partner (text, color, icon).

    Check yourself

    With reduced motion on, what should a bottom sheet do when it opens?

    Exercise 13.1 45 minutes · on your own product

    A reduced-motion pass

    1. Turn on Reduce Motion (iOS, macOS), Remove animations (Android) or the Windows equivalent. Use your product for 15 minutes.
    2. List every motion that still plays. Classify each with the reduce or keep chart above.
    3. Fix the "reduce" ones with crossfades or instant changes, including JS and canvas animations.
    4. Check that every motion that carried meaning still has a text or color partner.
    5. Search for anything that flashes or loops forever.
    You're done when: with reduced motion on, your product has no zooms, slides, parallax or spins, and still communicates every state.
    BeginnerCompetentStrong
    CSS media query added.All animations, including JS, honor the setting with good substitutes.Motion is opt-in by default, an in-app setting exists if needed, and a monthly reduced-motion day is on your calendar.
    Part four recap: connect the ideas

    In Accessible & Inclusive, a core rule is "never rely on a single sense". How does it apply across this part?

    Part five

    Building it and writing it down

    You are the designer and the engineer, so the gap between a motion idea and shipped motion is only your own code. These two chapters cover which tools to reach for, how to keep motion smooth at 60 to 120 frames per second, and how to document motion so the version of you six months from now can keep it consistent.

    14

    Implementation for one person

    Taught by Paul Lewis and the Chrome rendering team, with Matt Perry (Motion), Airbnb (Lottie) and Rive

    Animate only transform and opacity, finish every frame within its budget (16.7ms at 60Hz, 8.3ms at 120Hz), and pick the simplest tool that does the job: CSS for state changes, the Web Animations API or a spring library for interactive motion, View Transitions for page changes, SwiftUI's built-in springs on Apple platforms, and Lottie or Rive only for illustrative animation.

    Why transform and opacity

    To draw a frame, a browser (and, in similar ways, a native UI framework) goes through stages: compute styles, lay out boxes, paint pixels into layers, and composite the layers onto the screen. Changing width, height, top or margin forces layout, which can ripple through the whole page, then paint, then composite, every frame. Changing transform or opacity on an element with its own layer skips straight to compositing, which the GPU handles cheaply and often off the main thread. That is the difference between a smooth sheet and a stuttering one on a mid-range phone.

    JS Style Layout Paint Composite width, height, top, left, margin every stage, every frame: expensive, can stutter transform, opacity layout and paint skipped
    The cheap path. Transform (translate, scale, rotate) and opacity can be animated by the compositor alone. Everything else risks a full layout and paint on every frame.
    60 Hz 16.7 ms per frame 120 Hz 8.3 ms per frame Too slow 22 ms: too late, dropped The browser or OS also needs part of each frame, so aim for well under the budget.
    The frame budget. Smoothness is binary per frame: either the frame is ready by the deadline or it is dropped. A few drops during a transition are what people describe as "janky". ProMotion iPhones and many Android phones refresh at up to 120Hz, which halves the budget.

    The toolbox

    ToolBest forWatch out for
    CSS transitionsSimple state changes: hover, press, open and closed, theme changes. Declarative, cheap.Timeline only: no velocity handoff. Cannot animate to or from display:none without newer features.
    CSS animations and linear()Loops (spinners), entrance keyframes, spring-like curves approximated with many points.Hard to interrupt cleanly; keep keyframes short.
    Scroll-driven animationsEffects tied to scroll position (progress bars, reveal on scroll) without JavaScript, via animation-timeline.Easy to overuse; always provide a reduced-motion fallback. Check browser support.
    Web Animations APIelement.animate() from JS: dynamic values (FLIP), reversing, cancelling, awaiting finished.Still timeline-based; for springs, compute or use a library.
    View Transitions APIAnimating between DOM states or pages, including shared elements, with document.startViewTransition() and view-transition-name.Support varies, especially for cross-document transitions; design the no-transition fallback first.
    Motion (formerly Framer Motion)React and vanilla JS: springs, gestures, layout animations, exit animations (AnimatePresence).Adds bundle weight; use it if you would otherwise rebuild it.
    SwiftUI animationswithAnimation, springs (.smooth, .snappy, .bouncy), matchedGeometryEffect, phase and keyframe animators (iOS 17).Implicit animations can animate things you did not intend; scope them with .animation(_:value:).
    LottiePlaying illustrative animations made in After Effects (empty states, onboarding, celebratory moments). Open-sourced by Airbnb in 2017.Not for UI transitions. Files can be heavy; honor reduced motion.
    RiveInteractive vector animations with state machines (characters, animated icons reacting to input), with runtimes for web and native.A separate tool to learn; worth it only for a brand or signature moment.
    :root {
      --dur-fast: 120ms; --dur-base: 220ms; --dur-slow: 340ms;
      --ease-enter: cubic-bezier(.2, 0, 0, 1);
      --ease-exit:  cubic-bezier(.4, 0, 1, 1);
    }
    .menu { opacity: 0; transform: translateY(-4px) scale(.98); pointer-events: none;
            transition: opacity var(--dur-fast) var(--ease-exit),
                        transform var(--dur-fast) var(--ease-exit); }
    .menu.open { opacity: 1; transform: none; pointer-events: auto;
            transition-duration: var(--dur-base);
            transition-timing-function: var(--ease-enter); }
    Don't
    transition: all 300ms;

    Animates every property that changes, including width, padding and colors you never meant to animate, and triggers layout on each frame.

    Transition everything. Convenient, invisible cost. It also makes unrelated state changes (like a theme switch) animate strangely.
    Do
    transition: transform 220ms var(--ease-enter), opacity 160ms;

    Names exactly what moves, uses tokens, and stays on the compositor-friendly path.

    Name the properties. Explicit, cheap and predictable.

    Profiling in ten minutes

    1. Throttle. In Chrome DevTools, set CPU throttling to 4x or 6x slowdown to simulate a mid-range phone.
    2. Record. Use the Performance panel, trigger the animation, stop. Look for long purple (layout) and green (paint) blocks inside the animation.
    3. Show repaints. The Rendering panel's paint flashing highlights what repaints each frame. A sheet sliding should not repaint the page under it.
    4. On iOS, use Instruments (the Animation Hitches template) or simply record the screen at 120fps and count stutters.
    5. Fix by changing what animates, not by adding will-change everywhere. Use will-change: transform only on elements about to animate, and remove it after.

    Do

    • Animate transform and opacity.
    • Use the simplest tool that works: CSS first.
    • Define tokens once and reuse them everywhere.
    • Test on the slowest device you support, throttled.
    • Use Lottie or Rive for illustrations, not for interface transitions.

    Don't

    • Write transition: all.
    • Animate layout properties on large or frequently changing elements.
    • Run animation logic inside a heavy re-render each frame.
    • Ship a 500KB animation file for a loading spinner.

    In the wild

    • View TransitionsChrome 111 (2023), Safari 18 (2024)
      Same-document view transitions shipped first in Chromium, then Safari; cross-document transitions followed. Shared-element page transitions became a few lines of code on the web.
    • MotionMatt Perry, 2024
      Framer Motion became an independent project named Motion, with React and vanilla JavaScript APIs. Library names change; the concepts (springs, layout animation, exit animation) do not.
    • LottieAirbnb, 2017
      Renders After Effects animations exported as JSON on iOS, Android and the web. The right tool when a designer's illustration must play natively and crisply.
    For the solo creator

    Resist the urge to add a motion library on day one. CSS transitions with tokens and a 30-line spring helper cover most of a product. Add Motion (or similar) the day you find yourself writing exit animations and layout animations by hand for the third time. On iOS, SwiftUI's built-in springs are all you need.

    Common mistakes

    Testing only on your fast machine

    Why it happens: your development laptop and new phone hide every performance problem.

    Fix: throttle CPU in DevTools and keep an old phone as a test device.

    will-change on everything

    Why it happens: it is advertised as a performance hint, so it gets sprinkled widely.

    Fix: each layer costs memory. Apply it just before an animation and remove it after, or let the browser decide.

    Check yourself

    A sidebar opens by animating its width from 0 to 280px, and the main content reflows alongside. It stutters on a mid-range Android phone. What is the best fix?

    Exercise 14.1 60 minutes · in code

    A performance pass

    1. Search your code for transition: all and for animated layout properties (width, height, top, left, margin, padding).
    2. Rewrite each one to use transform and opacity, or FLIP.
    3. Throttle CPU 6x and record your three main transitions. Note dropped frames before and after.
    4. Move every duration and easing into tokens if you have not yet.
    You're done when: no transition uses all or layout properties on large elements, and your main transitions hold steady frames under 6x throttling.
    BeginnerCompetentStrong
    Removes transition: all.All animation on the compositor path; tokens used.Profiled before and after, with numbers, on a real mid-range device.
    15

    Motion specs for future-you

    Taught by Rachel Nabors and Val Head, with the Material and Carbon motion systems

    Motion that is not written down drifts. A small set of named tokens (durations, curves, springs) and a one-line spec per transition (trigger, what moves, from and to, timing, reduced-motion alternative) keeps your product feeling like one product, even when the only person on the team is you, months apart.

    Teams write motion specs so designers and engineers agree. As a solo creator you might think you do not need them. But your future self is a different person who has forgotten why the sheet uses 260ms and the menu 180ms. Without a record, each new feature invents its own motion, and within a year the product feels like six apps. Rachel Nabors and Val Head both argue for treating motion as part of the design system rather than one-off decisions; IBM's Carbon design system, for example, documents "productive" motion (quick, efficient) and "expressive" motion (for significant moments) as two named modes.

    Layer 1: tokens

    TokenValueUse for
    dur.instant0 to 80msPress states, hover, selection, keyboard-driven changes
    dur.fast120msToggles, tooltips, small menus, exits
    dur.base220msMenus, popovers, card expand, most entrances
    dur.slow340msFull-screen transitions, shared elements, large sheets
    ease.entercubic-bezier(.2, 0, 0, 1)Anything appearing or responding
    ease.exitcubic-bezier(.4, 0, 1, 1)Anything leaving
    ease.movecubic-bezier(.4, 0, .2, 1)Things moving on screen, visible throughout
    spring.snappyresponse ~0.25s, damping ratio ~0.9Interactive small elements, gesture releases
    spring.smoothresponse ~0.4s, damping ratio 1Sheets, panels, large surfaces
    stagger30ms, max 8 itemsList and grid entrances

    Layer 2: one line per transition

    For each important transition, write a single structured line. It takes a minute and saves an hour later.

    Sheet open   | tap "Filter" | sheet: translateY 100% → 0, ease.enter, dur.slow
                 | scrim: opacity 0 → .4, linear, dur.base, delay 0
                 | interruptible: yes (spring.smooth when dragged)
                 | reduced: sheet + scrim fade, dur.fast
                 | haptic: none | job: orientation (layer above)
    Spec: open detail (shared element) 0100200300 ms Image (shared)BackdropTitleAction 1Action 2Action 3 dur.slow · ease.move dur.base · linear ease.enter Total under 350 ms. Reduced: everything fades together in dur.fast.
    A timeline spec. For your one or two most complex transitions, draw this. Every bar names a token, so the spec stays true if you retune a token later.

    Layer 3: a motion principle in one sentence

    Finally, write one sentence that describes how your product moves, and use it to settle arguments with yourself. For a calm reading app: "Motion is quick, quiet and physical: it explains changes and then gets out of the way." For a playful kids' app it might say "springy and generous". The sentence ties motion to the product's personality (chapter 1's sixth job) without letting personality outrank the other five.

    Don't
    transition: .3s
    duration: 250
    animation: fade 400ms ease
    withAnimation(.easeInOut(duration: 0.35))
    spring(stiffness: 120, damping: 14)
    Magic numbers. Five transitions, five unrelated timings. Nobody, including you, knows which are deliberate.
    Do
    var(--dur-base) var(--ease-enter)
    Motion.dur.fast
    Motion.spring.smooth
    Motion.stagger(30, max: 8)
    Motion.reduced ? .opacity : .slide
    Tokens with names. Change one value and the whole product stays consistent. Reduced motion is a branch in one place.

    Do

    • Keep tokens in code, as the single source of truth.
    • Spec only the transitions that matter: the top five and anything complex.
    • Include the reduced-motion alternative in every spec line.
    • Write your one-sentence motion principle and keep it next to the tokens.

    Don't

    • Write a forty-page motion guideline for a one-person product.
    • Keep specs only in a design file that drifts from the code.
    • Add a new token for every new animation; reuse first.

    In the wild

    • IBM CarbonIBM
      Separates productive motion for routine tasks from expressive motion for significant moments, with token-based durations and curves. Two modes, clearly named, cover most decisions.
    • Material 3Google
      Ships duration and easing tokens, and newer spring-based motion schemes, in its design kits and code libraries. Motion tokens belong in the same system as color and type.
    • Apple HIG, MotionApple
      Short principles rather than numbers: purposeful motion, brief and precise feedback, optional motion, consistency with the platform. Principles plus platform defaults can be a spec.
    For the solo creator

    Your motion spec can be one file in your repo, motion.css or Motion.swift, with tokens at the top and a comment block with your principle and five spec lines. That is it. Review it whenever you add a new kind of transition.

    Common mistakes

    Specs that do not mention exits

    Why it happens: you design the opening and assume the closing is its reverse.

    Fix: every spec line has both directions, with the exit's shorter duration and ease-in.

    Tokens without meaning

    Why it happens: tokens are named by value (dur-220), so they get misused.

    Fix: name by role (dur.base, ease.enter) so the right choice is obvious.

    Check yourself

    Six months from now, you add a new "share" popover. What is the fastest way to give it motion consistent with the rest of your product?

    Exercise 15.1 60 minutes · on your own product

    Write your motion spec

    1. Create one motion file in your codebase with role-named tokens: four durations, three curves, two springs, one stagger.
    2. Write your one-sentence motion principle at the top.
    3. Write spec lines for your five most important transitions, each with a reduced-motion alternative.
    4. Draw a timeline for your most complex transition.
    5. Run the checklist below on your product and fix the first three failures.
    You're done when: the motion file exists, every animation in the product uses its tokens, and the checklist shows at least 15 of 20 items true.
    BeginnerCompetentStrong
    Tokens defined but not used everywhere.Tokens used everywhere; five spec lines written.Spec includes exits, reduced motion, haptics and a timeline; checklist at 18 or more.

    Checklist: motion audit for your product

    Purpose
    Timing and easing
    Physics and gesture
    Structure
    Feedback and speed
    Safety and build
    Part five recap: connect the ideas

    In Systems & Platforms, design tokens keep color and type consistent. What is the most important extra thing a motion token system must encode that color and type tokens do not?

    Wrap-up

    Go back to the note you wrote in the warm-up: one moment that felt good and one that felt wrong in your most-used app. You can now name what was happening. Maybe the good moment was a spring carrying your flick's velocity, and the bad one was a menu easing in, a spinner flashing for 200ms, or a list hard-stopping at its end. That shift, from "it feels off" to "the exit is as long as the entrance and uses the wrong curve", is the skill this guide set out to build.

    Ten things to remember

    1. Motion is information. If cutting an animation to zero loses nothing, it was decoration; ration decoration for rare moments.
    2. Six jobs: continuity, orientation, causality, feedback, attention, personality. Personality comes last.
    3. Most UI motion lives between 150 and 300ms. Shorter for small, near and frequent; longer only for large, far and rare. Keyboard actions are instant.
    4. Ease-out for entering and responding, ease-in (shorter) for leaving, a standard curve for moving on screen, linear for loops and progress.
    5. Springs are defined by forces, not time, so they can be interrupted and keep their velocity. Keep the damping ratio near 1.
    6. Under a finger: track 1:1, rubber-band at the edges, keep momentum, and choose the destination by projecting velocity.
    7. Draw a spatial model and keep it: depth pushes right, peers swap in place, layers rise and fall. Back always reverses.
    8. Animate reflows with FLIP; morph controls in place; acknowledge every press on touch-down.
    9. Feeling fast beats being fast: optimistic updates, delayed and held indicators, skeletons, prefetching and zero layout shift.
    10. Reduce, do not remove: swap large spatial motion for fades when people ask, never flash more than three times a second, and write it all down as tokens.

    Self-assessment: I can…

    Practice assignment for the next two weeks

    About 30 minutes a day, on your own product, in code. Motion is learned by tuning, so the rule is: change a value, use the real thing ten times, then decide.

    1. Days 1 and 2: inventory. Exercise 1.1 (motion inventory) and 7.1 (spatial map). Remove every decorative animation on a frequent path.
    2. Days 3 and 4: tokens. Exercises 3.1 and 4.1. Create your motion file with durations and curves, and replace every magic number.
    3. Day 5: feedback. Exercise 9.1. Press, busy and error states in shared components.
    4. Days 6 and 7: speed. Exercise 10.1. Make your two most frequent actions optimistic, delay your loaders, kill layout shift.
    5. Day 8: springs. Exercise 5.1. Replace your most-reversed transition with a spring.
    6. Day 9: reflow. Exercise 8.1. FLIP your busiest list.
    7. Day 10: safety. Exercise 13.1. A full day with Reduce Motion on; fix what you find.
    8. Days 11 and 12: signature. Exercise 12.1. Prototype one signature interaction with tracking, threshold, release and cancel.
    9. Day 13: performance. Exercise 14.1 on a throttled device.
    10. Day 14: write it down. Exercise 15.1. Your spec and the audit checklist. Record a 60-second screen video of your product before and after the two weeks, and watch them side by side.

    Reflection

    After the two weeks, write three sentences: which change made the biggest difference to how your product feels, which change you expected to matter but did not, and what your one-sentence motion principle turned out to be. Keep it at the top of your motion file.

    Reading and watching list

    • The Illusion of Life: Disney Animation
      Frank Thomas and Ollie Johnston, 1981 · The source of the twelve principles. Read the chapter on the principles; skim the rest for the drawings.
    • Designing Interface Animation
      Val Head, Rosenfeld Media, 2016 · The most practical book on purpose, timing, easing and communicating motion for interfaces.
    • Animation at Work
      Rachel Nabors, A Book Apart, 2017 · Short; why animation helps cognition and how to make it part of a system.
    • Microinteractions
      Dan Saffer, O'Reilly, 2013 · Triggers, rules, feedback and loops; the anatomy behind chapter 9.
    • Creating Usability with Motion: The UX in Motion Manifesto
      Issara Willenskomer, 2017 · The twelve interface-specific principles, each with clear animated examples.
    • Designing Fluid Interfaces
      Apple, WWDC 2018 · Interruptibility, velocity, projection, rubber-banding, spring parameters. Watch it twice.
    • Animate with springs
      Apple, WWDC 2023 · How SwiftUI's springs work and how to think in duration and bounce.
    • FLIP Your Animations
      Paul Lewis, 2015 · The original explanation of First, Last, Invert, Play.
    • Designing Safer Web Animation for Motion Sensitivity
      Val Head, A List Apart, 2015 · What triggers vestibular symptoms and how to design around it.
    • Response Times: The 3 Important Limits
      Jakob Nielsen, Nielsen Norman Group · The 0.1, 1 and 10 second limits, with their history.
    • Material Design: Motion
      Google, m3.material.io · A complete, public motion system with tokens, easing, springs and transition patterns to compare against.
    • Apple Human Interface Guidelines: Motion, and Playing haptics
      Apple · Short platform principles and the semantic haptic vocabulary.

    Next: Words, where the feedback you designed here gets its language. For how motion fits into a full design system, see Systems & Platforms; for the wider accessibility picture, Accessible & Inclusive.