
Руководство по CSS clamp(): адаптив без медиа-запросов
ДБ
Дмитрий Борисенко
В этой статье разбираем clamp() — функцию CSS, которая задает значение с
нижней и верхней границей. Это удобно для адаптивной вёрстки, особенно для
font-size, padding и margin.
Используя clamp(), можно создавать плавную, адаптивную типографику без единого
медиа-запроса.
Что такое clamp()?
CSS функция clamp() позволяет установить значение, которое адаптируется в
заданном диапазоне в зависимости от ширины экрана.
Как это работает:
- Минимум: наименьшее допустимое значение
- Предпочтительное: динамическое значение (обычно с vw)
- Максимум: наибольшее допустимое значение
Практические примеры
1. Адаптивные заголовки
Этот заголовок:
- Не будет меньше 32px (2rem)
- Масштабируется с шириной экрана и при zoom страницы
- Не превысит 64px (4rem)
2. Плавные отступы
Важно: Не используйте только vw в среднем значении (например,
clamp(1rem, 3vw, 3rem)). Единица vw зависит только от ширины viewport и не
реагирует на масштабирование страницы (Ctrl/Cmd + или колёсико мыши). При
увеличении масштаба страницы размер не изменится, что ухудшает доступность.
Комбинируйте vw с относительными единицами: 1rem + 2vw.
3. Адаптивная ширина контейнера
Формула для идеального clamp()
Для расчёта оптимальных значений используйте формулу:
Пример расчёта:
- Минимальный размер: 16px при 320px viewport
- Максимальный размер: 24px при 1200px viewport
Коэффициент масштабирования: (24 − 16) / (1200 − 320) = 0.00909 → 0.909vw. Базовое значение: 16 − 0.00909 × 320 = 13.09px → 0.818rem.
Проверьте себя: при 320px получится ровно 16px, при 1200px — ровно 24px. Если подставить одинаковые числа в оба слагаемых (частая опечатка), кривая уедет — на 320px выйдет 17.5px вместо 16.
Считать это руками необязательно — воспользуйтесь калькулятором clamp(): он подставит числа сам и сразу покажет получившуюся кривую.
Преимущества использования clamp()
1. Меньше кода
Вместо множества медиа-запросов:
2. Плавные переходы
Размеры изменяются постепенно, без резких скачков при смене брейкпоинтов.
3. Меньше мест для ошибки
Одна строка вместо набора брейкпоинтов — меньше кода, который надо поддерживать
в трёх местах. А вот на производительность clamp() не влияет: значение
пересчитывается на каждом кадре ресайза, тогда как медиазапрос переключается
один раз. Выигрыш здесь в поддерживаемости, а не в скорости.
Лучшие практики
1. Используйте относительные единицы
2. Тестируйте на разных устройствах
Проверяйте, как выглядят размеры на:
- Мобильных (320-414px)
- Планшетах (768-1024px)
- Десктопах (1280px+)
3. Комбинируйте с CSS переменными
Поддержка браузерами
clamp() работает везде с 2020 года — это Baseline. Никакие запасные значения и
полифилы не нужны, дублировать font-size перед ним не надо.
Распространённые ошибки
1. Неправильный порядок значений
2. Слишком большой диапазон
3. Использование только vw
Продвинутые техники
1. clamp() всегда линеен
Иногда советуют «нелинейное масштабирование через calc()». Это заблуждение:
clamp() умеет только прямую линию между минимумом и максимумом. Если нужна
кривая — придётся разбивать диапазон на несколько отрезков или брать
контейнерные запросы.
2. Адаптивная сетка
3. Анимированные значения
Доступность: чистый vw ломает масштабирование
Это самая частая и самая незаметная ошибка.
Единица vw привязана к окну, а не к настройкам пользователя. Человек
увеличил шрифт в браузере — текст не отреагировал. Формально это провал
требования WCAG 1.4.4: страница обязана оставаться читаемой при увеличении до
200%.
Лечится одним слагаемым в rem:
Правило простое: rem-слагаемое должно давать заметный вклад — ориентир не
меньше половины значения на типичной ширине. Минимум и максимум тоже задавайте в
rem: именно они дают тексту расти при зуме.
cqi вместо vw для компонентов
Если размер должен зависеть не от окна, а от контейнера — карточка в сайдбаре
шире не станет, сколько ни расширяй экран, — берите cqi: это 1% инлайн-размера
контейнера.
Бонус: при зуме контейнер растёт вместе с текстом, поэтому cqi ведёт себя
доступнее vw. Подробнее — в статье про
контейнерные запросы.
clamp() и line-clamp — разные вещи
Их постоянно путают, потому что называются похоже.
clamp() — математическая функция: ограничивает число между минимумом и
максимумом. Работает с размерами, отступами, шириной.
-webkit-line-clamp — обрезка текста по числу строк с многоточием. К
clamp() отношения не имеет.
min() и max()
clamp(a, b, c) — это в точности max(a, min(b, c)). Иногда нужна только одна
граница:
Кстати, 100vw включает ширину полосы прокрутки — отсюда классический
горизонтальный оверфлоу. Берите 100% или 100dvw.
Заключение
CSS clamp() — это мощный инструмент для создания по-настоящему адаптивного
дизайна. Он упрощает код, улучшает производительность и
обеспечивает плавное масштабирование элементов.
Ключевые выводы:
- Используйте
clamp()для типографики и отступов - Комбинируйте с относительными единицами
- Тестируйте на разных размерах экрана
- Не считайте коэффициенты в уме — держите под рукой калькулятор
Начните использовать clamp() уже сегодня и сделайте ваш дизайн более гибким и
современным!
Полезные ресурсы
CSS clamp(): адаптивный шрифт без медиазапросов
Задайте минимальный и максимальный размер — калькулятор соберёт clamp(), и шрифт будет плавно тянуться за шириной экрана.
Попробовать



