FlowingDev

Unit CSS, Dijelaskan: Piksel, Em, dan Seni Ukuran Digital

Pelajari perbedaan antara unit CSS absolut (px, pt) dan relatif (em, rem, %, vw, vh) dan mengapa menguasainya adalah kunci desain web modern yang responsif.

Coba tool-nya: Konverter Satuan CSS

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: sebuah px CSS 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 memungkinkan border 1px terlihat 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, seperti border-width atau offset box-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 terhadap font-size dari elemen induk langsungnya. Inilah kekuatan sekaligus bahayanya. Jika sebuah <div> memiliki font-size sebesar 20px, maka di dalam div itu, padding: 1.5em akan dihitung menjadi 30px. Tetapi jika kamu menyarangkan elemen lain dengan font-size: 0.8em di 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. Unit rem hanya relatif pada font-size dari elemen root (tag <html>). Ini menghapus masalah compounding dari em. font-size default di sebagian besar browser adalah 16px, jadi secara default, 1rem sama dengan 16px di mana saja di halaman. Jika pengguna mengubah ukuran font default browser mereka untuk aksesibilitas, seluruh layout berbasis rem-mu akan ikut berskala, yang merupakan kemenangan besar. Karena alasan ini, rem adalah 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): vw adalah 1% dari lebar viewport; vh adalah 1% dari tingginya. width: 50vw berarti "buat elemen ini setengah dari lebar jendela browser." Kasus penggunaan paling klasik adalah height: 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 dengan font-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, seperti 2vw, sering kali dikombinasikan dengan unit rem (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:

  1. "Aku ingin font-size-nya menjadi 1rem + 2vw."
  2. "Tapi, jika 1rem + 2vw dihitung menjadi sesuatu yang lebih kecil dari 1rem (di layar kecil), cukup gunakan 1rem."
  3. "Dan jika 1rem + 2vw dihitung menjadi sesuatu yang lebih besar dari 2.25rem (di layar besar), cukup gunakan 2.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 unit rem tanpa mengetahui berapa font-size root-nya. Trik yang umum adalah mengatur html { font-size: 62.5%; } untuk membuat 1rem sama dengan 10px yang praktis. Jika kamu tidak tahu ini terjadi, elemen 2rem-mu akan menjadi 20px, bukan 32px yang mungkin kamu harapkan.
  • Bingung antara em vs. rem: Menggunakan em untuk padding komponen padahal kamu ingin ukurannya mengikuti UI global (rem akan lebih baik), atau menggunakan rem padahal kamu secara eksplisit ingin ukuran ikon berskala dengan font-size tombol tempat ikon itu berada (em akan lebih baik).
  • Unit vw dan scrollbar: Menerapkan width: 100vw ke elemen tingkat atas adalah kesalahan klasik. Ukuran 100vw bisa 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 px untuk semuanya, termasuk font-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.
  • vh yang terlalu bersemangat: Menggunakan height: 100vh di perangkat seluler bisa jadi rumit. Ketika UI browser (seperti address bar) muncul atau menghilang saat di-scroll, nilai 1vh berubah, menyebabkan layout jadi 'loncat'. Hal ini telah mendorong pengenalan unit baru yang lebih stabil seperti dvh (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 rem memungkinkan 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

Teori beres. Saatnya praktik — 100% di browser kamu.

Coba tool-nya: Konverter Satuan CSS