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); }
}
fromsama dengan0%dantosama dengan100%.- 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 keanimation-name. Nama ini peka huruf besar kecil dan tidak boleh berupa kata kunci sepertinone.
Properti animation
| Properti | Yang diaturnya | Default |
|---|---|---|
animation-name | @keyframes mana yang dijalankan | none |
animation-duration | panjang satu siklus | 0s |
animation-timing-function | kurva kecepatan di antara keyframe | ease |
animation-delay | waktu tunggu sebelum siklus pertama (nilai negatif memulai dari tengah jalan) | 0s |
animation-iteration-count | jumlah siklus, atau infinite | 1 |
animation-direction | normal, reverse, alternate, alternate-reverse | normal |
animation-fill-mode | style sebelum dan sesudah animasi: none, forwards, backwards, both | none |
animation-play-state | running atau paused | running |
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. Dengannormalposisinya x = 200 dan hijau; denganreverseia berakhir di x = 0 dan biru, karena keyframe terakhir yang dimainkan adalahfrom.alternatedengan jumlah 2 berjalan ke sana lalu kembali, jadi bahkan denganforwardskotak 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:
- 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; }
}
- 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-nya0s. - Nama yang tidak cocok.
animation-nameharus sama persis dengan nama@keyframes, termasuk huruf besar kecilnya. - Melompat kembali di akhir. Tambahkan
forwards(atauboth) untuk mempertahankan keyframe terakhir. - Kedipan sebelum animasi yang tertunda dimulai. Selama
animation-delay, elemen menampilkan style normalnya.backwards(atauboth) menerapkan keyframe pertama selama delay. - Memulai ulang animasi dengan mengatur nilai yang sama. Mengatur
animationyang 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. Animasikanopacitydantransformsebagai 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.