LEARN X · ЗА 14 МИН

Tailwind CSS

Экспресс-тур по Tailwind CSS за 14 минут: utility-классы, отступы, цвета, flex и grid, состояния, адаптивность, тёмная тема и готовый компонент.

Tailwind CSS — это utility-first фреймворк: вместо того чтобы писать собственный CSS, вы собираете дизайн прямо в HTML из маленьких готовых классов вроде p-4, flex или text-center. Этот тур — вся суть Tailwind на одной странице, в плотно закомментированном коде. Читайте сверху вниз за 14 минут.

Что такое Tailwind (utility-first)

Один класс — одно CSS-свойство. Вы не выдумываете имена классов и не переключаетесь между HTML и .css-файлом — стилизуете прямо в разметке.

<!-- Обычный CSS: нужен класс .btn и отдельный файл стилей -->
<button class="btn">Кнопка</button>
<!-- В .css: .btn { padding: 8px 16px; background: blue; color: white } -->

<!-- Tailwind: те же стили собраны из утилит прямо здесь -->
<button class="px-4 py-2 bg-blue-500 text-white">Кнопка</button>
<!-- px-4 = горизонтальные отступы, py-2 = вертикальные -->
<!-- bg-blue-500 = синий фон, text-white = белый текст -->

<!-- Философия: маленькие переиспользуемые классы вместо -->
<!-- кастомного CSS. Дизайн виден сразу в HTML, ничего -->
<!-- не нужно искать в других файлах. -->

Подключение

Для продакшена ставят через сборку (CLI / PostCSS), для быстрых проб хватает CDN.

<!-- Вариант 1: CDN — вставить в <head>, ничего не собирать. -->
<!-- Подходит для прототипов и обучения, НЕ для продакшена. -->
<script src="https://cdn.tailwindcss.com"></script>

<!-- Вариант 2: CLI — для реальных проектов. -->
<!-- 1) npm install -D tailwindcss -->
<!-- 2) npx tailwindcss init  (создаст tailwind.config.js) -->
<!-- 3) собрать CSS, отслеживая изменения: -->
<!--    npx tailwindcss -i input.css -o output.css --watch -->
<!-- В input.css пишут директивы: -->
<!--    @tailwind base; @tailwind components; @tailwind utilities; -->
<!-- Сборщик оставит в output.css только реально используемые классы. -->
<link rel="stylesheet" href="output.css">

Отступы (padding, margin, gap между детьми)

Шкала единая: число — это шаг сетки (1 = 0.25rem = 4px). Буква задаёт сторону.

<!-- p = padding (внутренний), m = margin (внешний) -->
<div class="p-4">padding со всех сторон (4 = 16px)</div>
<div class="m-2">margin со всех сторон (2 = 8px)</div>

<!-- Стороны: t=top, r=right, b=bottom, l=left -->
<!-- Оси: x = лево+право, y = верх+низ -->
<div class="px-6 py-3">по горизонтали 24px, по вертикали 12px</div>
<div class="mt-8 mb-4">сверху 32px, снизу 16px</div>

<!-- space-x / space-y — отступ МЕЖДУ дочерними элементами -->
<div class="flex space-x-4">
  <span>A</span><span>B</span><span>C</span>
  <!-- между A-B и B-C появится зазор 16px -->
</div>

Размеры (width, height, ограничения)

<!-- w = width, h = height. Числа — та же шкала, что у отступов -->
<div class="w-32 h-16">ширина 128px, высота 64px</div>

<!-- Дроби и ключевые слова -->
<div class="w-1/2">половина ширины родителя (50%)</div>
<div class="w-full">вся ширина родителя (100%)</div>
<div class="h-screen">высота во весь экран (100vh)</div>

<!-- Ограничители: max-w- и min-h- -->
<div class="max-w-md mx-auto">
  <!-- max-w-md ограничивает ширину (~28rem), -->
  <!-- mx-auto центрирует блок по горизонтали -->
</div>
<div class="min-h-screen">минимум на всю высоту экрана</div>

Цвета (фон, текст, граница, палитра и оттенки)

Формат: свойство-цвет-оттенок. Оттенки идут от 50 (самый светлый) до 900/950 (самый тёмный).

