Apa fungsi transform
transform mengubah cara elemen digambar: dipindahkan, diubah ukurannya, diputar, atau dimiringkan. Garis putus-putus di bawah menunjukkan posisi setiap kotak kalau tidak diberi transform:
translate(20px, 10px) memindahkan kotak biru 20px ke samping dan 10px ke bawah. scale(1.3) membuat kotak hijau 30% lebih besar di sekitar titik tengahnya. rotate(20deg) memutar kotak kuning searah jarum jam, dan skewX(-20deg) memiringkan kotak gelap. Dalam semua kasus, slot putus-putus itu, yaitu ruang yang dipakai elemen di layout, tetap berada persis di tempatnya semula.
Fungsi transform
| Fungsi | Kegunaan | Contoh |
|---|---|---|
translate(x, y) | memindahkan | translate(20px, -10px), translate(-50%, -50%) |
translateX(x) / translateY(y) | memindahkan di satu sumbu | translateY(-4px) |
scale(s) / scale(x, y) | mengubah ukuran (1 = asli, 0.5 = setengah, negatif = dicerminkan) | scale(1.1), scale(-1, 1) |
scaleX(s) / scaleY(s) | mengubah ukuran di satu sumbu | scaleX(0.5) |
rotate(angle) | memutar searah jarum jam (negatif = berlawanan arah jarum jam) | rotate(45deg), rotate(0.25turn) |
skew(x, y) / skewX(a) / skewY(a) | memiringkan | skewX(-15deg) |
matrix(a, b, c, d, e, f) | semua yang di atas dalam satu matriks, biasanya hasil yang dilaporkan kembali oleh browser | |
none | tanpa transform |
Persentase di translate() relatif terhadap ukuran elemen itu sendiri, bukan ukuran elemen induknya. Rotasi punya halamannya sendiri, lengkap dengan derajat, putaran, dan efek berputar: CSS rotate.
Playground transform
Geser slider-nya. Baris pertama adalah nilai transform yang kamu buat, dan baris kedua adalah matriks yang dihitung browser darinya, yaitu nilai yang dikembalikan getComputedStyle untuk transform apa pun:
Transform tidak memindahkan layout
Elemen yang diberi transform digambar di tempat lain, tetapi halamannya ditata seolah-olah elemen itu tidak diberi transform. Elemen di sekitarnya tetap di posisinya. Inilah yang membuat transform cocok untuk efek hover dan animasi: tidak ada yang ditata ulang di sekitarnya.
Kedua kotak di tengah terlihat 1,5 kali lebih besar. Kotak yang di-scale menimpa tetangganya dan C tetap di tempatnya, sedangkan kotak yang diperbesar dengan width dan height mendorong C 40px lebih jauh.
Beberapa transform dan urutannya
Taruh beberapa fungsi dalam satu transform, dipisahkan spasi. Urutannya mengubah hasil, karena kalau dibaca dari kiri ke kanan, setiap fungsi bekerja di sistem koordinat yang ditinggalkan fungsi-fungsi sebelumnya:
Kotak biru dipindahkan lurus sejauh 120px lalu diputar di tempat. Kotak hijau diputar lebih dulu, jadi "sumbu x"-nya mengarah diagonal, dan translateX(120px) memindahkannya menuruni garis diagonal itu. Fungsinya sama, tempatnya berbeda.
Jebakan lainnya: deklarasi transform kedua menggantikan yang pertama. Kalau sebuah kartu punya transform: rotate(-2deg) dan aturan hover-nya berisi transform: scale(1.05), rotasinya hilang saat hover. Tulis ulang keduanya (rotate(-2deg) scale(1.05)), atau pakai property individual di bawah.
transform-origin
Perubahan ukuran, rotasi, dan kemiringan terjadi di sekitar sebuah titik tetap, yaitu transform origin, yang secara default adalah titik tengah. Ubah titik itu dengan kata kunci, panjang, atau persentase:
Ketiga kotak berputar 25 derajat. Kotak pertama berputar di bagian tengahnya, kotak kedua menjaga sudut kiri atasnya tetap terpaku di sudut slot, dan kotak ketiga menjaga sudut kanan bawahnya. Menu dropdown yang tumbuh dari tombolnya memakai transform-origin: top bersama scale().
Property translate, scale, dan rotate
Browser modern juga punya tiga property terpisah yang melakukan hal yang sama dengan fungsi-fungsi tadi, tetapi bisa diatur dan dianimasikan secara mandiri:
.card {
rotate: -2deg;
transition: scale 0.2s ease-out;
}
.card:hover {
scale: 1.05; /* the rotation stays, because it is a different property */
}
Ketiganya selalu digabungkan seolah-olah ditulis transform: translate(...) rotate(...) scale(...) di depan nilai transform apa pun, dengan urutan deklarasi apa pun. Perhatikan sintaksnya: translate: 10px 20px dan scale: 1.2 menerima nilai tanpa tanda kurung fungsi.
Menengahkan dengan translate(-50%, -50%)
Karena persentase translate() mengacu pada ukuran elemen itu sendiri, top: 50%; left: 50%; transform: translate(-50%, -50%) menengahkan elemen yang diposisikan secara absolute di dalam elemen induknya, berapa pun ukurannya. Halaman center a div membandingkannya dengan flexbox dan grid.
Kesalahan yang sering terjadi
- Dua deklarasi
transform. Yang ditulis belakangan menang sepenuhnya. Gabungkan fungsinya, atau pakai propertyrotate,scale, dantranslate. - Memberi transform pada elemen inline.
<span>atau<a>biasa mengabaikantransform. Ubah menjadiinline-block. - Mengira elemen di sekitarnya ikut bergeser. Transform tidak pernah mengubah layout. Untuk membuat ruang, ubah
width,margin, ataugap. - Urutan fungsi yang salah.
rotate()sebelumtranslate()memindahkan elemen di sepanjang sumbu yang sudah diputar. - Kejutan dengan child
position: fixed. Elemen yang diberi transform menjadi containing block bagi turunan dengan posisi fixed, jadi header fixed di dalamnya ikut ter-scroll. Elemen itu juga membuat stacking context baru untukz-index.
Pertanyaan yang sering diajukan
Apa fungsi transform di CSS?
Property ini mengubah cara elemen digambar: dipindahkan (translate), diubah ukurannya (scale), diputar (rotate), atau dimiringkan (skew). Elemennya tetap berada di tempat aslinya di layout, jadi elemen di sekitarnya tidak bergeser.
Bagaimana cara menerapkan beberapa transform sekaligus di CSS?
Tulis semuanya dalam satu nilai transform, dipisahkan spasi: transform: translateX(50px) rotate(20deg) scale(1.2);. Menulis deklarasi transform kedua akan menggantikan yang pertama, bukan menambahkannya.
Apakah urutan fungsi transform berpengaruh?
Ya. Dibaca dari kiri ke kanan, setiap fungsi bekerja di sumbu yang ditinggalkan fungsi-fungsi sebelumnya, jadi rotate(45deg) translateX(100px) memindahkan elemen di sepanjang sumbu yang sudah diputar, sedangkan translateX(100px) rotate(45deg) memindahkannya lurus lalu memutarnya.
Apa itu transform-origin?
Titik tetap yang menjadi pusat perubahan ukuran, rotasi, dan kemiringan. Default-nya adalah titik tengah (50% 50%). transform-origin: top left membuat elemen membesar dari, atau berputar di sekitar, sudut kiri atasnya.
Kenapa transform tidak berfungsi pada span-ku?
Transform tidak berlaku untuk elemen inline non-replaced seperti <span> atau <a> biasa. Beri elemen itu display: inline-block atau block, dan transform-nya akan berfungsi.