min max clamp
min,maxиclamp— CSS-функции для адаптивных размеров, которые выбирают значение из набора без медиа-запросов.
Зачем нужно
Эти функции позволяют создавать плавно адаптирующиеся размеры без единого @media. clamp задаёт минимум, идеальное значение и максимум в одной строке — идеально для адаптивной типографики и отступов.
Где используется
- Адаптивные размеры шрифтов (fluid typography)
- Ограничение ширины контейнеров
- Адаптивные отступы и gap
- Любые значения, которые должны плавно масштабироваться
Предпосылки
- calc() — вычисления
- Единицы измерения —
rem,vw,%
min — наименьшее значение
Возвращает наименьшее из переданных значений:
.container {
/* Ширина: 1200px или 100% — что меньше */
width: min(1200px, 100%);
/* При ширине экрана > 1200px → 1200px
При ширине экрана < 1200px → 100% */
/* Эквивалент: */
width: 100%;
max-width: 1200px;
}
.card {
width: min(400px, 100% - 32px);
/* Карточка не шире 400px и не выходит за padding */
}
max — наибольшее значение
Возвращает наибольшее из переданных значений:
.sidebar {
/* Ширина: минимум 200px, но может расти до 25% */
width: max(200px, 25%);
}
.text() {
/* Шрифт не меньше 16px */
font-size: max(16px, 1.2vw);
}
/* Отступ: минимум 16px, но растёт с экраном */
.section {
padding: max(16px, 3vw);
}
clamp — значение в диапазоне
clamp(MIN, IDEAL, MAX) — предпочитает IDEAL, но не выходит за MIN и MAX:
.element {
/* font-size: минимум 16px, идеально 2.5vw, максимум 32px */
font-size: clamp(16px, 2.5vw, 32px);
/* Эквивалент: */
font-size: max(16px, min(2.5vw, 32px));
}
Адаптивная типографика
body {
font-size: clamp(1rem, 0.9rem + 0.5vw, 1.25rem);
}
h1 {
font-size: clamp(2rem, 1.5rem + 2.5vw, 4rem);
}
h2 {
font-size: clamp(1.5rem, 1.25rem + 1.5vw, 2.5rem);
}
h3 {
font-size: clamp(1.25rem, 1.1rem + 0.8vw, 1.75rem);
}
Адаптивные отступы
:root {
--space-sm: clamp(8px, 1vw, 16px);
--space-md: clamp(16px, 2vw, 32px);
--space-lg: clamp(32px, 5vw, 80px);
}
section {
padding: var(--space-lg) var(--space-md);
}
.card {
padding: var(--space-md);
gap: var(--space-sm);
}
Адаптивная ширина
.container {
width: clamp(320px, 90%, 1200px);
margin-inline: auto;
}
.article {
max-width: clamp(45ch, 50%, 75ch);
}
Несколько аргументов
min и max принимают любое количество аргументов:
.element {
width: min(100%, 800px, 90vw);
/* Самое маленькое из трёх */
padding: max(16px, 2vw, 1rem);
/* Самое большое из трёх */
}
Вложенные функции
.element {
/* calc внутри clamp */
width: clamp(200px, calc(50% - 20px), 600px);
/* min внутри max */
font-size: max(1rem, min(3vw, 2rem));
/* = clamp(1rem, 3vw, 2rem) */
/* С переменными */
padding: clamp(
var(--min-padding),
calc(var(--base-padding) + 1vw),
var(--max-padding)
);
}
Формула fluid typography
Формула для расчёта идеального значения в clamp:
IDEAL = MIN_SIZE + (MAX_SIZE - MIN_SIZE) * (100vw - MIN_VP) / (MAX_VP - MIN_VP)
/* Пример: 16px при 375px viewport, 24px при 1440px viewport */
/* IDEAL = 16 + (24-16) * (100vw - 375px) / (1440-375) */
/* = 16 + 8 * (100vw - 375px) / 1065 */
/* ≈ 0.57rem + 0.75vw */
h1 {
font-size: clamp(1rem, 0.57rem + 0.75vw, 1.5rem);
}
Используйте калькуляторы fluid typography вместо ручных расчётов.
Частые ошибки
clampс одинаковыми единицами — бессмысленно:/* Бесполезно — просто используйте min-width/max-width */ width: clamp(200px, 300px, 400px); /* Всегда 300px */- MIN > MAX — результат непредсказуемый:
/* ОШИБКА */ font-size: clamp(2rem, 1vw, 1rem); /* MIN > MAX */ - Только viewport-единицы — нарушает доступность (пользователь не может масштабировать):
/* ПЛОХО */ font-size: clamp(12px, 2vw, 24px); /* px не масштабируются */ /* ХОРОШО */ font-size: clamp(1rem, 0.5rem + 1vw, 1.5rem); /* rem масштабируется */ - Забыли, что min возвращает меньшее — логика «перевёрнутая» относительно
min-width
Практика
- Создать fluid typography для body, h1, h2, h3 через
clamp - Сделать контейнер через
width: min(1200px, 100% - 48px) - Задать адаптивные отступы через
clamp - Реализовать адаптивный
gapбез медиа-запросов - Использовать калькулятор fluid typography
Связанные темы
- calc() — базовые вычисления
- Единицы измерения —
rem,vwдля адаптивности - CSS переменные — переменные в функциях