CSS Transitions dan Animations
Jadikan Sumber Pilihan di Google Search
Dapatkan tutorial, materi, dan dokumentasi Mahir.dev lebih mudah di Google Search dan AI Overviews.
Dapatkan tutorial, materi, dan dokumentasi Mahir.dev lebih mudah di Google Search dan AI Overviews.
Kembali ke rujukan utama CSS untuk melanjutkan topik lainnya.
Transitions dan animations sama-sama dipakai untuk memberi gerak pada UI, tetapi tujuan dan kontrolnya berbeda.
Kalau dipilih dengan tepat, keduanya membuat UI terasa lebih halus dan lebih mudah dipahami. Kalau dipakai berlebihan, efeknya justru sebaliknya: UI terasa ramai, melelahkan, dan sulit diprediksi.
transitionPakai transition saat perubahan yang ingin dianimasikan adalah transisi sederhana dari keadaan A ke B.
Contoh umum:
transition paling enak dipakai ketika:
Contoh:
.button {
transition: background-color 160ms ease, transform 160ms ease;
}
.button:hover {
background-color: #2563eb;
transform: translateY(-1px);
}Di sini, browser menginterpolasi nilai lama ke nilai baru. Kamu tidak perlu mendefinisikan tahap tengah secara eksplisit.
@keyframesPakai @keyframes saat gerakan perlu lebih dari sekadar transisi dua state.
Contoh umum:
@keyframes cocok ketika:
Contoh:
.loader {
animation: spin 900ms linear infinite;
}
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360
transition vs animationAturan praktisnya sederhana:
Animasi yang baik bukan cuma dekorasi. Ia membantu pembaca memahami apa yang berubah di layar.
Kalau animasinya tidak punya fungsi, biasanya ia lebih banyak menghabiskan perhatian daripada membantu.
Tidak semua properti sama murahnya untuk dianimasikan.
transformopacitycolorbackground-colorbox-shadow dengan hati-hatifilter dengan hati-hatiwidthheighttop, left, right, bottommarginpaddingborder-widthmax-heightProperti layout seperti width dan height sering memicu reflow dan repaint yang lebih mahal daripada transform dan opacity. Untuk efek visual yang sama, biasanya lebih stabil kalau memakai transformasi.
Contoh pendekatan yang lebih aman:
.card {
transition: transform 180ms ease, opacity 180ms ease;
}
.card.is-entering {
transform: translateY(8px);
opacity: 0;
}Ada juga properti yang pada praktiknya tidak bisa dianimasikan secara mulus atau tidak memberi hasil yang berguna untuk animasi.
Contoh yang sering menjebak:
displaypositionfloatauto pada banyak konteks ukuran dan posisiMisalnya, display: none tidak bisa ditransisikan menjadi display: block dengan transition biasa. Solusinya biasanya bukan memaksa animasi di display, melainkan menggabungkan opacity, transform, visibility, atau pengaturan height yang dirancang hati-hati.
Terlalu banyak elemen yang bergerak sekaligus membuat UI terasa bising.
Tanda-tandanya:
Prinsip amannya: animasi harus mendukung hierarki visual, bukan bersaing dengannya.
Kalau satu bagian bergerak cepat, bagian lain lambat, dan easing-nya acak, UI terasa tidak rapi.
Pakai skala yang konsisten untuk elemen sejenis. Contoh:
Angka ini bukan hukum, tapi cukup bagus sebagai titik awal.
Contoh:
Kalau feedback inti tertunda terlalu lama, pengguna mengira aplikasinya lambat.
transformBanyak efek bisa ditulis dengan translate, scale, atau opacity tanpa menyentuh layout. Ini biasanya lebih ringan dan lebih stabil.
Tidak semua pengguna nyaman dengan animasi. Untuk kasus tertentu, sediakan jalur yang menghormati preferensi motion pengguna.
Contoh pendekatan:
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 1ms !important;
animation-iteration-count: 1 !important;
transition-duration: 1ms !important;
scroll-behavior: auto !important;
}
}Isi detailnya bisa disesuaikan, tapi intinya jelas: jangan paksa motion pada pengguna yang meminta pengurangan animasi.
transform dan opacity kalau tujuanmu efek visual yang halus.