Transform adalah properti CSS untuk mengubah bentuk dan posisi elemen — menggeser (translate), memutar (rotate), membesarkan atau mengecilkan (scale), dan memiringkan (skew) — tanpa mengubah layout di sekitarnya.
🧪 Tebakan cepat — tetangganya ikut geser? Sebuah kartu dikasih
transform: translateX(50px). Apakah elemen di sebelahnya ikut kedorong? Jawabannya: nggak — transform cuma mindahin "gambar"-nya, ruang aslinya tetap dipesan. Itu bedanya samamargin-left: 50pxyang bikin tetangga ikut geser.
Pernah pengen bikin tombol yang sedikit gede pas di-hover, kartu yang miring 3 derajat biar lebih dinamis, atau ikon yang muter pas loading? Itu semua kerjaan transform. Properti ini bisa scale (besarin/kecilin), rotate (puter), translate (geser), skew (miringin) — semua tanpa ngubah layout halaman. Browser gak perlu re-layout, jadi animasi pake transform super mulus.
🤔 Kenapa transform hemat performa? Properti CSS lain (
width,top,margin) trigger "reflow" — browser harus hitung ulang posisi semua elemen sekitar. Transform cuma trigger "compositing" — kerjaan murni GPU. Itu kenapa animasi smooth paketransform, animasi tersendat pakewidth.
scale: untuk memperbesar atau memperkecil tampilan suatu elemen.translate: untuk memindahkan posisi elemen berdasarkan sumbu X dan Y.rotate: untuk merotasi suatu elemen, misalnya dari menghadap ke atas jadi menghadap ke bawah.skew: untuk memiringkan/mencondongkan elemen terhadap sumbu X dan Y.
transform: rotate(90deg);
/* Bisa di-chain — apply dari kiri ke kanan */
transform: scale(0.5) translate(-50%, -50%) rotate(0.5turn);
Tiap fungsi punya varian per-sumbu: scaleX/scaleY, translateX/translateY, rotateX/rotateY (3D).
🎭 Analogi sehari-hari
transform = mengubah posisi/bentuk POSTER tanpa cabut paku dari tembok. Geser, putar, miringkan, kecilkan — paku tetap di posisi awal (browser tidak relayout halaman). Performa cepat.
⚠️ Jebakan yang sering ditemui
- Urutan transform matters —
translate(50px) rotate(45deg)≠rotate(45deg) translate(50px). Browser apply dari KIRI ke KANAN. transformBIKIN stacking context baru — bisa breakposition: fixedchild + z-index.translate(-50%, -50%)+top: 50%= trik centering.scale(0)elemen tetap "ada" di flow, cuma invisible. Tidak sama dengandisplay: none.transform-origindefaultcenter. Untuk rotate dari corner:transform-origin: top left.- GPU-accelerated —
transform+opacitysuper smooth. Animatewidth/toplambat (trigger reflow).
🎯
transformvspositionvsmargin— geser elemen pakai apa?
- Animasi smooth (60fps) →
transform: translate(x, y)(GPU compositing)- Layout permanent shift dengan elemen lain ngikutin →
margin(browser relayout)- Tarik dari spot biasa tanpa ganggu layout →
position: relative+top/left- Lepas dari alur halaman penuh →
position: absolute/fixed- Centering presisi →
transform: translate(-50%, -50%)di absolute elementAturan: untuk animasi/hover state = transform. Untuk static layout = margin/position. Salah pilih = janky animation atau layout bugs.
TL;DR: transform ngubah tampilan elemen tanpa relayout — scale/translate/rotate/skew (+ varian X/Y/Z untuk 3D). GPU-accelerated → animasi smooth 60fps. Multiple transform di-apply dari kiri ke kanan, urutan penting (translate rotate ≠ rotate translate). Bikin stacking context baru. Pakai transform untuk animasi, position/margin untuk static layout.