Mengapa Kita Tidak Memakai px untuk Semuanya?
Satuan piksel CSS (px) sangat presisi dan mudah dipahami, tetapi menggunakan px untuk semua properti—terutama untuk ukuran huruf (font-size) dan lebar kontainer—memiliki kelemahan serius:
- Mengabaikan Preferensi Ukuran Huruf Pengguna: Banyak pengguna dengan gangguan penglihatan mengubah ukuran fon bawaan di pengaturan peramban mereka dari
16pxmenjadi20pxatau24px. Jika Anda mengunci ukuran teks denganfont-size: 14px, teks Anda akan tetap kecil dan mengabaikan pengaturan aksesibilitas pengguna tersebut! - Tidak Luwes di Ribuan Ukuran Layar: Lebar layar pengunjung berkisar dari
320px(ponsel kecil) hingga2560px(monitor lebar).
Oleh karena itu, pengembang front-end profesional memilih satuan berdasarkan konteks propertinya.
1. Memilih Satuan: px, rem, em, dan ch
| Satuan | Mengacu Pada | Kapan Harus Digunakan? |
|---|---|---|
rem (Root EM) | Ukuran font-size pada elemen akar <html> (bawaan peramban: 1rem = 16px). | Pilihan utama untuk font-size, padding, margin global, dan lebar komponen. Menghormati pengaturan ukuran huruf peramban pengguna dan nilainya selalu konsisten di seluruh dokumen! |
em | Ukuran font-size dari elemen itu sendiri (atau elemen induknya jika digunakan pada properti font-size). | Sangat cocok untuk padding atau margin lokal yang harus proporsional dengan ukuran huruf elemen tersebut (misalnya padding: 0.5em 1em pada tombol atau lencana/badge). |
ch (Character unit) | Lebar glif angka "0" pada fon yang sedang digunakan. | Pilihan terbaik untuk membatasi lebar baris paragraf bacaan (max-inline-size: 65ch). Baris teks yang panjangnya antara 50ch hingga 75ch terbukti paling nyaman dibaca mata manusia. |
px (CSS Pixel) | Satuan panjang absolut visual. | Gunakan untuk ketebalan garis batas (border: 1px solid), sudut membulat kecil (border-radius: 6px), dan bayangan (box-shadow) yang memang tidak perlu membesar saat ukuran teks diperbesar. |
% (Persentase) | Ukuran properti yang bersangkutan pada elemen induk. | Mengatur lebar relatif terhadap wadah induk (misalnya max-width: 100% pada gambar). |
em untuk font-sizeJika Anda menulis ul { font-size: 0.85em; }, maka daftar <ul> tingkat pertama berukuran 85%. Namun jika di dalamnya terdapat sub-daftar <ul> bersarang, ukurannya menjadi 0.85 × 0.85 = 72%, dan tingkat ketiganya menyusut menjadi 61%! Gunakan rem untuk font-size agar ukurannya selalu mengacu ke akar <html>.
html { font-size: 10px }!Hanya demi mempermudah hitungan matematika di kepala (1.6rem = 16px), sebagian tutorial lama menyarankan html { font-size: 10px } atau 62.5%. Hindari pola 10px karena nilai piksel tetap pada <html> menimpa preferensi ukuran huruf pengguna di peramban dan memaksa ukuran dasar menjadi terlalu kecil bagi halaman atau komponen yang belum terdefinisi, dan biasakan menghitung dengan kelipatan 1rem = 16px (0.75rem = 12px, 0.875rem = 14px, 1rem = 16px, 1.25rem = 20px, 1.5rem = 24px, 2rem = 32px) atau gunakan fungsi calc(14 / 16 * 1rem).
2. Satuan Viewport: Mengapa 100dvh Menggantikan 100vh di Perangkat Seluler?
Satuan viewport mengukur persentase dari jendela layar peramban yang sedang terbuka (100vw = 100% lebar layar, 100vh = 100% tinggi layar).
Namun, pada peramban ponsel (Safari iOS dan Chrome Android), bilah alamat (address bar) di bagian atas/bawah layar dapat menyusut dan membesar secara dinamis saat pengguna menggulir halaman.
- Satuan lama
100vhselalu dihitung seolah-olah bilah alamat peramban sedang tersembunyi (ukuran paling besar). Akibatnya, saat halaman pertama kali dibuka (ketika bilah alamat masih muncul), bagian bawah elemenheight: 100vh(seperti tombol aksi di bawah layar) terpotong dan tertutup oleh bilah alamat peramban!
CSS modern (status Baseline Widely Available sejak Desember 2022) menyelesaikan masalah ini dengan tiga satuan viewport baru:
- **
svh(Small Viewport Height):** Tinggi layar saat bilah alamat peramban sedang terbuka penuh (ukuran teraman agar konten dijamin tidak pernah tertutup bilah peramban). - **
lvh(Large Viewport Height):** Tinggi layar saat bilah alamat peramban menyusut/tersembunyi. - **
dvh(Dynamic Viewport Height):** Menyesuaikan tinggi secara dinamis mengikuti muncul atau sembunyinya bilah alamat peramban!
/* Menjamin tinggi minimal halaman penuh tanpa terpotong bilah alamat di ponsel */
body {
min-block-size: 100vh; /* Fallback untuk peramban lama */
min-block-size: 100dvh; /* Standar modern */
}
3. Fungsi Matematika CSS: calc(), min(), max(), dan clamp()
CSS memungkinkan Anda melakukan perhitungan dinamis yang mencampurkan satuan berbeda secara langsung di peramban:
A. calc(): Menggabungkan Satuan yang Berbeda
Perhatikan bahwa operator + dan - di dalam calc() wajib diapit oleh spasi (misalnya calc(100% - 2rem), bukan calc(100%-2rem)):
.panel-utama {
/* Lebar 100% dikurangi lebar bilah samping tetap 260px */
inline-size: calc(100% - 260px);
}
B. min() dan max(): Pembatas Dinamis Satu Baris
min(A, B)memilih nilai mana pun yang paling kecil saat itu.max(A, B)memilih nilai mana pun yang paling besar saat itu.
/* Menggantikan gabungan width: 92% dan max-width: 1120px cukup dengan satu baris! */
.kontainer {
inline-size: min(92%, 1120px);
margin-inline: auto;
}
C. clamp(MIN, IDEAL, MAX): Tipografi dan Spasi Cair (Fluid Typography)
Fungsi clamp() mengunci sebuah nilai di antara batas bawah (MIN), nilai ideal yang elastis (IDEAL), dan batas atas (MAX) tanpa memerlukan satupun @media query!
h1 {
/* - Minimal 1.75rem (28px) di layar ponsel kecil
- Tumbuh secara mulus mengikuti 1.2rem + 2.5vw
- Maksimal berhenti di 3rem (48px) pada monitor besar */
font-size: clamp(1.75rem, 1.2rem + 2.5vw, 3rem);
line-height: 1.15;
}
clamp()Pada argumen tengah (ideal value) di clamp(), selalu gabungkan rem dengan vw (seperti 1.2rem + 2.5vw), jangan menulis 4vw sendirian! Jika Anda hanya menulis font-size: clamp(1.75rem, 4vw, 3rem), maka saat pengguna memperbesar ukuran huruf peramban (browser zoom), nilai 4vw tidak ikut membesar karena lebar layar tidak berubah. Menggabungkan 1.2rem + 2.5vw memastikan teks tetap merespons fitur zoom pengguna.
Latihan Praktik: Merancang Halaman Artikel dengan Tipografi Cair
Buatlah berkas satuan-fluid.html dan fluid.css yang menerapkan:
- Wadah artikel dengan lebar
inline-size: min(100% - 2rem, 65ch)danmargin-inline: auto. - Ukuran
<h1>menggunakanclamp(1.8rem, 1.3rem + 2vw, 2.75rem)dan jarakpadding-blockseksi menggunakanclamp(2rem, 1rem + 4vw, 5rem). - Sebuah lencana status (
.lencana) yang menggunakanpadding: 0.25em 0.75emdanborder-radius: 999pxsehingga bantalannya otomatis menyesuaikan ukuran huruf lencana tersebut.