Menu

CSS Transform: translate, scale, skew dan transform-origin

Property transform memindahkan, mengubah ukuran, memutar, dan memiringkan elemen tanpa mengubah layout di sekitarnya. Pelajari setiap fungsi transform, kenapa urutan fungsi itu penting, transform-origin, property translate, scale, dan rotate yang terpisah, serta trik menengahkan dengan translate(-50%, -50%).

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

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

FungsiKegunaanContoh
translate(x, y)memindahkantranslate(20px, -10px), translate(-50%, -50%)
translateX(x) / translateY(y)memindahkan di satu sumbutranslateY(-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 sumbuscaleX(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)memiringkanskewX(-15deg)
matrix(a, b, c, d, e, f)semua yang di atas dalam satu matriks, biasanya hasil yang dilaporkan kembali oleh browser
nonetanpa 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 property rotate, scale, dan translate.
  • Memberi transform pada elemen inline. <span> atau <a> biasa mengabaikan transform. Ubah menjadi inline-block.
  • Mengira elemen di sekitarnya ikut bergeser. Transform tidak pernah mengubah layout. Untuk membuat ruang, ubah width, margin, atau gap.
  • Urutan fungsi yang salah. rotate() sebelum translate() 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 untuk z-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.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai