В CSS размеры можно задавать с помощью разных единиц измерения: rem, em, px, % и другие. Разберём ключевые различия между rem, em и прочими.
EM — размер относительно размера шрифта родителя
|
1 2 3 4 5 6 7 |
.parent { font-size: 16px; } .child { font-size: 2em; /* = 32px */ } |
2em внутри .child означает: в 2 раза больше font-size родителя. Внутри вложенных элементов em будет мультиплицироваться (компаундиться).
|
1 2 3 4 5 6 7 8 9 |
html { font-size: 16px; } body { font-size: 1.2em; /* = 19.2px */ } p { font-size: 1.1em; /* 1.1 * 19.2 = ~21px */ } |
REM — размер относительно font-size корневого html
|
1 2 3 4 5 6 7 |
html { font-size: 16px; } h1 { font-size: 2rem; /* = 32px */ } |
rem = root em. Не зависит от вложенности, только от html { font-size }.
Возникает закономерный вопрос — а можно ли использовать rem для самого контейнера html? Ответ — да.
И вот в чём нюанс: Когда вы задаёте rem для html {}, он обращаешься к самому себе. Поэтому rem в html {} будет зависеть от значения по умолчанию, заданного браузером (обычно 16px), если явно не переопределено раньше.
|
1 2 3 |
html { font-size: 1.25rem; /* 1.25 * 16px = 20px */ } |
Другие единицы:
px— абсолютный пиксель (жёстко фиксирован, не масштабируется).%— зависит от контекста (например, ширины родителя).vw,vh— проценты от ширины/высоты окна браузера.ch,ex— зависят от шрифта (ширина символа0, высотаx).
Когда использовать
| Хочешь… | Используй |
|---|---|
| Масштабируемый дизайн на всей странице | rem |
| Локальные размеры относительно font-size блока | em |
| Точный контроль, не зависящий от масштаба | px (осторожно) |
| Относительно размеров окна | vw / vh |
