Follow-through
Also called follow through or overlapping action
When the main object stops but loose, attached parts keep moving for a moment, swing past, and settle, which makes motion feel physical.
import { motion, useReducedMotion, type Variants } from 'motion/react';
// A loosely damped spring overshoots and settles on its own: with these
// numbers the tag swings about 15 degrees past center before it rests.
const SWING = { type: 'spring', stiffness: 200, damping: 8 } as const;
const TRAIL_ANGLE = 36; // how far the tag lags while the card is moving
const card: Variants = {
hidden: { opacity: 0, x: -60 },
show: { opacity: 1, x: 0, transition: { duration: 0.4, ease: 'easeOut' } }
};
type ProductCardProps = { name: string; price: string; image: string };
export function ProductCard({ name, price, image }: ProductCardProps) {
const reduceMotion = useReducedMotion();
const tag: Variants = {
hidden: { rotate: reduceMotion ? 0 : TRAIL_ANGLE },
show: {
rotate: 0,
transition: reduceMotion ? { duration: 0 } : { ...SWING, delay: 0.15 }
}
};
return (
<motion.article
variants={card}
initial='hidden'
whileInView='show'
viewport={{ once: true }}
className='relative w-60 rounded-2xl border bg-background p-3'
>
<img
src={image}
alt=''
className='aspect-square w-full rounded-xl object-cover'
/>
<h3 className='mt-3 text-sm font-medium'>{name}</h3>
<p className='text-sm text-muted-foreground'>{price}</p>
{/* The tag hangs from the card's bottom edge and pivots at its string. */}
<motion.div
variants={tag}
className='absolute top-full right-6 flex origin-top flex-col items-center'
>
<span className='h-4 w-px bg-foreground/40' />
<span className='rounded-md bg-red-500 px-2 py-1 text-xs font-semibold text-white'>
Sale
</span>
</motion.div>
</motion.article>
);
}When the product card slides into view, stop the card itself with an ease-out curve over 400ms, and let the "Sale" tag hanging from its bottom edge swing from its top center on a spring (stiffness 200, damping 8), so it overshoots by about 15 degrees and settles. Keep the tag still when prefers-reduced-motion is set.
Paste into Layerwise or any AI coding tool.
What is Follow-through?
Follow-through comes from the 12 principles of animation. Real things rarely stop all at once: when a runner stops, their hair and clothes keep going; when a card stops sliding, a tag hanging from it swings forward and settles. Animators pair it with overlapping action, where the parts of an object start and stop at slightly different times.
In interfaces it shows up as a badge that bounces after its icon lands, a chevron that settles a beat after a panel opens, or list items that arrive just after their container. Springs give you follow-through almost for free, because a loosely damped spring overshoots and settles on its own.
Keep the secondary motion small and quick, usually settling within about 400ms, so the interface still feels crisp. Apply it to decorative parts and keep text and controls steady, so nothing people need to read or tap wobbles.
Often confused with
- Overshoot easing
- Overshoot easing makes the main element itself travel past its target. With follow-through the main element stops cleanly and the parts attached to it swing past.
Related terms
All termsAnticipation
A small move in the opposite direction just before the main action, like crouching before a jump, so the motion that follows reads clearly.
Spring animation
An animation driven by simulated spring physics in place of a fixed duration and curve, so motion can overshoot, settle, and react naturally.
Damping
A spring setting that works like friction, deciding whether motion bounces and wobbles on arrival or settles smoothly without overshooting.
Bounce
A spring setting from 0 to 1 for how much an element overshoots and wobbles, used with a duration in place of stiffness and damping.
Build it with Layerwise
Describe your app, watch it run in a live preview, and publish it with a database, storage, and sign-in built in.
