Menu

Animasi CSS: @keyframes, Properti, dan Contoh

Animasi CSS menggerakkan elemen melalui langkah-langkah yang kamu tentukan di @keyframes, dengan sendirinya dan sesering yang kamu mau. Pelajari sintaks @keyframes, kedelapan properti animation, fill-mode dan direction, indikator loading, cara menjeda animasi, dan cara menghormati pengaturan gerakan yang dikurangi.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Animasi CSS dalam satu contoh

Sebuah animasi punya dua bagian: @keyframes, yang menjelaskan langkah-langkahnya, dan properti animation, yang menerapkannya ke elemen dengan durasi tertentu. Kartu ini bergeser masuk dan muncul perlahan saat halaman dimuat:

Ubah kodenya (atau ganti durasinya menjadi 2s) dan pratinjau akan dimuat ulang, jadi kamu bisa melihat kartu itu masuk lagi. Blok @media (prefers-reduced-motion: reduce) mengganti keyframe dengan efek muncul perlahan saja, khusus untuk pembaca yang sistemnya diatur untuk mengurangi gerakan.

Sintaks @keyframes

@keyframes pulse {
  0%   { transform: scale(1); }
  50%  { transform: scale(1.08); }
  100% { transform: scale(1); }
}
  • from sama dengan 0% dan to sama dengan 100%.
  • Tambahkan langkah persentase sebanyak yang kamu perlukan. Langkah dengan style yang sama bisa berbagi satu baris: 0%, 100% { ... }.
  • Properti yang tidak ada di keyframe pertama atau terakhir dianimasikan dari atau menuju nilai milik elemen itu sendiri.
  • Namanya (pulse) adalah nilai yang kamu berikan ke animation-name. Nama ini peka huruf besar kecil dan tidak boleh berupa kata kunci seperti none.

Properti animation

PropertiYang diaturnyaDefault
animation-name@keyframes mana yang dijalankannone
animation-durationpanjang satu siklus0s
animation-timing-functionkurva kecepatan di antara keyframeease
animation-delaywaktu tunggu sebelum siklus pertama (nilai negatif memulai dari tengah jalan)0s
animation-iteration-countjumlah siklus, atau infinite1
animation-directionnormal, reverse, alternate, alternate-reversenormal
animation-fill-modestyle sebelum dan sesudah animasi: none, forwards, backwards, bothnone
animation-play-staterunning atau pausedrunning

Shorthand-nya menerima nilai-nilai ini dalam urutan hampir apa saja. Satu-satunya aturan: nilai waktu pertama adalah durasi dan nilai waktu kedua adalah delay:

.loader {
  animation: pulse 1.2s ease-in-out 0.2s infinite alternate both;
  /*         name  duration timing  delay count   direction fill */
}

direction dan fill-mode secara langsung

Pilih direction, fill mode, dan jumlah perulangan, lalu tekan Play. Kotak itu bergerak 200px ke ujung lintasan. Teks di bawahnya menunjukkan posisi kotak setelah animasi selesai:

Yang perlu diperhatikan:

  • fill-mode: none (default): setelah frame terakhir, kotak melompat kembali ke x = 0 dan berwarna kuning tua lagi.
  • forwards: kotak tetap di keyframe terakhir. Dengan normal posisinya x = 200 dan hijau; dengan reverse ia berakhir di x = 0 dan biru, karena keyframe terakhir yang dimainkan adalah from.
  • alternate dengan jumlah 2 berjalan ke sana lalu kembali, jadi bahkan dengan forwards kotak berakhir di x = 0.

Perulangan tanpa henti: indikator loading

infinite mengulang animasi selamanya, dan animation-delay pada setiap anak elemen menggeser waktunya sehingga mereka bergerak bergantian. Buat perulangan tetap tenang: lambat, kecil, tanpa kedip.

role="status" bersama aria-label memberi tahu pengguna pembaca layar bahwa ada sesuatu yang sedang dimuat, hal yang tidak bisa disampaikan titik-titik itu sendiri. Untuk lingkaran yang berputar, lihat halaman rotate.

Menjeda dan mengendalikan animasi

animation-play-state: paused membekukan animasi di posisinya, dan running melanjutkannya dari sana. Arahkan kursor ke batang di bawah untuk menjedanya:

