Резиновая типографика: магия clamp()

Таня Фокина, MinskCSS

Резиновая типографика: магия clamp()

MinskCSS, 16 апреля 2025 📍

Обо мне

Часть 1. В поисках проблемы на свою голову

Ожидание

Реальность

Задача

Изменять размер заголовка таким образом, чтобы он адаптировался равномерно и последовательно на всех брейкпоинтах.

Часть 2. В поисках решения

Текущие стили заголовка

				h1 {
				  font-size: 3rem;
				}
				@media (width >= 576px) {
				  h1 {
				    font-size: 4rem;
				  }
				}
				@media (width >= 768px) {
				  h1 {
				    font-size: 7rem;
				  }
				}
			

Решение № 1. Добавить недостающие брейкпоинты и подходящие значения для font-size 🙂

Cтили с новыми брейкпоинтами

					h1 {
					  font-size: 3rem;
					}
					@media (width >= 460px) {
					  h1 {
					    font-size: 3.2rem;
					  }
					}
				
					@media (width >= 576px) {
					  h1 {
					    font-size: 4rem;
					  }
					}
					@media (width >= 768px) {
					  h1 {
					    font-size: 6rem;
					  }
					}
				
					@media (width >= 700px) {
					  h1 {
					    font-size: 5rem;
					  }
					}
					@media (width >= 992px) {
					  h1 {
					    font-size: 7rem;
					  }
					}
				

Количество брейкпоинтов

Было 🙂

  • ≥ 576px
  • ≥ 768px

Стало 🫠

  • ≥ 460px
  • ≥ 576px
  • ≥ 700px
  • ≥ 768px
  • ≥ 992px

Решение № 2. Изменять размеры заголовка резиново, а не отзывчиво.

Отзывчивый шрифт (Responsive)

Резиновый шрифт (Fluid)

Как сверстать резиновый текст?

Что такое clamp()?

CSS-функция, которая позволяет задать значение свойству в указанном диапазоне.

Поддержка функции clamp() в браузерах — 96.33 %.

Устройство clamp()

Значения:

				clamp(minValue, prefValue, maxValue);
			
Минимальное максимальное

За плавное изменение размера текста отвечает предпочтительное значение.

схема предпочтительного без калькуляций
схема с калькуляциями
чёрная дыра
предпочтительный размер

Предпочтительная ширина (vw)

v = 100 ( y 2 y 1 ) x 2 x 1

Относительный размер (rem)

r = ( x 1 y 2 ) ( x 2 y 1 ) x 1 x 2
мем с кнопками

Вариант с формулой

объяснение отличий

Часть NaN. Работает — не трогай

Секреты успешной резины

Почему не пиксели?

Если задать размер шрифта в пикселях, он заменит стандартный размер браузера (16 пикселей), и текст не будет увеличиваться при изменении настроек.

Пример с элементом html

				html {
				  font-size: 15px;
				}
				h1 {
				  font-size: 1rem;
				}
			
как устроено промежуточное значение

Соотношение между бо́льшим и меньшим значениями

Максимальный размер шрифта не должен превышать минимальный больше чем в 2.5 раза 🤯

Почему такое соотношение?

Текст с неправильными размерами плохо масштабируется, потому что не достигает двукратного увеличения из-за наложения функций увеличения и масштабирования.

Кто увеличивает текст и масштабирует интерфейс

Часть 4. Полируем демку

Переписываем код

Было

						h1 {
						  font-size: 3rem;
						}
						@media (width >= 460px) {
						  h1 {
						    font-size: 3.2rem;
						  }
						}
						
					

Стало

						h1 {
						  font-size: clamp(3rem, 5vw + 1.5rem, 7rem);
						}
					

Финальные штрихи. Избавляемся от дробных единиц для простоты восприятия ✨

Просто округли

				h1 {
				  font-size: clamp(3rem, 5vw + 1.5rem, 7rem);
				  font-size: clamp(3rem, round(down, 5vw + 1.5rem, 2px), 7rem);
				}
			

Текущие проблемы с round()

Часть 5. Вместо выводов

Резиновая типографика не заменяет отзывчивую: выбор зависит от конкретного случая.

Резиновая типографика

Плюсы ➕

  • Не требует поддержки большого зоопарка брейкпоинтов.
  • Реализуется с помощью одной строчки CSS.
  • Не нужно делать макеты для каждого размера экрана.

Минусы ➖

  • Сложная логика рассчёта промежуточного размера.
  • Может поломать браузерное масштабирование.
  • Текст непредсказуем, поэтому вёрстка не совпадает с макетом.

Когда использовать резину

Любые заголовки, особенно большие, и тексты с заметной разницей в размерах.

Калькуляторы

На почитать

Персональные ссылки

QR-код со ссылкой на сайт Доки
Дока 🐶
QR-код на блог
Блог о доступности
QR-код на сайт подкаста
Инклюзивный ананас