Easing & Timing Functions — Web Animation

Easing & Timing Functions Timing function (atau easing) menentukan kurva kecepatan animasi — apakah animasi mulai pelan lalu cepat, atau cepat lalu pelan, atau

Easing & Timing Functions

Timing function (atau easing) menentukan kurva kecepatan animasi — apakah animasi mulai pelan lalu cepat, atau cepat lalu pelan, atau konstan. Easing yang tepat membuat animasi terasa natural dan menyenangkan.

Built-in Timing Functions

CSS menyediakan beberapa keyword easing:

/* linear — kecepatan konstan dari awal sampai akhir */
.linear { transition: transform 0.3s linear; }

/* ease — mulai pelan, cepat di tengah, pelan di akhir (default) */
.ease { transition: transform 0.3s ease; }

/* ease-in — mulai pelan, makin cepat */
.ease-in { transition: transform 0.3s ease-in; }

/* ease-out — mulai cepat, makin pelan */
.ease-out { transition: transform 0.3s ease-out; }

/* ease-in-out — pelan di awal dan akhir */
.ease-in-out { transition: transform 0.3s ease-in-out; }

Kapan Pakai yang Mana?

Easing Kapan Dipakai
ease-out Elemen masuk ke layar (entry) — terasa responsif
ease-in Elemen keluar dari layar (exit) — terasa natural
ease-in-out Elemen bergerak dari satu posisi ke posisi lain
linear Animasi yang harus konstan (progress bar, rotation)

Custom Cubic Bezier

Untuk kontrol penuh, gunakan cubic-bezier(x1, y1, x2, y2):

/* cubic-bezier menggunakan 2 control point */
/* (x1, y1) = control point pertama */
/* (x2, y2) = control point kedua */

.custom-ease {
  /* Mulai sangat cepat, perlahan di akhir */
  transition: transform 0.4s cubic-bezier(0.25, 0.1, 0.25, 1);
}

/* Overshoot — melewati target lalu kembali */
.overshoot {
  transition: transform 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
}

/* Snappy — terasa cepat dan tajam */
.snappy {
  transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}

Tips: Gunakan tools seperti cubic-bezier.com atau DevTools untuk membuat dan preview kurva custom.

Easing Populer

/* Material Design standard easing */
.material-standard {
  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}

/* Apple-style easing */
.apple-ease {
  transition: all 0.35s cubic-bezier(0.25, 0.1, 0.25, 1);
}

/* Bounce effect */
.bounce {
  transition: transform 0.6s cubic-bezier(0.68, -0.55, 0.265, 1.55);
}

/* Elastic / Spring-like */
.elastic {
  transition: transform 0.8s cubic-bezier(0.68, -0.6, 0.32, 1.6);
}

Step Functions

Untuk animasi frame-by-frame (seperti sprite animation):

/* steps(n) — bagi animasi jadi n langkah diskrit */
.sprite {
  animation: walk 0.8s steps(8) infinite;
}

/* step-start dan step-end */
.blink {
  animation: blink 1s step-end infinite;
}

@keyframes blink {
  50% { opacity: 0; }
}

Konsep Spring Physics

Library modern seperti Framer Motion menggunakan spring physics alih-alih cubic-bezier:

// Spring animation menggunakan parameter fisika:
// - stiffness: kekakuan pegas (makin tinggi = makin cepat)
// - damping: redaman (makin tinggi = makin sedikit bounce)
// - mass: massa objek (makin berat = makin lambat)

// Framer Motion example
<motion.div
  animate={{ x: 100 }}
  transition={{
    type: 'spring',
    stiffness: 300,
    damping: 20,
  }}
/>

Spring animation terasa lebih natural karena mengikuti hukum fisika nyata — objek berat bergerak lambat, objek ringan bergerak cepat dan bouncy.

Perbandingan Visual

/* Semua animasi berikut punya durasi sama,
   tapi terasa sangat berbeda karena easing */

.box-1 { animation: slide 1s linear; }
.box-2 { animation: slide 1s ease-in; }
.box-3 { animation: slide 1s ease-out; }
.box-4 { animation: slide 1s ease-in-out; }
.box-5 { animation: slide 1s cubic-bezier(0.34, 1.56, 0.64, 1); }

@keyframes slide {
  from { transform: translateX(0); }
  to { transform: translateX(300px); }
}

Easing adalah "bumbu" animasi — perbedaan antara animasi yang terasa kaku dan animasi yang terasa hidup. Eksperimenlah dengan berbagai kurva!