CSS Animations — CSS

Transitions cuma bisa A → B (warna biru jadi hitam, posisi 0 jadi 100). Tapi pas kamu pengen elemen geleng-geleng kepala kayak nolak (kanan-kiri-kanan-kiri-teng

Transitions cuma bisa A → B (warna biru jadi hitam, posisi 0 jadi 100). Tapi pas kamu pengen elemen geleng-geleng kepala kayak nolak (kanan-kiri-kanan-kiri-tengah)? Itu butuh banyak titik tahap, bukan cuma 2. CSS Animations + @keyframes kasih kamu kontrol penuh per tahap — kayak bikin video stop-motion: kamu definisikan frame penting, browser interpolate frame-frame antaranya jadi gerakan halus.

💡 Pembeda profesional vs amatir. Web yang dipenuhin animasi norak = amatir. Web yang animasinya "tepat di momen yang tepat" (modal slide-in pas dibuka, error message shake kecil pas validasi gagal) = profesional. Animation jago bukan soal seberapa banyak, tapi soal kapan dan kenapa.

Mendefinisikan keyframes:

@keyframes geser-kanan {
  from {
    transform: translateX(0);
  }
  to {
    transform: translateX(200px);
  }
}

Bisa juga menggunakan persentase untuk lebih dari 2 tahap:

@keyframes warna-berubah {
  0%   { background: red; }
  50%  { background: yellow; }
  100% { background: green; }
}

Menggunakan animasi pada elemen:

.kotak {
  animation-name: geser-kanan;
  animation-duration: 2s;
  animation-timing-function: ease;
  animation-delay: 0s;
  animation-iteration-count: infinite;
  animation-direction: alternate;
}

/* Shorthand */
.kotak {
  animation: geser-kanan 2s ease infinite alternate;
}

Properti animation:

🎭 Analogi sehari-hari

animation + @keyframes = menyusun video stop-motion. Kamu gambar setiap frame penting (0%, 50%, 100%), browser interpolate yang di antaranya. Beda sama transition yang cuma dari A ke B, animation bisa multi-tahap + loop.

⚠️ Jebakan yang sering ditemui

🎯 transition vs animation — pilih yang mana?

  • State change A → B (hover, click, focus) → transition (1 baris CSS, simpel)
  • Multi-tahap (loading spinner, geleng-geleng error, fade-in slide) → animation + @keyframes
  • Loop terus (skeleton shimmer, pulse) → animation dengan infinite
  • Reverse otomatis pas state berubah baliktransition (animation perlu logika manual)

Aturan: kalau bisa diselesaikan pake transition, pake itu — lebih murah, lebih declarative. animation cuma kalau butuh tahap-tahap atau loop.

TL;DR: Animation = multi-tahap gerakan terkontrol via @keyframes (definisi frame) + animation property (cara jalan). Beda transition: animation bisa banyak tahap (0%/50%/100%) + loop (infinite) + auto-reverse (alternate). Pakai animation-fill-mode: forwards biar stay di state akhir. Hormati prefers-reduced-motion (accessibility). Pilih transition kalau cukup A → B, animation kalau butuh tahap atau loop.

Yang akan kamu pelajari