Table of Contents
▼- Perbedaan translate(), translateX(), translateY(), dan translateZ()
- Kenapa translate Lebih Performa dibanding top/left/margin
- Composite Layer dan Cara GPU Memproses Transform
- Membangun Animasi Kompleks dengan Kombinasi Translate Functions
- Contoh Animasi Nyata
- Tips Praktis sebelum Implementasi
- Kesimpulan
Animasi web yang mulus bukan soal library mana yang kamu pakai. Justru sebaliknya — developer yang benar-benar paham CSS bisa membuat animasi kompleks tanpa satu baris JavaScript pun.
translate() adalah salah satu fungsi CSS transform yang paling sering dipakai tapi paling jarang dipahami secara mendalam.
Kebanyakan developer tahu cara pakainya. Tapi tidak banyak yang tahu kenapa translate jauh lebih performa dibanding top, left, atau margin. Dan lebih sedikit lagi yang paham soal composite layer dan bagaimana GPU terlibat di sini.
Artikel ini membahas semua itu — dari dasar sampai implementasi animasi nyata yang bisa langsung kamu pakai di proyek.
Perbedaan translate(), translateX(), translateY(), dan translateZ()
Keempat fungsi ini berkaitan erat, tapi masing-masing punya peran yang berbeda.
translate()
translate() adalah shorthand untuk memindahkan elemen di sumbu X dan Y sekaligus.
/* Geser 50px ke kanan dan 20px ke bawah */
transform: translate(50px, 20px);
/* Geser hanya di sumbu X, Y = 0 */
transform: translate(50px);
Kalau kamu hanya masukkan satu nilai, sumbu Y otomatis 0. Ini shortcut yang paling sering dipakai untuk centering elemen.
translateX()
Hanya memindahkan elemen secara horizontal — ke kiri (nilai negatif) atau ke kanan (nilai positif).
/* Geser 100px ke kanan */
transform: translateX(100px);
/* Geser 50% dari lebar elemen itu sendiri ke kiri */
transform: translateX(-50%);
Perlu diingat: nilai persentase di translateX mengacu pada lebar elemen itu sendiri, bukan parent-nya. Ini sering jadi sumber bug yang membingungkan.
translateY()
Sama seperti translateX, tapi untuk sumbu vertikal.
/* Turun 30px */
transform: translateY(30px);
/* Naik setengah tinggi elemen */
transform: translateY(-50%);
Trik centering vertikal klasik menggunakan kombinasi top: 50% dan transform: translateY(-50%) memanfaatkan sifat ini.
translateZ()
Ini yang sering diabaikan. translateZ() memindahkan elemen di sumbu Z — artinya mendekat atau menjauh dari viewer dalam ruang 3D.
/* Elemen "mendekat" ke viewer */
transform: translateZ(50px);
/* Elemen "menjauh" */
transform: translateZ(-100px);
translateZ() baru terlihat efeknya kalau parent elemen memiliki perspective. Tanpa itu, elemen hanya berubah skala sedikit atau tidak terlihat perubahannya sama sekali.
.container {
perspective: 800px;
}
.card {
transform: translateZ(50px);
}
Ada juga translate3d(x, y, z) sebagai shorthand untuk ketiga sumbu sekaligus. Ini sangat berguna karena memberi sinyal ke browser untuk mengaktifkan hardware acceleration secara eksplisit.
/* Shorthand untuk ketiganya */
transform: translate3d(50px, 20px, 0);
Kenapa translate Lebih Performa dibanding top/left/margin
Ini adalah pertanyaan yang jawabannya ada di cara browser merender halaman.
Rendering Pipeline Browser
Browser memproses tampilan melalui beberapa tahap:
- Style — Hitung nilai CSS yang berlaku
- Layout — Hitung posisi dan ukuran setiap elemen
- Paint — Gambar piksel ke layer
- Composite — Gabungkan semua layer menjadi gambar akhir
Ketika kamu mengubah properti top atau left, browser harus mengulang dari tahap Layout. Ini memicu recalculation yang mahal — browser harus menghitung ulang posisi semua elemen yang terdampak.
Ketika kamu mengubah margin atau padding, efeknya sama — memicu layout recalculation penuh.
transform Hanya Menyentuh Composite
transform adalah salah satu properti CSS yang hanya memicu tahap Composite, bukan Layout atau Paint.
Ini artinya browser tidak perlu menghitung ulang posisi elemen lain. GPU langsung memindahkan layer elemen tersebut tanpa menyentuh DOM yang lain.
Perbedaan performa di device low-end bisa sangat signifikan — animasi yang menggunakan top/left bisa drop di bawah 30fps, sementara animasi yang sama dengan transform: translate tetap mulus di 60fps.
/* ❌ Buruk: memicu layout recalculation */
.box {
transition: top 0.3s ease, left 0.3s ease;
}
/* ✅ Baik: hanya composite */
.box {
transition: transform 0.3s ease;
}
opacity Juga Composite-Only
Selain transform, properti opacity juga hanya memicu composite. Itulah kenapa kombinasi transform dan opacity adalah pasangan animasi terbaik dari sisi performa.
Composite Layer dan Cara GPU Memproses Transform
Untuk benar-benar paham kenapa translate itu cepat, kamu perlu mengerti konsep composite layer.
Apa Itu Composite Layer?
Browser memiliki kemampuan untuk memisahkan elemen tertentu ke dalam layer tersendiri di memori GPU. Layer ini bisa dimanipulasi secara independen tanpa mempengaruhi elemen lain.
Elemen yang dipromosikan ke composite layer akan diproses langsung oleh GPU, bukan CPU. GPU dirancang untuk memproses transformasi geometris secara masif dan paralel — itulah tugasnya.
Kapan Browser Membuat Composite Layer?
Browser otomatis mempromosikan elemen ke composite layer dalam beberapa kondisi:
- Elemen menggunakan
will-change: transformatauwill-change: opacity - Elemen menggunakan
transform: translateZ(0)atautranslate3d - Elemen yang sedang dianimasikan dengan
transformatauopacity - Elemen dengan
position: fixed - Elemen dengan
filterataubackdrop-filter
Trik will-change
will-change adalah properti CSS yang memberi tahu browser sebelumnya bahwa elemen akan berubah. Ini membuat browser bisa mempersiapkan layer lebih awal.
.animated-card {
will-change: transform;
}
Tapi gunakan will-change dengan hati-hati. Setiap composite layer memakan memori GPU. Kalau terlalu banyak elemen yang diberi will-change, justru bisa memperlambat performa karena GPU memory pressure.
Gunakan hanya untuk elemen yang memang akan dianimasikan, bukan semua elemen.
Cara yang lebih aman adalah menambah dan menghapus will-change via JavaScript tepat sebelum dan sesudah animasi:
element.addEventListener('mouseenter', () => {
element.style.willChange = 'transform';
});
element.addEventListener('animationend', () => {
element.style.willChange = 'auto';
});
Cara Inspect Composite Layer di DevTools
Buka Chrome DevTools → Rendering → aktifkan "Layer borders". Layer yang dipromosikan ke GPU akan dikelilingi border oranye.
Ini berguna untuk memverifikasi apakah animasi kamu sudah berjalan di GPU layer atau masih di CPU.
Membangun Animasi Kompleks dengan Kombinasi Translate Functions
Kekuatan sebenarnya dari translate muncul ketika kamu mengombinasikannya dengan transform functions lain dan CSS custom properties.
Chaining Multiple Transforms
Kamu bisa menggabungkan beberapa transform dalam satu deklarasi:
.element {
transform: translateX(20px) translateY(-10px) rotate(5deg) scale(1.05);
}
Urutan transform itu penting. Browser menerapkannya dari kanan ke kiri. rotate dulu, baru translate — hasilnya berbeda dengan translate dulu baru rotate.
CSS Custom Properties untuk Animasi Dinamis
CSS custom properties membuat animasi translate jauh lebih fleksibel:
.card {
--x: 0px;
--y: 0px;
transform: translate(var(--x), var(--y));
transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
}
.card:hover {
--x: 0px;
--y: -8px;
}
Dengan pendekatan ini, kamu bisa mengubah nilai --x dan --y dari JavaScript tanpa menyentuh properti transform langsung. Kode lebih bersih dan mudah di-maintain.
@keyframes dengan translate
Untuk animasi yang berulang atau lebih kompleks, @keyframes adalah jawabannya:
@keyframes float {
0%, 100% {
transform: translateY(0px);
}
50% {
transform: translateY(-15px);
}
}
.floating-element {
animation: float 3s ease-in-out infinite;
}
Contoh Animasi Nyata
Mari kita buat tiga animasi yang sering dibutuhkan di proyek nyata.
1. Card Hover dengan Lift Effect
.card {
background: white;
border-radius: 12px;
padding: 24px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
transition: transform 0.25s ease, box-shadow 0.25s ease;
will-change: transform;
}
.card:hover {
transform: translateY(-6px);
box-shadow: 0 12px 24px rgba(0, 0, 0, 0.15);
}
Efek ini simpel tapi sangat efektif. translateY(-6px) mengangkat card ke atas, dibarengi shadow yang lebih dalam untuk memberikan ilusi kedalaman.
2. Slide-in Menu dari Kiri
.sidebar {
position: fixed;
top: 0;
left: 0;
width: 280px;
height: 100vh;
background: #1a1a2e;
transform: translateX(-100%);
transition: transform 0.35s cubic-bezier(0.4, 0, 0.2, 1);
will-change: transform;
}
.sidebar.is-open {
transform: translateX(0);
}
const menuBtn = document.querySelector('.menu-btn');
const sidebar = document.querySelector('.sidebar');
menuBtn.addEventListener('click', () => {
sidebar.classList.toggle('is-open');
});
Perhatikan penggunaan translateX(-100%) — ini memindahkan sidebar keluar viewport sepenuhnya tanpa mengubah layout dokumen. Lebih bersih dari display: none karena transisi bisa berjalan mulus.
3. Parallax Ringan dengan translate
Parallax ringan bisa diimplementasi dengan JavaScript minimal dan translate untuk performa optimal:
.parallax-bg {
will-change: transform;
transition: transform 0.1s linear;
}
.hero-content {
will-change: transform;
transition: transform 0.1s linear;
}
let ticking = false;
window.addEventListener('scroll', () => {
if (!ticking) {
requestAnimationFrame(() => {
const scrollY = window.scrollY;
// Background bergerak lebih lambat
document.querySelector('.parallax-bg').style.transform =
`translateY(${scrollY * 0.4}px)`;
// Content bergerak sedikit lebih cepat
document.querySelector('.hero-content').style.transform =
`translateY(${scrollY * 0.2}px)`;
ticking = false;
});
ticking = true;
}
});
requestAnimationFrame di sini krusial. Ini memastikan perubahan transform hanya terjadi satu kali per frame, bukan setiap event scroll yang bisa terpicu puluhan kali per detik.
Tips Praktis sebelum Implementasi
Beberapa hal yang perlu diperhatikan saat menggunakan translate untuk animasi:
- Jangan overuse
will-change. Setiap layer butuh memori GPU. Target hanya elemen yang benar-benar dianimasikan. - Gunakan
translate3d(x, y, 0)untuk force GPU acceleration di browser lama jika diperlukan, meskipun di browser modern ini sudah otomatis. - Perhatikan stacking context.
transformapapun (termasuktranslate) membuat elemen menjadi stacking context baru, yang bisa mempengaruhiz-indexelemen di dalamnya. - Test di mobile device nyata. GPU mobile berbeda dengan desktop. Animasi yang mulus di laptop bisa jank di smartphone mid-range.
- Hindari animasi
transformbersamaan denganfilter. Kombinasi ini kadang memaksa browser membuat layer baru yang tidak diperlukan.
Kesulitan dengan tugas programming atau butuh bantuan coding? KerjaKode siap membantu menyelesaikan tugas IT dan teknik informatika Anda. Dapatkan bantuan profesional di jasa tugas IT KerjaKode.
Kesimpulan
translate(), translateX(), translateY(), dan translateZ() adalah fondasi animasi CSS yang performanya tidak tertandingi library JavaScript manapun — kalau kamu paham cara kerjanya.
Kunci utamanya ada tiga: pahami rendering pipeline browser, manfaatkan composite layer dengan bijak, dan selalu ukur performa di DevTools.
Dengan pendekatan yang tepat, kamu bisa membuat animasi yang halus, responsif, dan hemat resource — tanpa satu baris library pun.