Переменные единицы
Оригинальное название: variable units
Коротко
Единицы длины CSS, у которых нет постоянного размера: их значение пересчитывается от шрифта, окна браузера или контейнера, в котором стоит элемент.
Что такое «Переменные единицы»
Пиксель в CSS всегда равен одному и тому же условному отрезку. Все остальные единицы, кроме нескольких физических вроде cm и pt, — переменные: сами по себе они ничего не значат, пока браузер не узнает базу для расчёта. 2em внутри мелкой подписи и внутри крупного заголовка — разные длины. На этом и строится гибкая вёрстка: размеры задают отношением к чему-то, а не числом пикселей. Общая классификация всех единиц дана в статье «Единица измерения», а здесь — подробнее о группах переменных единиц.
Группы по базе расчёта
- От шрифта элемента:
em— размер шрифта,ex— высота строчной буквы,ch— ширина цифры «0»,lh— высота строки. - От шрифта корневого элемента:
remиrlh. Не накапливаются при вложенности, поэтому удобны для отступов и размеров текста. - От области просмотра:
vw,vh,vmin,vmaxи мобильные вариантыsvh,lvh,dvh. - От контейнера:
cqw,cqh,cqi,cqb— работают внутри элемента, объявленного контейнером черезcontainer-type. - Проценты — отдельный случай: база зависит от свойства. Для
widthэто ширина родителя, дляfont-size— шрифт родителя.
Пример сочетания
.article { max-width: 65ch; } /* удобная длина строки */
.article p { margin-block: 0 1lh; } /* отступ = одна строка */
.card { container-type: inline-size; }
.card h3 { font-size: clamp(1rem, 4cqi, 1.5rem); }
h1 { font-size: clamp(1.75rem, 1rem + 2.5vw, 3rem); }
Ширина колонки текста ограничена числом символов, заголовок карточки зависит от ширины самой карточки, а главный заголовок — от окна, но в пределах минимума и максимума.
На чём спотыкаются
- Накопление em. Вложенный список со шрифтом
0.9emна третьем уровне получает 0,73 от исходного размера. Для шрифтов надёжнее rem, аemоставляют для отступов, которые должны расти вместе с текстом кнопки. - Размер шрифта только в vw. Такой текст не увеличивается при масштабировании страницы, а это требование доступности. В
clamp()кvwдобавляютrem, как в примере. - Единицы контейнера без контейнера. Если у предка нет
container-type,cqiсчитается от окна — результат похож на правильный, и ошибку легко не заметить.

