Адаптивная типографика
Адаптивная типографика — подход к заданию размеров шрифта, при котором текст плавно масштабируется в зависимости от ширины вьюпорта или контейнера без резких скачков от брейкпоинта к брейкпоинту.
Зачем нужно
Фиксированный font-size: 16px на мобиле выглядит нормально, но тот же размер на 4K-мониторе кажется крошечным. Пошаговое изменение через медиазапросы создаёт резкие скачки. Адаптивная типографика делает текст читаемым и пропорциональным на любом устройстве.
Где используется
- Заголовки H1–H3 на лендингах и блогах
- Основной текст статей (оптимальная длина строки — 60–80 символов)
- Адаптивные UI-компоненты с динамическим контентом
- Системы дизайна с fluid type scale
Подход 1: vw-единицы
h1 {
font-size: 5vw; /* 5% от ширины вьюпорта */
}
/* Проблема: на очень узком экране становится нечитаемым */
Подход 2: clamp — предпочтительный
/* clamp(min, preferred, max) */
h1 {
font-size: clamp(1.5rem, 4vw, 3rem);
/* Минимум 1.5rem, максимум 3rem, в середине — 4vw */
}
p {
font-size: clamp(1rem, 1.5vw, 1.25rem);
}
<article>
<h1>Заголовок масштабируется плавно</h1>
<p>Текст тоже адаптируется к ширине экрана.</p>
</article>
Подход 3: calc с vw
/* Формула: base + (max - min) * (100vw - min-vw) / (max-vw - min-vw) */
h1 {
font-size: calc(1.5rem + 1.5vw);
/* На 320px ≈ 1.5rem + 4.8px; на 1200px ≈ 1.5rem + 18px */
}
Адаптивный line-height
p {
font-size: clamp(1rem, 1.5vw, 1.25rem);
line-height: 1.5; /* Безразмерный коэффициент — масштабируется вместе с шрифтом */
}
CSS Custom Properties для шкалы типографики
:root {
--text-sm: clamp(0.875rem, 1.5vw, 1rem);
--text-base: clamp(1rem, 1.8vw, 1.125rem);
--text-lg: clamp(1.125rem, 2vw, 1.5rem);
--text-xl: clamp(1.5rem, 3vw, 2.25rem);
--text-2xl: clamp(2rem, 5vw, 3.5rem);
}
h1 { font-size: var(--text-2xl); }
h2 { font-size: var(--text-xl); }
p { font-size: var(--text-base); }
Частые ошибки
- Только vw без clamp — шрифт становится нечитаемым на узких экранах; всегда задавайте min и max через
clamp. - Фиксированный line-height в px — при росте font-size межстрочный интервал не масштабируется; используйте безразмерный коэффициент.
- Слишком большой диапазон clamp — разница между min и max в 2-3x создаёт непропорциональные размеры; удерживайте разброс в пределах 1.5–2x.