Клавиша / esc

clamp()

Как задать минимальное и максимальное значения в CSS в одну строчку кода?

Время чтения: меньше 5 мин

Кратко

Скопировано

Функция clamp() позволяет ограничивать диапазон изменения некоего значения, задавая его нижний и верхний пределы.

Пример

Скопировано
        
          
          .title {  font-size: clamp(1rem, 2.5vw, 2rem);}
          .title {
  font-size: clamp(1rem, 2.5vw, 2rem);
}

        
        
          
        
      

Значения 1rem и 2rem будут минимальной и максимальной границами значения соответственно. 2.5vw — предпочтительный размер шрифта. Это означает, что размер шрифта будет варьироваться в зависимости от ширины окна браузера, но никогда не станет меньше, чем 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(МИН, min(ПРЕДПОЧТИТЕЛЬНОЕ, МАКС)): сначала предпочтительное значение сравнивается с максимумом и выбирается то, что меньше, а затем результат сравнивается с минимумом и выбирается то, что больше. Так браузер гарантирует, что итоговое значение никогда не выйдет за пределы диапазона.

На практике границы (минимум и максимум) обычно задают в фиксированных единицах вроде px или rem, а предпочтительное значение — в относительных единицах: vw, %, em. Тогда значение плавно меняется вместе с шириной окна или размером родителя, но не выходит за заданные рамки.

Подсказки

Скопировано

💡 Если предпочтительное значение в clamp() зависит только от vw, браузер может перестать учитывать масштабирование текста, которое настроил пользователь. Чтобы этого избежать, добавьте к vw фиксированную часть через calc(), например clamp(1rem, calc(0.5rem + 2vw), 2rem).

💡 clamp() работает не только с font-size и width, но и с padding, gap, line-height и любым другим числовым CSS-свойством.

Поддержка в браузерах:
  • Chrome 79, поддерживается
  • Edge 79, поддерживается
  • Firefox 75, поддерживается
  • Safari 13.1, поддерживается
О Baseline

На практике

Скопировано

Алёна Батицкая советует

Скопировано

🛠 Мой любимый приём это обёртка .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-size одним vwclamp(1rem, 8vw, 3rem) — рост получается слишком резким: на узких экранах текст быстро долетает до максимума и дальше просто стоит на месте. Мне больше нравится комбинировать vw с calc(): clamp(1rem, calc(0.5rem + 4vw), 3rem). Фиксированная часть (0.5rem) задаёт стартовую точку, а 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 со статьёй не меняется от перетаскивания ползунка.

Открыть демо в новой вкладке