Skip to main content
← 🎨 CSS as a design systemΒ·Module B7 Β· Lesson 1
TaskBuild a button with a smooth transition on hover. .button { padding: 10px 20px; background: #3B82F6; color: white; border: none; border-radius: 8px; transition: background 0.15s ease, transform 0.15s ease; }. .button:hover { background: #2563EB; transform: translateY(-1px); }.

transition vs animation: when to use each

75 XP6 min
Theory

Two flavors of CSS motion

/* TRANSITION β€” interpolate between two states */
.button {
  background: #3B82F6;
  transition: background 0.15s ease;
}
.button:hover { background: #2563EB; }

/* ANIMATION β€” multi-keyframe sequence, can loop */
@keyframes pulse {
  0%, 100% { transform: scale(1); }
  50% { transform: scale(1.05); }
}
.heart { animation: pulse 1.5s infinite; }

When transition wins

Two states: A β†’ B β†’ A. Triggered by user action OR class change.

  • Hover effects (color, transform, shadow).
  • Tab switching (slide content in/out).
  • Modal open/close (opacity, transform).
  • Focus rings (outline appears smoothly).

ONE property changes, ONE direction at a time. Reverses automatically when the trigger is removed.

When animation wins

Multi-step or LOOPING motion.

  • Loading spinners (continuous rotation).
  • Page-load entrance (fade + slide).
  • Attention-pull (pulse, shake).
  • Multi-stage sequences.

@keyframes declares the timeline; animation: name duration timing iteration applies it.

Don't reach for animation when transition fits

Transition is simpler, more testable, and respects :hover / :focus natively. Use animation only when you need keyframes or looping.

πŸ”’

Sign up to start coding

Theory is open to everyone. The interactive editor, live preview, and check are unlocked with a 7-day free trial β€” card required, cancel anytime.

Sign up β€” free trial β†’

First 10 lessons in each track are free. No card needed for those.

← PreviousNext lesson β†’

Get one Python or web tip a day β€” by email

Short, hand-written, no spam. Unsubscribe in one click.