Кратко
СкопированоФункция clamp позволяет ограничивать диапазон изменения некоего значения, задавая его нижний и верхний пределы.
Пример
Скопировано
.title { font-size: clamp(1rem, 2.5vw, 2rem);}
.title {
font-size: clamp(1rem, 2.5vw, 2rem);
}
Значения 1rem и 2rem будут минимальной и максимальной границами значения соответственно. 2 — предпочтительный размер шрифта. Это означает, что размер шрифта будет варьироваться в зависимости от ширины окна браузера, но никогда не станет меньше, чем 1rem, и больше, чем 2rem.
Как пишется
СкопированоФункция принимает три параметра: минимальное значение, предпочтительное значение и максимально допустимое значение.
- минимальное значение — нижняя граница допустимых значений; используется минимальное, если предпочтительное значение меньше этого значения;
- предпочтительное значение — рекомендуемое значение, которое будет использоваться до тех пор, пока результат находится между минимальным и максимальным значениями;
- максимальное значение — верхняя граница допустимых значений; используется максимальное, если предпочтительное значение больше этой верхней границы.
В качестве значений параметров можно использовать: calc, min или max, различные единицы измерения.
<div class="box">Ширина: 240px</div>
<div class="box">Ширина: 240px</div>
.box { width: clamp(240px, 80%, 360px); margin: 0 auto;}
.box {
width: clamp(240px, 80%, 360px);
margin: 0 auto;
}
При изменении ширины фрейма срабатывает функция clamp и высчитывает ширину.
Как понять
СкопированоПо сути clamp — это то же самое, что max: сначала предпочтительное значение сравнивается с максимумом и выбирается то, что меньше, а затем результат сравнивается с минимумом и выбирается то, что больше. Так браузер гарантирует, что итоговое значение никогда не выйдет за пределы диапазона.
На практике границы (минимум и максимум) обычно задают в фиксированных единицах вроде px или rem, а предпочтительное значение — в относительных единицах: vw, %, em. Тогда значение плавно меняется вместе с шириной окна или размером родителя, но не выходит за заданные рамки.
Подсказки
Скопировано💡 Если предпочтительное значение в clamp зависит только от vw, браузер может перестать учитывать масштабирование текста, которое настроил пользователь. Чтобы этого избежать, добавьте к vw фиксированную часть через calc, например clamp.
💡 clamp работает не только с font и width, но и с padding, gap, line и любым другим числовым CSS-свойством.
- Chrome 79, поддерживается
- Edge 79, поддерживается
- Firefox 75, поддерживается
- Safari 13.1, поддерживается
На практике
Скопированосоветует
Скопировано🛠 Мой любимый приём это обёртка .container на одном clamp вместо пачки медиавыражений. Раньше для ширины контента приходилось писать что-то вроде «до 600px — 100%, от 600 до 1200 — 90%, дальше фикс 1140px». С clamp это одна строка: минимум, предпочтительное значение в процентах и максимум.
.container { width: clamp(240px, 90%, 480px); margin: 0 auto; padding: clamp(16px, 4vw, 32px);}
.container {
width: clamp(240px, 90%, 480px);
margin: 0 auto;
padding: clamp(16px, 4vw, 32px);
}
Заодно clamp удобно повесить и на padding — тогда отступы у контейнера тоже растут вместе с шириной экрана, а не переключаются скачком на брейкпоинте.
🛠 Если тянуть font одним vw — clamp — рост получается слишком резким: на узких экранах текст быстро долетает до максимума и дальше просто стоит на месте. Мне больше нравится комбинировать vw с calc: clamp. Фиксированная часть (0) задаёт стартовую точку, а vw-часть отвечает только за скорость роста — получается более плавная кривая, и не нужно подбирать коэффициент vw наугад.
h1 { font-size: clamp(1rem, calc(0.5rem + 4vw), 3rem);}
h1 {
font-size: clamp(1rem, calc(0.5rem + 4vw), 3rem);
}
В демке ниже ползунок меняет не окно браузера целиком, а ширину блока с текстом — поэтому вместо vw там cqw (единица container queries, работает так же, но привязана к контейнеру, а не к странице). Идея та же, просто показать её через vw в самой демке не получится: ширина iframe со статьёй не меняется от перетаскивания ползунка.