Dalam satu kalimat
Unit CSS adalah bahasa yang kita pakai untuk memberitahu browser seberapa besar atau kecil suatu elemen di halaman web, menentukan apakah ukurannya kaku seperti batu atau fleksibel seperti air.
Masalah yang dipecahkannya
Di fajar internet yang masih basah kuyup oleh koneksi dial-up, hidup itu sederhana. Developer mendesain situs web untuk satu resolusi layar yang mulia—mungkin 800x600, atau 1024x768 kalau kamu benar-benar canggih. Raja tak terbantahkan di era ini adalah piksel (px). Itu adalah sebuah perjanjian dengan alam semesta: satu px di kodemu berarti satu piksel cahaya di layar. Layout jadi mudah diprediksi, meskipun rapuh.
Lalu datanglah ledakan Kambrium perangkat. iPhone. Android. Tablet. Laptop dengan bezel setipis silet. Monitor 4K raksasa. Smartwatch. Tiba-tiba, situs web selebar 960px itu jadi sekecil perangko di layar besar dan jadi mimpi buruk yang tidak bisa dinavigasi dan harus di-scroll ke samping di ponsel. Kekuasaan piksel yang penuh kepastian telah berakhir. Kerajaan dalam kekacauan.
Kekacauan ini melahirkan "Responsive Web Design," gagasan bahwa sebuah situs web harus beradaptasi dengan anggun di layar apa pun yang menampilkannya. Untuk mencapai ini, kita butuh kosakata ukuran yang baru—yang bukan tentang pengukuran absolut dan kaku, tapi tentang hubungan.
Inilah masalah yang dipecahkan oleh unit CSS. Mereka menyediakan seperangkat alat yang kaya berupa unit relatif (rem, em, %, vw, vh) yang memungkinkan kita membangun antarmuka yang fleksibel, dapat diskalakan, dan benar-benar responsif. Alih-alih memberitahu sebuah kotak "lebarmu 500 piksel," sekarang kita bisa bilang "lebarmu 80% dari lebar indukmu," atau "biarkan ukuran teksmu 1,5 kali dari ukuran font dasar pilihan pengguna." Ini adalah pergeseran dari memberi perintah kaku menjadi menetapkan aturan yang cerdas.
Cara kerjanya di balik layar
Untuk benar-benar memahaminya, kamu harus membagi unit-unit ini ke dalam beberapa kubu konseptual. Ini semua tentang apa yang setiap unit gunakan sebagai sumber kebenarannya.
Unit Absolut: Penggaris yang Tak Berubah
Unit-unit ini bersifat tetap. Mereka tidak peduli dengan elemen induk, ukuran layar, atau apa pun. Ukuran mereka ya segitu-segitu saja.
px(Piksel): Yang kamu kenal dan cintai. Tapi ada twist-nya: sebuahpxCSS bukanlah lagi piksel perangkat keras fisik! Layar resolusi tinggi (seperti Retina display-nya Apple) memuat beberapa piksel fisik ke dalam ruang satu "piksel CSS". Spesifikasinya mendefinisikan 1px sebagai 1/96 inci. Abstraksi ini memungkinkanborder1pxterlihat kira-kira sama tebalnya di berbagai perangkat dengan kepadatan piksel yang berbeda. Ini adalah unit yang paling umum untuk hal-hal yang kamu ingin tetap ukurannya, sepertiborder-widthatau offsetbox-shadow.pt(Point): Hantu dari dunia percetakan. Dalam tipografi, 1 point adalah 1/72 inci. Hampir tidak pernah digunakan untuk styling layar karena tidak selaras dengan grid piksel, tetapi kamu mungkin melihatnya di stylesheet khusus untuk mencetak halaman web.
Unit Relatif-Font: Berskala Mengikuti Teks
Unit-unit ini brilian untuk membuat UI yang dapat diskalakan di mana jarak dan ukuran elemen membesar atau menyusut bersama dengan ukuran teks.
em: Relatif terhadapfont-sizedari elemen induk langsungnya. Inilah kekuatan sekaligus bahayanya. Jika sebuah<div>memilikifont-sizesebesar20px, maka di dalam div itu,padding: 1.5emakan dihitung menjadi30px. Tetapi jika kamu menyarangkan elemen lain denganfont-size: 0.8emdi dalamnya, kamu akan mendapatkan efek berantai (compounding).<div style="font-size: 20px;"> <!-- font-size adalah 20px --> <p style="padding: 1.5em;"> <!-- padding adalah 1.5 * 20px = 30px --> <strong style="font-size: 1.2em;"> <!-- font-size adalah 1.2 * 20px = 24px --> </strong> </p> </div>Penyarangan ini bisa dengan cepat menyebabkan kegilaan matematis.
rem(Root Em): Pahlawan yang kita butuhkan. Unitremhanya relatif padafont-sizedari elemen root (tag<html>). Ini menghapus masalah compounding dariem.font-sizedefault di sebagian besar browser adalah16px, jadi secara default,1remsama dengan16pxdi mana saja di halaman. Jika pengguna mengubah ukuran font default browser mereka untuk aksesibilitas, seluruh layout berbasisrem-mu akan ikut berskala, yang merupakan kemenangan besar. Karena alasan ini,remadalah standar modern untuk ukuran tipografi, padding, margin, dan sebagian besar komponen layout.
Unit Relatif-Viewport: Ukuran Berdasarkan Jendela
Unit-unit ini terikat langsung ke ukuran jendela browser ("viewport").
vw(Viewport Width) &vh(Viewport Height):vwadalah 1% dari lebar viewport;vhadalah 1% dari tingginya.width: 50vwberarti "buat elemen ini setengah dari lebar jendela browser." Kasus penggunaan paling klasik adalahheight: 100vh, yang menciptakan bagian "hero" yang mengisi layar secara vertikal dengan sempurna.%(Persentase): Unit relatif yang asli. Selalu relatif terhadap properti dari elemen induknya.width: 50%berarti setengah dari lebar kontainer induk.font-size: 120%pada dasarnya sama denganfont-size: 1.2em. Perilakunya tergantung konteks, yang membuatnya kuat tetapi mengharuskan kamu untuk memperhatikan elemen induk.
Keajaiban clamp(): Ukuran yang Fluid
Di sinilah semuanya menyatu. clamp() adalah fungsi CSS yang memungkinkan kamu mendefinisikan ukuran yang dapat membesar tetapi dibatasi antara nilai minimum dan maksimum.
Sintaksnya adalah clamp(MIN, PREFERRED, MAX).
MIN: Nilai minimum absolut. Ukurannya tidak akan pernah lebih kecil dari ini.PREFERRED: Nilai ideal yang dapat diskalakan. Di sinilah kamu biasanya menggunakan unit viewport, seperti2vw, sering kali dikombinasikan dengan unitrem(misalnya,1rem + 2vw).MAX: Nilai maksimum absolut. Ukurannya tidak akan pernah lebih besar dari ini.
Mari kita lihat contoh level dewa untuk tipografi fluid:
font-size: clamp(1rem, 1rem + 2vw, 2.25rem);
Satu baris ini memberitahu browser:
- "Aku ingin
font-size-nya menjadi1rem + 2vw." - "Tapi, jika
1rem + 2vwdihitung menjadi sesuatu yang lebih kecil dari1rem(di layar kecil), cukup gunakan1rem." - "Dan jika
1rem + 2vwdihitung menjadi sesuatu yang lebih besar dari2.25rem(di layar besar), cukup gunakan2.25rem."
Kamu mendapatkan teks yang benar-benar fluid, ukurannya berubah sesuai layar tapi tidak akan pernah jadi terlalu kecil untuk dibaca atau jadi super besar secara konyol, semua tanpa satu pun media query.
Kisah dari dunia nyata
Bencana Berantai em yang Bertumpuk
Seorang developer junior ditugaskan untuk membangun utas komentar bersarang. Ingin menjadi developer modern yang baik, dia menggunakan unit relatif. Dia menata setiap komentar dengan font-size: .9em dan padding: 1em agar balasan sedikit lebih kecil dan tetap memiliki padding yang proporsional. Balasan pertama terlihat bagus. Tetapi balasan-dari-balasan ukurannya jadi mungil. Tingkat keempat dari sarang komentar itu hanya gumpalan teks mikroskopis. Dia telah tergigit oleh sifat compounding dari unit em. Setiap tingkat mengalikan ukuran induknya dengan 0.9, menyebabkan efek sinar pengecil yang eksponensial.
Pelajaran: em itu berantai. Untuk konsistensi di seluruh situs di mana kamu tidak ingin ada efek compounding, rem adalah sahabat terbaik yang stabil dan bisa diprediksi.
Hero "Setinggi Layar" yang Ternyata Tidak
Seorang desainer menyerahkan mockup indah dengan gambar latar belakang satu layar penuh untuk bagian atas beranda. "Buat itu mengisi layar, tidak peduli perangkatnya," kata mereka. Developer, berpikir logis, menerapkan height: 100% ke seksi hero. Seksi itu menghilang. Dia menatap tak percaya. Setelah sesi debugging yang panik, dia belajar bahwa height: 100% berarti 100% dari tinggi induknya. Tapi elemen <body> induknya tidak memiliki tinggi yang ditentukan—tingginya ditentukan oleh kontennya. 100% dari "auto" adalah nol. Dia mengubah gayanya menjadi height: 100vh. Tiba-tiba, keajaiban terjadi. Seksi hero itu langsung pas dengan sempurna di bagian bawah viewport di laptopnya, ponselnya, dan monitor raksasanya.
Pelajaran: Persentase tinggi memerlukan induk dengan tinggi yang ditentukan. Unit viewport (vh dan vw) adalah jalur langsungmu yang jelas ke dimensi layar pengguna.
Pencarian Teks yang Sempurna Fluid
Sebuah tim sedang membangun halaman arahan yang berdampak tinggi. Judul utamanya harus besar di desktop tetapi tetap pas di ponsel. Pendekatan pertama mereka menggunakan media query: font-size: 80px untuk desktop, 60px untuk tablet, dan 40px untuk mobile. Itu berhasil, tapi terasa kaku. Saat kamu mengubah ukuran jendela browser, teksnya akan tiba-tiba "lompat" dari satu ukuran ke ukuran berikutnya di breakpoint. Itu kurang elegan. Lalu, seorang developer menemukan clamp(). Mereka mengganti tiga media query dan tiga aturan CSS dengan satu baris: font-size: clamp(2.5rem, 8vw, 5rem);. Hasilnya luar biasa. Teksnya sekarang berubah ukuran dengan sangat mulus saat jendela diubah ukurannya, membesar dan menyusut dalam gerakan yang berkelanjutan dan fluid.
Pelajaran: Media query itu untuk mengubah layout, tapi clamp() untuk membuat properti yang benar-benar fluid. Ini memberikan pengalaman pengguna yang lebih halus dan canggih yang tidak terasa 'patah-patah' seperti ukuran berbasis breakpoint.
Kesalahan umum dan jebakan
- Lupa dasar
rem: Mengatur semua ukuranmu dalam unitremtanpa mengetahui berapafont-sizeroot-nya. Trik yang umum adalah mengaturhtml { font-size: 62.5%; }untuk membuat1remsama dengan10pxyang praktis. Jika kamu tidak tahu ini terjadi, elemen2rem-mu akan menjadi20px, bukan32pxyang mungkin kamu harapkan. - Bingung antara
emvs.rem: Menggunakanemuntuk padding komponen padahal kamu ingin ukurannya mengikuti UI global (remakan lebih baik), atau menggunakanrempadahal kamu secara eksplisit ingin ukuran ikon berskala denganfont-sizetombol tempat ikon itu berada (emakan lebih baik). - Unit
vwdan scrollbar: Menerapkanwidth: 100vwke elemen tingkat atas adalah kesalahan klasik. Ukuran100vwbisa mencakup lebar scrollbar vertikal, menyebabkan elemenmu sedikit lebih lebar dari area konten dan memicu scrollbar horizontal yang menyebalkan. - Purisme 'hanya piksel': Patuh secara membabi buta pada
pxuntuk semuanya, termasukfont-size. Ini menciptakan desain kaku yang mengabaikan preferensi aksesibilitas pengguna (seperti ukuran font default yang lebih besar) dan tidak beradaptasi dengan baik di berbagai perangkat. vhyang terlalu bersemangat: Menggunakanheight: 100vhdi perangkat seluler bisa jadi rumit. Ketika UI browser (seperti address bar) muncul atau menghilang saat di-scroll, nilai1vhberubah, menyebabkan layout jadi 'loncat'. Hal ini telah mendorong pengenalan unit baru yang lebih stabil sepertidvh(dynamic viewport height).
Mengapa ini harus jadi perhatianmu
Kalau kamu ngoding CSS, kamu tidak bisa lari dari unit. Unit sama fundamentalnya dengan selector dan properti. Memikirkan unit mana yang mau dipakai harusnya jadi proses otomatis setiap kali kamu menulis nilai ukuran.
Memilih unit yang tepat adalah fondasi dari pengembangan web modern.
- Ini penting untuk Aksesibilitas: Menggunakan
remmemungkinkan pengguna untuk menyesuaikan skala antarmuka sesuai kebutuhan mereka. - Ini adalah inti dari Responsivitas: Menggunakan
vw,vh, dan%memungkinkan layout beradaptasi dengan layar yang berbeda. - Ini adalah kunci Desain Fluid: Menggunakan
clamp()menciptakan pengalaman yang terasa mulus dan premium yang mendefinisikan situs web kontemporer.
Menguasai unit CSS adalah hal yang menaikkan level seorang developer dari seseorang yang hanya bisa copy-paste style menjadi seseorang yang dapat merekayasa antarmuka yang tangguh, fleksibel, dan berpusat pada pengguna yang berfungsi untuk semua orang, di perangkat apa pun.
Gali lebih dalam
- MDN Web Docs: CSS Values and Units — Referensi paling utama dan praktis.
- W3C Specification: CSS Values and Units Module Level 4 — Sumber kebenaran resmi dari badan standar.
- MDN Web Docs: clamp() — Penjelasan mendetail tentang fungsi
clamp(). - Smashing Magazine: Fun with Viewport Units — Penggunaan
vwdanvhyang kreatif dan praktis. - A Complete Guide to Fluid Typography oleh CSS-Tricks — Artikel luar biasa yang membahas evolusi hingga
clamp(). - The Surprising Truth About Pixels and Accessibility — Pembahasan mendalam yang fantastis tentang perdebatan
pxvs.rem.