Что такое utility-first и зачем это нужно

Разбираемся, что значит «utility-first» и почему дизайн собирают прямо в разметке.

Utility-first — подход, при котором интерфейс собирается из множества мелких классов-утилит, каждый из которых задаёт одно CSS-свойство.

Привычный путь: семантические классы

Обычно мы пишем разметку с «говорящими» именами классов, а сами стили выносим в отдельный CSS-файл. Например, карточка товара:

<div class="card">
  <h3 class="card__title">Тариф Pro</h3>
  <p class="card__price">990 ₽</p>
</div>
.card {
  padding: 16px;
  border-radius: 8px;
  box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
.card__title { font-size: 18px; font-weight: 600; }
.card__price { color: #16a34a; }

Подход рабочий, но у него есть скрытая цена: нужно придумывать имена классов, постоянно прыгать между HTML и CSS, а сам CSS-файл со временем только растёт — старые правила боятся удалять, потому что неясно, где они ещё используются.

Путь Tailwind: утилиты в разметке

Tailwind предлагает не выдумывать имена, а собрать тот же вид из готовых классов прямо в HTML. Каждый класс отвечает за одно свойство: p-4 — это padding: 1rem, rounded-lg — скругление углов, shadow — тень.

<div class="p-4 rounded-lg shadow">
  <h3 class="text-lg font-semibold">Тариф Pro</h3>
  <p class="text-green-600">990 ₽</p>
</div>

Визуально результат тот же самый: карточка с внутренними отступами в 16 пикселей, скруглёнными углами и лёгкой тенью; заголовок крупнее и полужирный; цена — зелёного цвета. Но мы не написали ни строчки CSS и не придумали ни одного имени класса.

Почему это удобно

  • Не нужно придумывать имена. Самая мучительная часть CSS — нейминг — просто исчезает.
  • Всё в одном месте. Глядя на разметку, вы сразу видите весь её вид, не открывая отдельный файл.
  • CSS не растёт бесконтрольно. Вы переиспользуете одни и те же утилиты, а не плодите новые правила.
  • Удаление безопасно. Удалили блок разметки — удалились и его стили, ничего «осиротевшего» в CSS не осталось.

Это не инлайн-стили

Может показаться, что утилиты — это те же style="...", только сбоку. Но разница принципиальная. Утилиты привязаны к единой дизайн-системе: p-4 всегда даёт один и тот же отступ во всём проекте, цвета берутся из общей палитры, а не из случайных значений. Кроме того, утилиты умеют то, что инлайн-стили не могут: адаптивность (md:p-8) и состояния (hover:bg-blue-700). Об этом — в следующих разделах.

Итог

  • Utility-first — это сборка вида из мелких одно-свойственных классов прямо в разметке.
  • Вы перестаёте писать собственный CSS и придумывать имена классов.
  • Утилиты опираются на единую дизайн-систему и умеют адаптивность и состояния — в отличие от инлайн-стилей.
Проверьте себя
1. Что задаёт один класс-утилита в Tailwind?
AЦелый готовый компонент
BОдно CSS-свойство (или небольшую связанную группу)
CТолько цвет элемента
DJavaScript-поведение
2. Чем класс p-4 принципиально отличается от инлайн-стиля style="padding:16px"?
AНичем, это одно и то же
BУтилита привязана к дизайн-системе и умеет адаптивность и состояния
CИнлайн-стиль быстрее работает
DУтилиту нельзя переопределить
3. Какую типичную проблему обычного CSS снимает utility-first?
AНевозможность использовать цвета
BПридумывание имён классов и неконтролируемый рост CSS-файла
CОтсутствие поддержки в браузерах
DНельзя верстать сетки
Поддержать проект