<!-- bg- = фон, text- = цвет текста, border- = цвет рамки -->
<div class="bg-blue-500 text-white">синий фон, белый текст</div>

<!-- Шкала оттенков одного цвета: чем больше число, тем темнее -->
<div class="bg-gray-50">почти белый</div>
<div class="bg-gray-200">светло-серый</div>
<div class="bg-gray-500">средний серый</div>
<div class="bg-gray-900">почти чёрный</div>

<!-- Палитра именованная: slate, gray, red, orange, amber, -->
<!-- yellow, green, teal, blue, indigo, purple, pink и др. -->
<p class="text-red-600">красный текст</p>
<p class="text-green-600">зелёный текст</p>
<div class="border border-indigo-400">рамка цвета indigo</div>

Типографика

<!-- Размер шрифта: text-xs < sm < base < lg < xl < 2xl ... -->
<p class="text-xs">мелкий</p>
<p class="text-base">обычный (16px по умолчанию)</p>
<p class="text-2xl">крупный заголовок</p>

<!-- Насыщенность: font-light, font-normal, font-bold ... -->
<p class="font-bold">жирный текст</p>
<p class="font-light italic">тонкий курсив</p>

<!-- Выравнивание, межстрочный (leading) и межбуквенный (tracking) -->
<p class="text-center">по центру</p>
<p class="leading-relaxed">увеличенный интервал между строками</p>
<p class="tracking-wide uppercase">РАЗРЯДКА И ВЕРХНИЙ РЕГИСТР</p>

Flexbox

flex включает flex-контейнер, далее раскладываем детей по осям.

<!-- justify- = главная ось, items- = поперечная ось -->
<div class="flex justify-between items-center">
  <!-- justify-between: дети разъезжаются по краям -->
  <!-- items-center: выравнивание по центру по вертикали -->
  <span>Логотип</span>
  <span>Меню</span>
</div>

<!-- Частые значения justify: start, center, end, between, around -->
<div class="flex justify-center items-center h-32">
  идеально по центру и по горизонтали, и по вертикали
</div>

<!-- gap- = зазор между flex-детьми; flex-col = вертикально -->
<div class="flex flex-col gap-4">
  <div>строка 1</div>
  <div>строка 2 (между ними 16px)</div>
</div>

Grid

<!-- grid включает сетку, grid-cols-N задаёт число колонок -->
<div class="grid grid-cols-3 gap-4">
  <!-- 3 равные колонки, зазор 16px между ячейками -->
  <div>1</div><div>2</div><div>3</div>
  <div>4</div><div>5</div><div>6</div>
</div>

<!-- Ячейка может занимать несколько колонок через col-span-N -->
<div class="grid grid-cols-4 gap-2">
  <div class="col-span-2">широкая ячейка на 2 колонки</div>
  <div>узкая</div>
  <div>узкая</div>
</div>

Отображение и позиционирование

<!-- display: block, inline-block, hidden (display:none) -->
<div class="block">занимает всю строку</div>
<span class="inline-block">строчный, но с размерами</span>
<div class="hidden">полностью скрыт</div>

<!-- position: родителю relative, ребёнку absolute -->
<div class="relative w-40 h-40 bg-gray-200">
  <span class="absolute top-0 right-0 bg-red-500 text-white px-2">
    <!-- прижато к правому верхнему углу родителя -->
    NEW
  </span>
</div>

<!-- fixed закрепляет относительно окна, z-10 — слой выше -->
<div class="fixed bottom-4 right-4 z-10">плавающая кнопка</div>

Границы и тени

<!-- rounded скругляет углы: sm, (base), lg, xl, full (круг) -->
<div class="rounded-lg">скруглённые углы</div>
<img class="rounded-full w-16 h-16" src="avatar.jpg" alt="">

<!-- border задаёт рамку; можно толщину и цвет -->
<div class="border border-gray-300">тонкая рамка</div>
<div class="border-2 border-blue-500">рамка потолще, синяя</div>

<!-- shadow добавляет тень: sm, (base), md, lg, xl -->
<div class="shadow-md">лёгкая тень</div>
<div class="shadow-xl rounded-xl p-6">карточка с глубокой тенью</div>

Состояния и варианты (hover, focus, active)

