Membuat Elemen Web yang Lebih Fleksibel dan Proporsional dengan `em`
Buat kamu-kamu para desainer dan frontend developer, mengatur ukuran elemen web adalah makanan sehari-hari. Selama ini kita mungkin terbiasa menggunakan pixel (px
) untuk menentukan ukuran font, padding, maupun margin. Namun, tau gak kalau ada unit lain yang lebih fleksibel untuk mengatur hal-hal yang berkaitan dengan ukuran font, yaitu em
?
px adalah suatu unit pengukuran yang absolut. Karena sifatnya yang absolut, ia biasa digunakan untuk styling dengan ukuran yang tetap. Ukurannya tidak bergantung pada sesuatu yang lain seperti lebar browser window atau ukuran font.
Di sisi lain, em adalah suatu unit pengukuran yang relatif. Besarnya relatif terhadap ukuran font yang di-set pada elemen tersebut.
Besar 1em
pada elemen p
di atas adalah 16px
karena induknya (elemen body
) memiliki ukuran font 16px
. Sedangkan besar 1em
pada elemen span
adalah 20px
sehingga padding-top
-nya sebesar 40px
(2 * 20px).
Penggunaan em
Dekorasi font
Karena em
bergantung pada ukuran font, satuan ini sangat cocok digunakan untuk segala hal yang berkaitan dengan ukuran font itu sendiri seperti text-underline-offset
dan letter-spacing
, yang mana bila ukuran font semakin besar, nilainya juga akan membesar, dan bila ukuran font semakin kecil, nilainya juga akan mengecil.
Untuk lebih jelasnya, kami sediakan interactive demo di bawah untuk memperlihatkan bagaimana em
menjaga proporsionalitas text-underline-offset
sesuai dengan ukuran fontnya. Sedangkan px
sama sekali tidak memedulikan itu, mau font besar atau kecil, nilai offset akan tetap sama.
Menurut penulis, gap 6px
antara underline dengan text-nya terlihat terlalu renggang di ukuran font terkecil dan sedikit terlalu rapat di ukuran font terbesar. Sedangkan dengan em
, gap 0.3em
terlihat konsisten baik di ukuran font terkecil maupun terbesar. Proporsional.
Kami juga sediakan interactive demo untuk letter-spacing
:
Sama seperti contoh sebelumnya, penggunaan unit em
pada letter-spacing
menjaga konsistensi dan proporsionalitas di ukuran font kecil maupun besar.
Vertical margin
Untuk text yang dibaca secara horizontal (seperti huruf latin ini), ada hal yang namanya vertical margin yang biasanya berguna untuk meningkatkan readability text, misal untuk membedakan satu paragraf dengan paragraf lainnya. em
sangat cocok digunakan untuk hal ini karena besarnya vertical margin musti proporsional dengan ukuran fontnya.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.
Terlihat bagaimana margin-bottom: 40px
membuat jarak antar paragraf terlalu renggang di ukuran font 8px
. Namun tidak dengan margin-bottom: 2em
yang tetap menjaga skalanya.
Spacing
Tak terbatas pada font, ternyata penggunaan em
juga ideal diterapkan untuk lebih mudah menentukan besar spacing (padding dan/atau margin) pada suatu component. Misal kita ingin membuat component callout dengan 3 ukuran berbeda: sm
, md
, dan lg
. Tinggal set font-size
, semua beres.
font-size: 12px
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.font-size: 16px
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.font-size: 20px
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.Lihat bagaimana kita hanya perlu menentukan font-size
saja dan semua sudah beres dengan sendirinya, tak perlu pusing-pusing memikirkan nilai padding
untuk masing-masing ukuran callout. Hemat waktu, hemat kode, proporsional terjaga.
Plus-minus em
+ Mengurangi jumlah penyesuaian properti CSS
Misal px
dipilih untuk menuliskan component callout di atas yang memiliki 3 ukuran berbeda (sm
, md
, lg
). Bila pada setiap ukuran callout ada 4 properti CSS yang harus kita tentukan (font-size
, padding
, border-left
, dan border-radius
), dan kita punya 3 buah breakpoint (mobile
, tablet
, laptop
), artinya kita perlu menentukan setidaknya 3 x 4 x 3 = 36 properti CSS di component callout!
Ini baru satu component lho ya!
+ Responsive design
Melihat bagaimana em
relatif terhadap ukuran font, lebih mudah rasanya untuk mengembangkan elemen yang responsif. Cukup dengan mengubah font-size
di media query dan semuanya bakal ngikut.
- Cascading
Hanya saja ada hal yang perlu diingat ketika menggunakan em
: kita harus lebih berhati-hati terhadap sifat cascading-nya. Jika ukuran font di elemen induk berubah, semua elemen turunan yang menggunakan em
juga akan berubah. Ini bisa menjadi tantangan tersendiri bila tidak dikelola dengan baik.
Contoh yang paling sering ditemui adalah mengubah font-size
pada elemen yang berpotensi menjadi rekursif, seperti nested li
. Bisa dilihat bagaimana semakin dalam li
semakin kecil pula ukuran fontnya.
- #1
- #2
- #3
- Nested ##1
- Nested ##2
- Nested ##3
- Nested ###1
- Nested ###2
- Nested ###3
Bisa dibenerin pake li li { font-size: 1em; }
tapi ya tetap diingat aja sifat cascading ini.
Lalu px untuk apa?
Meskipun em
memiliki banyak keuntungan, ada beberapa situasi di mana px
tetap lebih sesuai untuk digunakan, terutama untuk elemen yang biasanya membutuhkan ukuran tetap, semisal border-width
atau propoerti width
dan height
suatu image. Agak aneh kan kalau border jadi semakin tebal pas fontnya semakin besar juga. Yah walaupun ujung-ujungnya tergantung sama kebutuhan sih.
Penutup
Secara umum, gunakan em
jika kamu ingin memiliki styling yang besar kecilnya proporsional dengan ukuran font di elemen tersebut. Gunakan px
untuk yang lainnnya, terutama untuk hal-hal yang butuh ukuran presisi.
Yang terpenting, jangan terpaku pada peraturan! Kalau memang masuk akal pake px
di suatu tempat, go for it. Berlaku juga sebaliknya.
Kalo rem
gimana mas? Mungkin lain kali kita bisa ngobrol soal rem
🙂