HomeCSS Tailwind
Chapter 6

06 — Animation & Transitions

Transitions

<!-- Basic transition -->
<button class="bg-blue-500 text-white px-4 py-2 rounded transition-colors duration-200 hover:bg-blue-600">
  Hover me
</button>
 
<!-- Multiple properties -->
<div class="transition-all duration-300 ease-in-out hover:scale-105">
  Grows and changes opacity
</div>

Transition Properties

<!-- Specific properties -->
<div class="transition-colors duration-200">           <!-- Colors only -->
<div class="transition-opacity duration-300">          <!-- Opacity only -->
<div class="transition-transform duration-200">        <!-- Transform only -->
<div class="transition-all duration-300">              <!-- All properties -->
 
<!-- No transition -->
<div class="transition-none">

Transition Duration

<div class="duration-75">      <!-- 75ms -->
<div class="duration-100">     <!-- 100ms -->
<div class="duration-150">     <!-- 150ms -->
<div class="duration-200">     <!-- 200ms -->
<div class="duration-300">     <!-- 300ms -->
<div class="duration-500">     <!-- 500ms -->
<div class="duration-700">     <!-- 700ms -->
<div class="duration-1000">    <!-- 1000ms -->

Transition Timing Function

<div class="ease-linear">      <!-- Constant speed -->
<div class="ease-in">          <!-- Slow start -->
<div class="ease-out">         <!-- Slow end -->
<div class="ease-in-out">      <!-- Slow start and end -->

Transition Delay

<div class="delay-75">         <!-- 75ms delay -->
<div class="delay-100">        <!-- 100ms delay -->
<div class="delay-300">        <!-- 300ms delay -->
<div class="delay-500">        <!-- 500ms delay -->
<div class="delay-700">        <!-- 700ms delay -->
<div class="delay-1000">       <!-- 1000ms delay -->

Transforms

Scale

<div class="hover:scale-105">     <!-- 105% size -->
<div class="hover:scale-110">     <!-- 110% size -->
<div class="hover:scale-90">      <!-- 90% size -->
<div class="hover:scale-50">      <!-- 50% size -->
<div class="hover:scale-0">       <!-- Invisible -->
 
<!-- Scale X/Y separately -->
<div class="hover:scale-x-110">   <!-- Wider -->
<div class="hover:scale-y-90">    <!-- Shorter -->

Rotate

<div class="rotate-45">            <!-- 45 degrees -->
<div class="rotate-90">            <!-- 90 degrees -->
<div class="rotate-180">           <!-- 180 degrees -->
<div class="hover:rotate-180">    <!-- Rotate on hover -->
 
<!-- Spin animation -->
<div class="animate-spin">
  <svg class="w-6 h-6">...</svg>
</div>

Translate

<!-- Move element -->
<div class="translate-x-4">        <!-- Right 1rem -->
<div class="-translate-x-4">       <!-- Left 1rem -->
<div class="translate-y-4">        <!-- Down 1rem -->
<div class="-translate-y-4">       <!-- Up 1rem -->
 
<!-- Combine -->
<div class="hover:translate-x-2 hover:translate-y-2">
  Moves diagonally on hover
</div>

Skew

<div class="skew-x-12">            <!-- Skew X axis -->
<div class="skew-y-12">            <!-- Skew Y axis -->
<div class="hover:skew-x-6">       <!-- Skew on hover -->

Transform Origin

<div class="origin-center">        <!-- Center (default) -->
<div class="origin-top-left">      <!-- Top left -->
<div class="origin-top-right">     <!-- Top right -->
<div class="origin-bottom-left">   <!-- Bottom left -->
<div class="origin-bottom-right">  <!-- Bottom right -->

Animations

Built-in Animations

<!-- Spin -->
<div class="animate-spin">
  <svg class="w-6 h-6">...</svg>
</div>
 
<!-- Ping (pulse ring) -->
<div class="relative">
  <div class="absolute -top-1 -right-1 flex h-3 w-3">
    <span class="animate-ping absolute inline-flex h-full w-full rounded-full bg-red-400 opacity-75"></span>
    <span class="relative inline-flex rounded-full h-3 w-3 bg-red-500"></span>
  </div>
</div>
 
<!-- Pulse (breathing) -->
<div class="animate-pulse">
  <div class="h-4 bg-slate-200 rounded w-32"></div>
</div>
 
<!-- Bounce -->
<div class="animate-bounce">

</div>

Custom Animations

/* In your CSS file */
@keyframes wiggle {
  0%, 100% { transform: rotate(-3deg); }
  50% { transform: rotate(3deg); }
}
 
@keyframes fade-in-up {
  from {
    opacity: 0;
    transform: translateY(20px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}
 
@keyframes slide-in-left {
  from {
    transform: translateX(-100%);
  }
  to {
    transform: translateX(0);
  }
}
<!-- Use custom animations -->
<div class="animate-[wiggle_1s_ease-in-out_infinite]">
  Wiggling text
</div>
 
<div class="animate-[fade-in-up_0.5s_ease-out]">
  Fades in and moves up
</div>

Common Animation Patterns

1. Button Hover Effect

<button class="px-6 py-2 bg-blue-500 text-white rounded-lg transition-all duration-200 hover:bg-blue-600 hover:scale-105 hover:shadow-lg">
  Click Me
</button>

2. Card Hover Lift

<div class="bg-white rounded-lg shadow-md transition-all duration-300 hover:shadow-xl hover:-translate-y-1">
  <div class="p-6">
    <h3 class="font-semibold">Card Title</h3>
  </div>
</div>

3. Fade In on Load

<div class="animate-[fade-in-up_0.6s_ease-out_forwards] opacity-0">
  Content fades in and slides up
</div>

4. Staggered List Items

<ul>
  <li class="opacity-0 animate-[fade-in-up_0.5s_ease-out_forwards]">Item 1</li>
  <li class="opacity-0 animate-[fade-in-up_0.5s_ease-out_0.1s_forwards]">Item 2</li>
  <li class="opacity-0 animate-[fade-in-up_0.5s_ease-out_0.2s_forwards]">Item 3</li>
</ul>

5. Loading Skeleton

<div class="animate-pulse space-y-4">
  <div class="h-4 bg-slate-200 rounded w-3/4"></div>
  <div class="h-4 bg-slate-200 rounded w-1/2"></div>
  <div class="h-4 bg-slate-200 rounded w-full"></div>
</div>

6. Toast Notification

<div class="fixed bottom-4 right-4 bg-green-500 text-white px-6 py-3 rounded-lg shadow-lg animate-[slide-in-left_0.3s_ease-out]">
  Success! Item saved.
</div>

7. Modal Entrance

<div class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center">
  <div class="bg-white rounded-lg p-6 animate-[fade-in-up_0.3s_ease-out]">
    Modal content
  </div>
</div>

Reduced Motion (Accessibility)

/* Respect user's motion preferences */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}
<!-- Tailwind respects prefers-reduced-motion by default -->
<div class="animate-spin">
  <!-- Won't spin if user prefers reduced motion -->
</div>

Key Takeaways

  • Transitions: Smooth property changes on hover/focus (transition-*, duration-*, ease-*)
  • Transforms: Scale, rotate, translate, skew (scale-*, rotate-*, translate-*)
  • Animations: Built-in (animate-spin, animate-pulse) or custom with @keyframes
  • Performance: Use transform and opacity for smooth 60fps animations
  • Accessibility: Respect prefers-reduced-motion
  • Common patterns: Button hover, card lift, fade-in, staggered lists