Префикс через двоеточие применяет класс только в нужном состоянии.

<!-- hover: срабатывает при наведении мыши -->
<button class="bg-blue-500 hover:bg-blue-700 text-white px-4 py-2">
  <!-- обычно синяя, при наведении становится темнее -->
  Наведи на меня
</button>

<!-- focus: при фокусе (клик/таб), active: при нажатии -->
<input class="border focus:border-blue-500 focus:ring px-3 py-2">
<button class="bg-green-500 active:bg-green-800 px-4 py-2">
  темнеет в момент клика
</button>

<!-- transition сглаживает смену состояния анимацией -->
<a class="text-blue-600 hover:text-blue-900 transition">ссылка</a>

Адаптивность (брейкпоинты)

Tailwind mobile-first: класс без префикса — для всех экранов, префикс md: и т.п. включается от соответствующей ширины и выше.

<!-- Брейкпоинты: sm=640px, md=768px, lg=1024px, xl=1280px -->
<!-- 1 колонка на телефоне, 2 от md, 4 от lg -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
  <div>ячейка</div><div>ячейка</div>
  <div>ячейка</div><div>ячейка</div>
</div>

<!-- Размер текста и отступы тоже можно менять по ширине -->
<h2 class="text-xl md:text-3xl lg:text-5xl">растущий заголовок</h2>

<!-- Показать/скрыть элемент на разных экранах -->
<div class="block md:hidden">видно только на мобильном</div>
<div class="hidden md:block">видно только на десктопе</div>

Тёмная тема (dark:)

<!-- Префикс dark: применяет класс в тёмном режиме -->
<div class="bg-white text-gray-900 dark:bg-gray-900 dark:text-white">
  <!-- светлая тема: белый фон, тёмный текст -->
  <!-- тёмная тема: тёмный фон, белый текст -->
  Контент, который адаптируется под тему
</div>

<!-- dark: комбинируется с другими вариантами -->
<button class="bg-gray-200 hover:bg-gray-300 dark:bg-gray-700 dark:hover:bg-gray-600 px-4 py-2 rounded">
  кнопка, корректная в обеих темах
</button>
<!-- Режим включается классом dark на <html> (по настройке -->
<!-- darkMode в конфиге) или по системной теме пользователя. -->

Произвольные значения [...]

Когда шкалы не хватает — пишите точное значение в квадратных скобках.

<!-- Точные размеры, которых нет в стандартной шкале -->
<div class="w-[137px] h-[42px]">ровно 137 на 42 пикселя</div>
<div class="top-[3px] left-[7px] relative">тонкая подгонка</div>

<!-- Произвольный цвет (HEX) и произвольный размер шрифта -->
<p class="text-[#1da1f2] text-[13px]">фирменный синий, 13px</p>

<!-- Работает почти с любым свойством -->
<div class="bg-[url('/hero.jpg')] grid-cols-[1fr_2fr]">
  <!-- произвольная картинка фоном и нестандартная сетка -->
</div>

Типичный компонент — карточка

Финальный пример собирает почти всё из тура в один реальный блок.

<!-- Карточка: ограничена по ширине, скруглена, с тенью, -->
<!-- корректна в тёмной теме -->
<div class="max-w-sm mx-auto rounded-xl shadow-lg overflow-hidden bg-white dark:bg-gray-800">

  <img class="w-full h-40 object-cover" src="cover.jpg" alt="">

  <!-- p-6 = внутренние отступы, space-y-3 = зазор между детьми -->
  <div class="p-6 space-y-3">

    <h3 class="text-xl font-bold text-gray-900 dark:text-white">
      Заголовок карточки
    </h3>

    <p class="text-gray-600 dark:text-gray-300 leading-relaxed">
      Короткое описание. Текст приглушённый, со свободным
      межстрочным интервалом.
    </p>

    <!-- flex + justify-between разводит цену и кнопку по краям -->
    <div class="flex justify-between items-center pt-2">
      <span class="text-2xl font-bold text-blue-600">1990 ₽</span>
      <button class="px-4 py-2 rounded-lg bg-blue-500 hover:bg-blue-600 active:bg-blue-700 text-white transition">
        Купить
      </button>
    </div>

  </div>
</div>
Поддержать проект