CSS Transform Filter Effects Stacking Context
Selesai membaca dokumentasi ini?
Kembali ke rujukan utama CSS untuk melanjutkan topik lainnya.
Kembali ke rujukan utama CSS untuk melanjutkan topik lainnya.
Topik ini membahas efek visual yang paling sering dipakai di CSS untuk mengubah tampilan elemen tanpa mengubah struktur markup:
transform: memindahkan, memutar, atau menskalakan elemen secara visual.transform-origin: titik acuan saat transform diterapkan.scale(), rotate(), translate(): fungsi transform yang paling umum dipakai.filter: efek visual yang diterapkan ke elemen itu sendiri.backdrop-filter: efek visual yang diterapkan ke apa pun yang terlihat di belakang elemen.Bagian yang sering terlewat adalah konsekuensi layout dan stacking context. Banyak bug UI bukan muncul karena nilainya salah, tapi karena efek visual ini mengubah cara browser membentuk layer, containing block, dan urutan tumpukan.
Gunakan efek ini saat kamu ingin:
backdrop-filterKalau tujuanmu adalah mengatur tata letak utama, jangan mulai dari transform atau filter. Untuk layout, pakai properti layout seperti margin, inset, position, flex, atau grid terlebih dulu.
transformtransform mengubah rendering visual elemen tanpa memindahkan elemen itu dari alur layout normal. Artinya, browser tetap menghitung ruang elemen seperti biasa, tetapi hasil gambar elemen digambar ulang dengan transform yang kamu minta.
Contoh:
.card {
transform: translateY(-4px) scale(1.02);
}Efek penting dari transform:
transform sering membentuk stacking context baruposition: fixed dan z-indextransform dipakaiPakai transform saat:
transform: translate(...) sama dengan memindahkan elemen dalam layout. Bukan. Ruang layout tetap ada.transform-origintransform-origin menentukan titik acuan saat elemen di-scale, di-rotate, atau di-transform.
Nilai default-nya adalah pusat elemen (50% 50%).
Contoh:
.icon {
transform-origin: top left;
transform: rotate(12deg);
}Tanpa transform-origin yang tepat, rotasi atau skala sering terasa “melompat” karena browser memutar elemen dari titik yang tidak kamu maksud.
Contoh penggunaan yang masuk akal:
scale()scale() memperbesar atau memperkecil elemen secara visual.
Contoh:
.button:hover {
transform: scale(1.04);
}scale() tidak menambah ukuran layout elemen.rotate()rotate() memutar elemen terhadap transform-origin.
Contoh:
.chevron {
transform: rotate(180deg);
}translate()translate() menggeser elemen secara visual pada sumbu X, Y, atau Z.
Contoh:
.toast {
transform: translateY(16px);
}top/lefttranslate() biasanya lebih cocok untuk animasi karena tidak memaksa browser menghitung ulang layout seperti perubahan posisi berbasis properti layout. Untuk animasi UI, ini sering terasa lebih halus.
translate sebagai pengganti layout permanen. Kalau elemen harus benar-benar berada di tempat baru dalam alur dokumen, gunakan layout property.translate tetap bisa membuat elemen tumpang tindih dengan elemen lain tanpa mengubah ruang aslinya.filterfilter menerapkan efek visual pada elemen itu sendiri dan hasil rendernya.
Contoh:
.photo {
filter: grayscale(1) blur(2px);
}Efek yang umum:
blur()brightness()contrast()grayscale()saturate()sepia()hue-rotate()drop-shadow()drop-shadow()filter sering membentuk stacking context baru. Itu berarti elemen yang difilter bisa masuk ke konteks tumpukan sendiri, dan ini bisa memengaruhi layering anak atau sibling di sekitarnya.
z-index bekerja lintas konteks setelah ancestor diberi filter.backdrop-filterbackdrop-filter memfilter apa yang terlihat di belakang elemen, bukan elemen itu sendiri.
Contoh:
.glass {
background: rgb(255 255 255 / 0.12);
backdrop-filter: blur(12px);
}Agar efek ini terlihat, elemen biasanya perlu background yang transparan atau semi-transparan. Kalau background-nya solid penuh, blur di belakangnya tidak akan terasa.
backdrop-filter sama dengan filter. Beda: yang diproses adalah latar di belakang elemen.Ini bagian yang paling sering bikin debug berputar-putar.
transform tidak mengubah layout flow, tetapi bisa mengubah layer dan stacking context.filter dan backdrop-filter dapat memicu konteks visual baru.z-index hanya masuk akal di dalam stacking context yang sama.transform, filter, opacity < 1, atau properti layering lain bisa membuat anak sulit “naik” ke atas elemen luar.z-index dibandingkan, bukan hanya angkanya.Masalah paling umum adalah mengira transform memindahkan elemen dalam flow. Padahal yang bergeser hanya hasil render.
Dampaknya:
transform, filter, opacity, dan beberapa properti lain bisa membentuk konteks baru.
Dampaknya:
z-index-nya besarKalau ancestor punya overflow: hidden, auto, atau clip, elemen yang digeser atau dibesarkan bisa terpotong.
Dampaknya:
Blur, backdrop blur, dan filter pada area besar dapat mahal secara render.
Dampaknya:
Ini sering kelihatan praktis di awal, tapi biasanya jadi sumber utang teknis.
Contoh pola yang sebaiknya dihindari:
translateX() untuk mengatasi grid yang seharusnya diatur ulangscale() untuk mengompensasi ukuran komponen yang salahfilter untuk menutup masalah kontras yang mestinya diselesaikan di desain token.card {
transition: transform 180ms ease, box-shadow 180ms ease;
}
.card:hover {
transform: translateY(-4px) scale(1.01);
}Yang terjadi:
.panel {
background: rgb(255 255 255 / 0.14);
backdrop-filter: blur(16px) saturate(1.2);
border: 1px solid rgb(255 255 255
Yang perlu dicek:
.chevron {
transform-origin: center;
transition: transform 160ms ease;
}
.is-open .chevron {
transform: rotate(180deg);
}Yang perlu diperhatikan:
transform untuk motion dan micro-interaction, bukan untuk layout utama.transform-origin secara eksplisit kalau rotasi atau skala terasa bergeser.z-index tidak bekerja seperti dugaan.filter dan backdrop-filter secukupnya, terutama di area yang luas.z-index dihitung.Positioning, Overflow, dan Stacking ContextCSS Transitions dan AnimationsBox ModelDisplay, Overflow, dan Containment Sederhana