Справочник · CSS
font-size: размер текста
Свойство font-size задаёт размер шрифта. Значение указывают в пикселях (16px), в rem — относительно размера шрифта страницы, в em — относительно шрифта родителя, или плавно через clamp(). По умолчанию браузеры используют 16px, и человек может изменить это значение в настройках.
- По умолчанию в браузерах 16px — это
1rem. rem— от корня страницы, предсказуемо;em— от родителя, умножается при вложенности.clamp(1.75rem, 1.2rem + 2.5vw, 3rem)— плавный заголовок с границами.- Размер только в
vwломает масштабирование — смешивай с rem. - Основной текст — от 16px, в полях форм тоже.
Минимальный пример
html { font-size: 100%; } /* уважаем настройку браузера, обычно 16px */
body { font-size: 1rem; line-height: 1.6; }
h1 { font-size: clamp(2rem, 1.4rem + 3vw, 3.5rem); }
h2 { font-size: 1.75rem; }
small { font-size: .875rem; }Основной текст — 1rem, заголовки — кратные rem, главный заголовок плавно растёт с шириной экрана от 32 до 56 пикселей. Если человек поставил в браузере крупный шрифт, вся шкала увеличится пропорционально.
Единицы размера шрифта
| Единица | Относительно чего | Когда брать |
|---|---|---|
px | абсолютный размер | редко: не учитывает настройку шрифта браузера |
rem | размера шрифта корня (html) | основная шкала сайта |
em | размера шрифта родителя | элементы, которые растут с текстом вокруг |
% | шрифта родителя, как em | на корне: html { font-size: 100% } |
vw | ширины окна | только внутри clamp или calc вместе с rem |
small, large… | ключевые слова браузера | почти не используют |
rem или em
.menu { font-size: 0.9em; }
.menu .menu { font-size: 0.9em; } /* вложенное меню станет 0.81 от родителя */
.button { font-size: 1rem; padding: .6em 1.2em; } /* отступы растут с размером текста кнопки */em считается от шрифта родителя, поэтому при вложенности размеры перемножаются: список в списке с 0.9em становится всё мельче. rem всегда считается от корня, и 1.25rem одинаков в любом месте страницы. Практичное сочетание: шрифты в rem, внутренние отступы кнопок — в em, чтобы они росли вместе с её текстом.
Плавный размер через clamp()
h1 { font-size: clamp(2rem, 1.4rem + 3vw, 3.5rem); }
.lead { font-size: clamp(1.05rem, 1rem + .4vw, 1.25rem); }clamp(минимум, желаемое, максимум): на узком экране шрифт не меньше минимума, на широком — не больше максимума, а между ними плавно растёт. Желаемое значение пишут как сумму rem и vw: часть в rem сохраняет реакцию на масштабирование и настройку шрифта браузера.
Почему нельзя задавать размер только в vw
h1 { font-size: 5vw; } /* плохо: не увеличивается при масштабе */
h1 { font-size: clamp(2rem, 1.4rem + 3vw, 3.5rem); } /* хорошо */Размер в одних vw зависит только от ширины окна. При увеличении страницы через Ctrl + «+» ширина окна в CSS-пикселях уменьшается, и текст в vw почти не растёт — а на телефоне он вовсе микроскопический. Это нарушает требование доступности о масштабировании текста до 200%. Всегда добавляй к vw слагаемое в rem и ограничивай clamp.
Шкала размеров
:root {
--text-s: .875rem; /* 14px — подписи */
--text-m: 1rem; /* 16px — основной текст */
--text-l: 1.25rem; /* 20px — лид */
--h3: 1.5rem; /* 24px */
--h2: 1.875rem; /* 30px */
--h1: clamp(2rem, 1.4rem + 3vw, 3.5rem);
}Несколько размеров в переменных лучше десятка случайных чисел: заголовки разных уровней явно различаются, а интерфейс выглядит цельным. Уровень заголовка в HTML выбирают по структуре, а размер — в CSS: h3 может выглядеть мельче или крупнее, но остаётся h3.
Читаемость
Основной текст — не меньше 16px; для длинных статей часто берут 17–18px. Мелкий текст (подписи, сноски) — не меньше 12–14px и с хорошим контрастом. Размер работает вместе с межстрочным интервалом: для основного текста line-height 1.5–1.7, для крупных заголовков — 1.1–1.25. В полях форм ставь не меньше 16px: иначе Safari на iPhone увеличивает страницу при фокусе на поле.
Приём html { font-size: 62.5% }
Иногда корню ставят font-size: 62.5%, чтобы 1rem был равен 10px и считать было проще. Приём рабочий, но тогда весь текст на сайте обязан явно получить размер (иначе он будет 10px), а сторонние компоненты, рассчитанные на 1rem = 16px, станут мелкими. Проще оставить 100% и пользоваться шкалой в переменных.
rem или px
Учитывает размер шрифта, который человек выбрал в настройках браузера. Основная шкала текста и отступов.
Фиксированный размер, игнорирует настройку шрифта браузера (масштаб страницы при этом работает). Для тонких деталей: рамок, теней.
Частые ошибки
- Задают основной текст меньше 16px «чтобы поместилось больше».
- Используют em во вложенных элементах и получают всё более мелкий текст.
- Задают заголовки только в vw — текст не растёт при масштабировании.
- Ставят полям ввода шрифт 14px, и iPhone увеличивает страницу при вводе.
- Выбирают уровень заголовка (h2, h3) по размеру, а не по структуре.
Доступность
Текст должен увеличиваться до 200% без потери содержания (WCAG 1.4.4). Это работает, если размеры заданы в rem или em, а в meta viewport не запрещено масштабирование. Учитывай людей, которые выставили в браузере крупный шрифт по умолчанию: px его игнорирует, rem — уважает.
Поддержка браузерами
font-size и единицы px, em, rem и % поддерживаются всеми браузерами. Функция clamp() работает во всех актуальных браузерах.
Практика
Создай шкалу размеров в переменных: подпись, основной текст, лид, h3, h2 и плавный h1 от 32 до 56px. Примени её к странице и проверь, что при увеличении шрифта в настройках браузера растёт весь текст, а у кнопки вместе с текстом растут отступы.
Показать решение
:root {
--text-s: .875rem; --text-m: 1rem; --text-l: 1.25rem;
--h3: 1.5rem; --h2: 1.875rem; --h1: clamp(2rem, 1.4rem + 3vw, 3.5rem);
}
html { font-size: 100%; }
body { font-size: var(--text-m); line-height: 1.6; }
h1 { font-size: var(--h1); line-height: 1.15; }
h2 { font-size: var(--h2); }
h3 { font-size: var(--h3); }
.lead { font-size: var(--text-l); }
small { font-size: var(--text-s); }
.button { font-size: 1rem; padding: .6em 1.2em; }Частые вопросы
Какой размер шрифта по умолчанию?
В браузерах — 16px, если человек не изменил его в настройках. Это значение 1rem.
Чем rem отличается от em?
rem считается от шрифта корневого элемента html и одинаков на всей странице. em — от шрифта родителя и перемножается при вложенности.
Как сделать адаптивный размер шрифта?
Через clamp: font-size: clamp(2rem, 1.4rem + 3vw, 3.5rem) — шрифт плавно растёт с экраном в заданных пределах.
Можно ли задавать размер шрифта в px?
Можно, но px игнорирует настройку шрифта в браузере. Для основной шкалы удобнее rem.
Какой минимальный размер основного текста?
Ориентир — 16px. Подписи — не меньше 12–14px. В полях форм — 16px, чтобы iPhone не увеличивал страницу.