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 15 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.