- Bab 9 dari 10
- 30 menit
- 1 latihan kode
- 4 soal kuis
Transform, Transition, dan Animasi
Di bab ini (10 bagian)
Tujuan bab ini
- Mengubah posisi, ukuran, sudut, dan kemiringan elemen dengan
transformdan mengatur titik pusatnya lewattransform-origin. - Membuat perubahan gaya yang halus dengan
transition(property, duration, timing-function, delay). - Menulis animasi sendiri dengan
@keyframesdananimation, termasuk iteration, direction, dan fill-mode. - Menghormati
prefers-reduced-motiondan memilih properti yang ringan dianimasikan.
Kenapa gerakan penting
Tombol yang sedikit membesar saat disentuh kursor, kartu yang naik pelan, notifikasi yang meluncur dari atas: semua itu memberi tahu pengguna "aksi kamu terbaca". Gerakan yang pas membuat antarmuka terasa hidup. Gerakan yang berlebihan membuat pusing. Bab ini membahas alatnya dan juga kapan harus menahan diri.
transform: memindah, membesar, memutar, memiringkan
transform mengubah tampilan elemen tanpa menggeser elemen lain di sekitarnya. Browser tetap menyisakan ruang asli elemen di layout, lalu menggambar elemen itu di posisi atau ukuran baru. Analoginya seperti stiker yang kamu geser di atas kertas: garis tulisan di kertas tidak ikut pindah.
| Fungsi | Efek | Contoh |
|---|---|---|
translate(x, y) | memindah posisi | translateX(50%) geser setengah lebar elemen sendiri |
scale(n) | memperbesar atau memperkecil | scale(0.5) jadi setengah ukuran |
rotate(sudut) | memutar searah jarum jam | rotate(-90deg) putar ke kiri |
skew(x, y) | memiringkan | skewX(15deg) efek huruf miring |
Beberapa fungsi bisa digabung dalam satu transform, dan urutannya berpengaruh. translateX(100px) rotate(45deg) menggeser dulu baru memutar di tempat. rotate(45deg) translateX(100px) memutar sumbu dulu, jadi elemen bergerak miring 45 derajat. Satu hal lagi: kalau kamu menulis transform dua kali di aturan berbeda, yang terakhir menimpa semuanya, bukan menambah.
transform-origin: titik engsel
Secara default, transform berporos di tengah elemen (50% 50%). Ubah porosnya dengan transform-origin:
.pintu berputar seperti daun pintu dengan engsel di kiri. .jarum berputar dari pangkal bawah seperti jarum jam. Coba bayangkan memutar penggaris: hasilnya beda jauh tergantung kamu pegang ujung atau tengahnya.
transition: dari A ke B dengan halus
Tanpa transition, perubahan gaya (misalnya saat :hover) terjadi instan. Transition memberi waktu agar browser menghitung nilai di antaranya.
Shorthand transition berisi empat bagian:
- property: properti yang dianimasikan, misalnya
transform. Bisaall, tapi lebih aman sebut satu per satu. - duration: lama perubahan, misalnya
0.3satau300ms. - timing-function: kurva kecepatan.
ease(default) cepat di tengah,linearrata,ease-inpelan di awal,ease-outpelan di akhir,ease-in-outpelan di kedua ujung, atau kurva kustomcubic-bezier(). - delay: jeda sebelum mulai. Angka waktu pertama selalu dibaca sebagai duration, angka kedua sebagai delay.
Penting: transition dipasang di keadaan awal (.tombol), bukan hanya di :hover. Dengan begitu, animasinya jalan dua arah, saat kursor masuk dan saat keluar. Transition juga hanya bekerja di antara dua nilai yang bisa dihitung. display: none ke block tidak bisa dibuat halus dengan cara biasa, sedangkan opacity: 0 ke 1 bisa.
@keyframes dan animation
Transition butuh pemicu dan hanya punya dua titik. Kalau kamu ingin animasi yang jalan sendiri, berulang, atau punya banyak tahap, pakai @keyframes.
@keyframes pantul adalah naskah gerakannya, animation adalah perintah untuk memainkannya. Shorthand di atas sama dengan properti panjang berikut:
Tiga properti yang sering membingungkan:
- iteration-count: berapa kali diputar. Angka seperti
3, atauinfiniteuntuk tanpa henti. - direction:
normaldari 0% ke 100%,reversesebaliknya,alternatebolak-balik (maju, mundur, maju),alternate-reversemulai dari mundur. Denganalternate, keyframes cukup dua titik untuk efek naik turun. - fill-mode: gaya apa yang dipakai di luar waktu animasi.
forwardsmempertahankan keadaan frame terakhir setelah selesai,backwardsmemakai frame pertama selama masa delay,bothgabungan keduanya. Tanpaforwards, elemen yang dianimasikan memudar masuk akan "melompat" kembali ke gaya aslinya begitu animasi berakhir.
Notifikasi ini tersembunyi selama delay 0.2 detik (berkat backwards di dalam both), meluncur naik, lalu tetap terlihat.
prefers-reduced-motion
Sebagian orang mengalami pusing atau mual karena gerakan di layar. Sistem operasi menyediakan setelan "kurangi gerakan", dan CSS bisa membacanya:
Ini bukan hiasan tambahan, ini aksesibilitas dasar. Animasi dekoratif boleh dimatikan total, sedangkan perubahan penting (misalnya status tombol) tetap terjadi, hanya tanpa gerakan.
Performa: animasikan transform dan opacity
Setiap kali gaya berubah, browser bisa harus melakukan tiga tahap: layout (menghitung ulang posisi dan ukuran semua elemen), paint (menggambar ulang piksel), dan composite (menyusun lapisan). Mengubah width, top, atau margin memicu layout, yang mahal dan bisa membuat animasi patah-patah di HP murah. transform dan opacity umumnya cukup ditangani di tahap composite, sering oleh GPU.
Jadi, alih-alih menganimasikan left: 0 ke left: 200px, pakai transform: translateX(200px). Alih-alih mengubah width untuk efek membesar, pakai scale().
Kesalahan umum
- Menaruh
transitionhanya di:hover, sehingga efek kembali ke awal terjadi patah tanpa animasi. - Menulis dua deklarasi
transformlalu heran kenaparotatehilang. Yang terakhir menimpa, gabungkan dalam satu baris. - Lupa
animation-fill-mode: forwardsatauboth, sehingga elemen kembali ke gaya semula setelah animasi. - Menganimasikan
width,height, atautoppadahaltransformbisa memberi efek yang sama dengan lebih ringan. - Mengabaikan
prefers-reduced-motiondan membuat animasiinfiniteyang mencolok di seluruh halaman.
Rangkuman
transform(translate, scale, rotate, skew) mengubah tampilan tanpa menggeser elemen lain, dan urutan fungsi berpengaruh.transform-originmenentukan titik poros, default di tengah.transitionberisi property, duration, timing-function, delay, dan dipasang di keadaan awal.@keyframesmendefinisikan tahapan,animationmemainkannya dengan iteration-count, direction, dan fill-mode.- Hormati
prefers-reduced-motion: reduceuntuk pengguna yang sensitif gerakan. - Utamakan menganimasikan
transformdanopacityagar mulus.
Slide 21 sampai 22 dari deck HTML5 dan CSS3. Penjelasan lengkapnya ada di mode Baca.

Selesaikan bab ini
- 1. Baca materi
- 2. Latihan kode (1)
- 3. Kuis (4 soal)
Latihan kode: Tombol, jarum jam, dan bola memantul
Tambahkan gerakan pada halaman ini:
.tombol:transition: transform 0.3s ease-in-out, dan saat:hovermembesar denganscale(1.1)..kartu--angkat:transform: translateY(-8px) scale(1.05)dalam satu deklarasi..jarum:transform-origin: bottom centerdantransform: rotate(45deg).- Buat
@keyframes pantul: 0% dan 100%translateY(0), 50%translateY(-30px). .bola:animation: pantul 1s ease-in-out infinite alternate.- Tambahkan
@media (prefers-reduced-motion: reduce)yang mematikan animasi.bola.
Cek pemahaman
1Berapa nilai `transition-duration` hasil hitung untuk `.kotak`?
<style> .kotak { transition: opacity 0.5s ease 0.2s; } </style> <div class="kotak">Halo</div>2`transform: translateX(50px)` pada sebuah elemen ikut mendorong elemen di sebelahnya 50px ke kanan.
3Pasangan properti mana yang paling ringan dianimasikan oleh browser?
4Apa fungsi `animation-fill-mode: forwards`?