Dari JavaScript, element.getAnimations() mengembalikan animasi CSS yang sedang berjalan, masing-masing dengan pause(), play(), cancel(), dan currentTime yang bisa kamu baca atau atur. Event animationend dipicu saat animasi yang tidak infinite selesai, dan animationiteration di akhir setiap siklus.

Hormati pengaturan gerakan dikurangi dan jangan pernah berkedip

Dua aturan aksesibilitas berlaku untuk setiap animasi:

  1. Gerakan dikurangi. Orang bisa meminta sistemnya mengurangi gerakan karena gerakan membuat mereka tidak nyaman. Pola paling aman adalah menambahkan gerakan hanya jika mereka tidak meminta pengurangan:
@media (prefers-reduced-motion: no-preference) {
  .hero-title { animation: slide-in 0.8s ease-out both; }
}
  1. Tanpa kedip. Konten yang berkedip lebih dari tiga kali dalam satu detik bisa memicu kejang. Hindari kedipan cepat dengan kontras tinggi sama sekali.

Jaga animasi tetap mulus

Animasikan transform dan opacity kapan pun bisa. Browser bisa menerapkannya tanpa menata ulang halaman, jadi animasinya tetap mulus bahkan di ponsel yang lambat. Menganimasikan width, height, top, left, atau margin menghitung ulang tata letak di setiap frame. Untuk memindahkan elemen, pakai translate() dari halaman transform.

Kesalahan umum

  • Tanpa durasi. animation: fade; tidak melakukan apa-apa, karena durasi default-nya 0s.
  • Nama yang tidak cocok. animation-name harus sama persis dengan nama @keyframes, termasuk huruf besar kecilnya.
  • Melompat kembali di akhir. Tambahkan forwards (atau both) untuk mempertahankan keyframe terakhir.
  • Kedipan sebelum animasi yang tertunda dimulai. Selama animation-delay, elemen menampilkan style normalnya. backwards (atau both) menerapkan keyframe pertama selama delay.
  • Memulai ulang animasi dengan mengatur nilai yang sama. Mengatur animation yang sama lagi tidak melakukan apa-apa. Hapus dulu, paksa reflow (el.offsetWidth), lalu atur lagi, seperti yang dilakukan tombol Play di atas.
  • Menganimasikan display. Properti ini langsung berganti. Animasikan opacity dan transform sebagai gantinya.

Pertanyaan yang sering diajukan

Bagaimana cara membuat animasi di CSS?

Tentukan langkah-langkahnya dengan @keyframes name { from { ... } to { ... } }, lalu terapkan ke elemen dengan properti animation dan sebuah durasi: animation: name 1s ease-out;. Durasi wajib diisi, karena nilai default-nya 0s.

Apa fungsi animation-fill-mode: forwards?

Nilai ini mempertahankan style dari keyframe terakhir setelah animasi selesai. Tanpa itu, elemen langsung kembali ke style normalnya. backwards menerapkan keyframe pertama selama jeda awal, dan both melakukan keduanya.

Bagaimana cara membuat animasi CSS berulang terus?

Atur animation-iteration-count: infinite, atau tambahkan infinite ke shorthand: animation: spin 1s linear infinite;. Tambahkan alternate agar animasi berjalan maju lalu mundur di setiap siklus.

Apa perbedaan animation dan transition di CSS?

Transition menganimasikan sebuah properti di antara dua nilai saat nilainya berubah, biasanya saat hover atau saat class berganti. Animation berjalan dengan sendirinya begitu diterapkan, bisa punya keyframe sebanyak apa pun, dan bisa diulang, dibalik, serta dijeda.

Bagaimana cara menjeda animasi CSS?

Atur animation-play-state: paused pada elemen, misalnya di :hover atau lewat class yang ditambahkan dengan JavaScript. Mengembalikannya ke running membuat animasi lanjut dari titik ia berhenti.

Bagaimana cara mematikan animasi untuk pengguna yang memilih gerakan dikurangi?

Bungkus animasi di dalam @media (prefers-reduced-motion: no-preference) { ... }, atau hapus animasinya di dalam @media (prefers-reduced-motion: reduce) { ... }. Query ini mengikuti pengaturan pengurangan gerakan di sistem operasi pengguna.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai