Я хотів би похвалити відповідь josh3736 за надання чудового історичного контексту. Хоча це добре сформульовано, ландшафт CSS змінився за майже п’ять років відтоді, як це питання було задано. Коли це питання було задано,px
ні правильну відповідь, але це вже не вірно сьогодні.
tl; dr: використанняrem
Огляд блоку
Історично px
одиниці зазвичай представляли один піксель пристрою. Якщо пристрої мають більшу та більшу щільність пікселів, це не застосовується для багатьох пристроїв, наприклад, для Retina Display від Apple.
rem
одиниці представляють розмір r oot em . Це з font-size
усіх матчів :root
. У випадку HTML це <html>
елемент; для SVG, це те<svg>
елемент. За замовчуванням font-size
у кожному браузері * є 16px
.
На момент написання, rem
це підтримується приблизно 98% користувачів . Якщо ви стурбовані , що інший 2%, я нагадаю вам , що запити медіа також підтримується приблизно 98% користувачів .
Про використання px
Більшість прикладів CSS в Інтернеті використовують px
значення, оскільки вони були де-факто стандартом. pt
,in
і в теорії можна було б використовувати різноманітні інші одиниці , але вони не справлялися з малими значеннями, тому що вам швидко доведеться вдаватися до дробів, які довше вводити, і важче міркувати.
Якщо ви хотіли тонкої межі, px
ви могли б використовувати 1px
, зpt
вам потрібно було б використовувати 0.75pt
для послідовних результатів, і це просто не дуже зручно.
Про використання rem
rem
Значення за замовчуванням 16px
не є дуже сильним аргументом для його використання. Лист 0.0625rem
це гірше , ніж листи0.75pt
, так чому б хто - небудь використовувати rem
?
Є дві частини до rem
Перевага перед іншими одиницями.
- Вподобання користувачів дотримуються
- Ви можете змінити уявне
px
значення rem
на все, що завгодно
Поважаючи налаштування користувачів
Збільшення браузера сильно змінилося за ці роки. Історично багато браузерів тільки збільшувались font-size
, але це змінювалося досить швидко, коли веб-сайти зрозуміли, що їх прекрасні піксельні дизайни порушуються кожного разу, коли хтось збільшує чи зменшує масштаб. У цей момент браузери масштабують всю сторінку, тому масштабування на основі шрифту не виходить із зображення.
Повага до побажань користувача не виходить із картини. Тільки тому, що для браузера встановлено 16px
за замовчуванням, не означає, що будь-який користувач не може змінити свої налаштування на 24px
або32px
виправити для слабкого зору або поганої видимості (колишні відблиски екрана). Якщо ви базуєте свої одиниці rem
, будь-який користувач із більшим розміром шрифту побачить пропорційно більший сайт. Бордюри будуть більшими, прокладки будуть більшими, запаси будуть більшими, все буде масштабуватися плавно.
Якщо ви базуєте свої медіа-запити rem
, ви також можете переконатися, що сайт, який бачать ваші користувачі, відповідає їх екрану. Користувач з font-size
набором для 32px
на 640px
широкий браузер, буде ефективно бачити ваш сайт , як показано користувачеві в 16px
на 320px
широкому браузері. В RWD при використанні абсолютно немає втратrem
.
Зміна видимого px
значення
Оскільки rem
заснований на font-size
на :root
вузлі, якщо ви хочете , щоб змінити те , що 1rem
являє собою, все , що вам потрібно зробити , це змінити font-size
:
:root {
font-size: 100px;
}
body {
font-size: 1rem;
}
<p>Don't ever actually do this, please</p>
Що б ви не робили, не встановлюйте значення :root
елемента font-size
для px
значення.
Якщо ви font-size
увімкнено html
аpx
значенням, ви здувають власних уподобань без шляху , щоб отримати їх назад.
Якщо ви хочете змінити видиме значення rem
, використовуйте %
одиниці.
Математика для цього досить пряма.
Очевидний розмір шрифту :root
є 16px
, але дозволяє сказати, що ми хочемо його змінити 20px
. Все, що нам потрібно зробити, - це помножити 16
на деяку цінність 20
.
Створіть своє рівняння:
16 * X = 20
І вирішити для 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>
Робити все в кратних кількостях 20
не все так добре, але загальна пропозиція - зробити очевидний розмір rem
рівним 10px
. Магічне число для того, 10/16
яке є 0.625
, або 62.5%
.
:root {
font-size: 62.5%;
}
<p>If you're using the default font-size, I'm 10px tall.</p>
Зараз проблема полягає в тому , що використовується по замовчуванням font-size
для іншої частини сторінки набору занадто малі, але є просте виправлення для цього: Встановити font-size
на body
використанні rem
:
:root {
font-size: 62.5%;
}
body {
font-size: 1.6rem;
}
<p>I'm the default font-size</p>
Важливо зауважити, що при такому коригуванні, видиме значення rem
є тим, 10px
що означає, що будь-яке значення, яке ви могли записати, px
може бути перетворене безпосередньо rem
, натискаючи на десяткове місце.
padding: 20px;
перетворюється на
padding: 2rem;
Вибір розміру шрифту залежить від вас, тому, якщо ви хочете, щоб не було причини, ви не можете його використовувати:
:root {
font-size: 6.25%;
}
body {
font-size: 16rem;
}
і мають 1rem
рівні 1px
.
Тож у вас є це просте рішення для поваг до побажань користувачів, а також уникнення надмірного ускладнення вашої CSS.
Зачекайте, так у чому улов?
Я боявся, що ви можете це запитати. Як би я хотів зробити вигляд, що rem
це магія і вирішує все, все ще є певні питання. На мій погляд , нічого не порушує , але я зателефоную їм, щоб ви не могли сказати, що я вас не попередив.
Медіа-запити (використання em
)
Одне з перших питань, з яким ви зіткнетеся, rem
стосується медіа-запитів. Розглянемо наступний код:
:root {
font-size: 1000px;
}
@media (min-width: 1rem) {
:root {
font-size: 1px;
}
}
Тут значення rem
змін залежить від того, застосовується медіа-запит, а медіа-запит залежить від значення rem
, і що на землі відбувається?
rem
у медіа-запитах використовується початкове значення font-size
і не повинно (див. розділ Safari) враховувати будь-які зміни, які можуть статися font-size
з :root
елементом. Іншими словами, очевидною цінністю є завжди 16px
.
Це трохи дратує, бо це означає, що вам доведеться зробити деякі дробові обчислення, але я виявив, що в більшості поширених медіа-запитів вже використовуються значення, кратні 16.
| px | rem |
+------+-----+
| 320 | 20 |
| 480 | 30 |
| 768 | 48 |
| 1024 | 64 |
| 1200 | 75 |
| 1600 | 100 |
Крім того, якщо ви використовуєте препроцесор CSS, ви можете використовувати міксинги або змінні для управління вашими медіа-запитами, що повністю замаскує проблему.
Сафарі
На жаль, є відома помилка у Safari, де зміни :root
розміру шрифту насправді змінюють обчислені rem
значення для діапазонів запитів медіа. Це може викликати дуже дивну поведінку, якщо розмір шрифту :root
елемента змінюється в медіа-запиті. На щастя, виправлення просте: використовуйте em
блоки для медіа-запитів .
Контекстна комутація
Якщо ви переключаєтесь між проектами на різні проекти, цілком можливо, що видимий розмір шрифту rem
матиме різні значення. В одному проекті ви можете використовувати видимий розмір, 10px
де в іншому проекті може бути видимий розмір 1px
. Це може заплутати і викликати проблеми.
Моя єдина рекомендація тут - дотримуватися, 62.5%
щоб перетворити rem
на очевидний розмір 10px
, тому що це було більш поширеним у моєму досвіді.
Спільні бібліотеки CSS
Якщо ви пишете CSS, який буде використовуватися на веб-сайті, який ви не контролюєте, наприклад, для вбудованого віджета, насправді немає хорошого способу дізнатися, який розмір очевидного розміру rem
буде мати. Якщо це так, сміливо продовжуйте користуватися px
.
Якщо ви все ще хочете використовувати rem
, подумайте про випуск версії таблиць стилів Sass або LESS зі змінною для зміни масштабування на видимий розмір rem
.
* Я не хочу когось відлякувати від використання rem
, але мені не вдалося офіційно підтвердити, що кожен браузер використовує 16px
за замовчуванням. Розумієте, браузерів дуже багато, і одному браузеру було б не так вже й важко розходитися, скажімо, 15px
або 18px
. Проте під час тестування я не бачив жодного прикладу, коли веб-переглядач, що використовував параметри за замовчуванням у системі, що використовує налаштування за замовчуванням, мав будь-яке значення, окрім 16px
. Якщо ви знайдете такий приклад, будь ласка, поділіться ним зі мною.