Saya ingin memuji jawaban josh3736 untuk memberikan beberapa konteks sejarah yang sangat baik. Meskipun diartikulasikan dengan baik, lanskap CSS telah berubah dalam hampir lima tahun sejak pertanyaan ini diajukan. Ketika pertanyaan ini diajukan, px
adalah jawaban yang benar, tetapi itu tidak berlaku lagi hari ini.
tl; dr: gunakanrem
Tinjauan Unit
px
Unit historis biasanya mewakili satu piksel perangkat. Dengan perangkat yang memiliki kerapatan piksel lebih tinggi dan lebih tinggi, ini tidak lagi berlaku untuk banyak perangkat, seperti dengan Tampilan Retina Apple.
rem
unit mewakili r oot em ukuran. Ini adalah font-size
pertandingan apa pun :root
. Dalam kasus HTML, itu adalah <html>
elemen; untuk SVG, itu adalah <svg>
elemen. Default font-size
di setiap browser * adalah 16px
.
Pada saat penulisan, rem
didukung oleh sekitar 98% pengguna . Jika Anda khawatir tentang 2% lainnya, saya akan mengingatkan Anda bahwa permintaan media juga didukung oleh sekitar 98% pengguna .
Saat Menggunakan px
Mayoritas contoh CSS di internet menggunakan px
nilai karena mereka adalah standar de-facto. pt
, in
dan berbagai unit lainnya dapat digunakan secara teori, tetapi mereka tidak menangani nilai-nilai kecil dengan baik karena Anda harus cepat menggunakan fraksi, yang lebih lama untuk mengetik, dan lebih sulit untuk dipikirkan.
Jika Anda ingin batas tipis, dengan px
yang bisa Anda gunakan 1px
, dengan yang pt
Anda perlukan 0.75pt
untuk hasil yang konsisten, dan itu tidak nyaman.
Saat Menggunakan rem
rem
Nilai default 16px
bukan argumen yang sangat kuat untuk penggunaannya. Menulis 0.0625rem
adalah lebih buruk daripada menulis 0.75pt
, jadi mengapa orang menggunakan rem
?
Ada dua bagian yang rem
lebih diuntungkan daripada unit lainnya.
- Preferensi pengguna dihormati
- Anda dapat mengubah nilai nyata
px
dari rem
apa pun yang Anda inginkan
Menghargai Preferensi Pengguna
Zoom browser telah banyak berubah selama bertahun-tahun. Secara historis banyak browser hanya akan meningkat font-size
, tetapi itu berubah cukup cepat ketika situs web menyadari bahwa desain pixel-perfect mereka yang indah pecah setiap kali seseorang memperbesar atau memperkecil. Pada titik ini, peramban skala seluruh halaman, sehingga zoom berbasis font keluar dari gambar.
Menghargai keinginan pengguna tidak lepas dari gambarannya. Hanya karena browser diatur 16px
secara default, tidak berarti pengguna mana pun tidak dapat mengubah preferensi mereka 24px
atau 32px
untuk mengoreksi low vision atau visibilitas yang buruk (ex screen glare). Jika Anda mendasarkan unit Anda rem
, setiap pengguna dengan ukuran font yang lebih tinggi akan melihat situs yang lebih besar secara proporsional. Batas akan lebih besar, bantalan akan lebih besar, margin akan lebih besar, semuanya akan naik dengan lancar.
Jika Anda mendasarkan permintaan media rem
Anda, Anda juga dapat memastikan bahwa situs yang dilihat pengguna sesuai dengan layar mereka. Seorang pengguna dengan font-size
set untuk 32px
pada 640px
browser yang luas, efektif akan melihat situs Anda seperti yang ditunjukkan untuk pengguna di 16px
pada 320px
browser yang lebar. Sama sekali tidak ada kerugian bagi RWD dalam menggunakan rem
.
Mengubah px
Nilai Yang Jelas
Karena rem
didasarkan pada font-size
satu :root
simpul, jika Anda ingin mengubah apa yang 1rem
mewakili, yang harus Anda lakukan adalah mengubah font-size
:
:root {
font-size: 100px;
}
body {
font-size: 1rem;
}
<p>Don't ever actually do this, please</p>
Apa pun yang Anda lakukan, jangan setel :root
elemen font-size
ke px
nilai.
Jika Anda mengatur font-size
di html
sebuah px
nilai, Anda terpesona preferensi pengguna tanpa cara untuk mendapatkan mereka kembali.
Jika Anda ingin mengubah jelas nilai rem
, penggunaan %
unit.
Matematika untuk ini cukup mudah.
Ukuran font yang jelas :root
adalah 16px
, tetapi katakanlah kita ingin mengubahnya 20px
. Yang perlu kita lakukan adalah mengalikan 16
nilai yang didapat 20
.
Siapkan persamaan Anda:
16 * X = 20
Dan selesaikan untuk X
:
X = 20 / 16
X = 1.25
X = 125%
:root {
font-size: 125%;
}
<p>If you're using the default font-size, I'm 20px tall.</p>
Melakukan segala sesuatu dalam kelipatan 20
tidak terlalu bagus, tetapi saran yang umum adalah membuat ukuran yang tampak rem
sama dengan 10px
. Angka ajaib untuk itu adalah 10/16
yang mana 0.625
, atau 62.5%
.
:root {
font-size: 62.5%;
}
<p>If you're using the default font-size, I'm 10px tall.</p>
Masalahnya sekarang adalah bahwa default Anda font-size
untuk sisa halaman diatur terlalu kecil, tetapi ada perbaikan sederhana untuk itu: Setel font-size
pada body
menggunakan rem
:
:root {
font-size: 62.5%;
}
body {
font-size: 1.6rem;
}
<p>I'm the default font-size</p>
Penting untuk dicatat, dengan penyesuaian ini di tempat, nilai nyata rem
adalah 10px
yang berarti nilai apa pun yang Anda tulis px
dapat dikonversi langsung ke rem
dengan menabrak tempat desimal.
padding: 20px;
berubah menjadi
padding: 2rem;
Ukuran font yang Anda pilih terserah Anda, jadi jika Anda mau, tidak ada alasan Anda tidak dapat menggunakan:
:root {
font-size: 6.25%;
}
body {
font-size: 16rem;
}
dan memiliki yang 1rem
sama 1px
.
Jadi begitulah, solusi sederhana untuk menghormati keinginan pengguna sambil juga menghindari terlalu rumitnya CSS Anda.
Tunggu, jadi apa masalahnya?
Saya takut Anda mungkin bertanya itu. rem
Meskipun saya ingin berpura-pura bahwa itu adalah sihir dan memecahkan segalanya, masih ada beberapa masalah yang perlu diperhatikan. Tidak ada yang melanggar kesepakatan menurut saya , tapi saya akan memanggil mereka sehingga Anda tidak bisa mengatakan saya tidak memperingatkan Anda.
Kueri Media (gunakan em
)
Salah satu masalah pertama yang akan Anda hadapi rem
adalah pertanyaan media. Pertimbangkan kode berikut:
:root {
font-size: 1000px;
}
@media (min-width: 1rem) {
:root {
font-size: 1px;
}
}
Di sini nilai rem
perubahan tergantung pada apakah permintaan media berlaku, dan permintaan media tergantung pada nilai rem
, jadi apa yang sedang terjadi?
rem
dalam pertanyaan media menggunakan nilai awal font-size
dan seharusnya tidak (lihat bagian Safari) memperhitungkan perubahan apa pun yang mungkin terjadi font-size
pada :root
elemen. Dengan kata lain, nilainya selalu terlihat 16px
.
Ini agak menjengkelkan, karena itu berarti Anda harus melakukan beberapa perhitungan fraksional, tetapi saya telah menemukan bahwa sebagian besar pertanyaan media sudah menggunakan nilai yang merupakan kelipatan 16.
| px | rem |
+------+-----+
| 320 | 20 |
| 480 | 30 |
| 768 | 48 |
| 1024 | 64 |
| 1200 | 75 |
| 1600 | 100 |
Selain itu jika Anda menggunakan preprosesor CSS, Anda dapat menggunakan mixin atau variabel untuk mengelola kueri media Anda, yang akan menutupi masalah sepenuhnya.
Safari
Sayangnya ada bug yang diketahui dengan Safari di mana perubahan :root
ukuran font benar-benar mengubah nilai yang dihitung rem
untuk rentang kueri media. Ini dapat menyebabkan beberapa perilaku yang sangat aneh jika ukuran font :root
elemen diubah dalam kueri media. Untungnya perbaikannya sederhana: gunakan em
unit untuk pertanyaan media .
Pengalihan Konteks
Jika Anda beralih di antara berbagai proyek berbagai proyek, sangat mungkin ukuran font yang terlihat rem
akan memiliki nilai yang berbeda. Dalam satu proyek, Anda mungkin menggunakan ukuran yang jelas 10px
di mana dalam proyek lain ukurannya mungkin 1px
. Ini bisa membingungkan dan menyebabkan masalah.
Satu-satunya rekomendasi saya di sini adalah untuk tetap dengan 62.5%
mengkonversi rem
ke ukuran yang jelas 10px
, karena itu lebih umum dalam pengalaman saya.
Pustaka CSS bersama
Jika Anda menulis CSS yang akan digunakan di situs yang tidak Anda kontrol, seperti untuk widget yang disematkan, benar-benar tidak ada cara yang baik untuk mengetahui ukuran apa yang tampak rem
. Jika itu masalahnya, jangan ragu untuk tetap menggunakan px
.
Jika Anda masih ingin menggunakan rem
, pertimbangkan untuk merilis versi Sass atau KURANG dari stylesheet dengan variabel untuk mengesampingkan penskalaan untuk ukuran yang jelas rem
.
* Saya tidak ingin membuat orang lain takut menggunakan rem
, tetapi saya belum dapat secara resmi mengkonfirmasi bahwa setiap browser menggunakan 16px
secara default. Anda tahu, ada banyak browser dan tidak akan terlalu sulit bagi satu browser untuk menyimpang sedikit, katakanlah 15px
atau 18px
. Dalam pengujian, namun saya belum melihat satu contoh di mana browser menggunakan pengaturan default dalam sistem menggunakan pengaturan standar memiliki nilai selain 16px
. Jika Anda menemukan contoh seperti itu, silakan bagikan dengan saya.