В нашем прошлом гайде мы разобрали Flexbox. Мы выяснили, что он идеален для одномерных (1D) макетов: выравнивания элементов в строке или в колонке. Это идеально для меню, кнопок и карточек.

Но что, если вам нужно сверстать весь макет сайта? С шапкой, контентом, сайдбаром и футером? Здесь в игру вступает CSS Grid.

Grid — это двумерная (2D) система. Она позволяет вам управлять элементами одновременно и по горизонтали, и по вертикали. Это, по сути, таблица, но невероятно мощная и гибкая. И, конечно, в Tailwind CSS для нее есть супер-удобные классы.

Основы: Контейнер, Колонки и Ряды

Чтобы Grid заработал, вы, как и во Flexbox, должны объявить контейнер.

Класс Tailwind: grid
CSS: display: grid;

Но просто grid ничего не сделает. В отличие от Flexbox, Grid не знает, какую сетку вы хотите. Вы должны явно указать, сколько у вас будет колонок и (опционально) рядов.

1. Определение Колонок: grid-cols-{n}
Это свойство говорит, на сколько равных колонок нужно поделить контейнер.

<!-- Сетка из 3-х равных колонок -->
<div class="grid grid-cols-3 bg-slate-800">
  <div class="bg-pink-500 p-4">1</div>
  <div class="bg-cyan-500 p-4">2</div>
  <div class="bg-purple-500 p-4">3</div>
  <div class="bg-pink-500 p-4">4</div>
  <div class="bg-cyan-500 p-4">5</div>
  <div class="bg-purple-500 p-4">6</div>
</div>

2. Определение Рядов: grid-rows-{n}
То же самое, но для высоты рядов. Чаще всего высота задается автоматически контентом, но вы можете ее контролировать.

<!-- Сетка из 2-х рядов. Контейнеру нужна высота! -->
<div class="grid grid-cols-3 grid-rows-2 h-48 bg-slate-800">
  <div class="bg-pink-500 p-4">1</div> <!-- Ряд 1 -->
  <div class="bg-cyan-500 p-4">2</div> <!-- Ряд 1 -->
  <div class="bg-purple-500 p-4">3</div> <!-- Ряд 1 -->
  <div class="bg-pink-500 p-4">4</div> <!-- Ряд 2 -->
  <div class="bg-cyan-500 p-4">5</div> <!-- Ряд 2 -->
  <div class="bg-purple-500 p-4">6</div> <!-- Ряд 2 -->
</div>

Пространство между: `gap`

Это одно из главных преимуществ Grid (и Flexbox). Раньше нам приходилось использовать margin, что было неудобно. Теперь есть gap (зазор).

<!-- 
  grid-cols-3 — 3 колонки
  gap-4 — зазор в 1rem (16px) и по горизонтали, и по вертикали
-->
<div class="grid grid-cols-3 gap-4 bg-slate-800 p-4">
  <div class="bg-pink-500 p-4 rounded">1</div>
  <div class="bg-cyan-500 p-4 rounded">2</div>
  <div class="bg-purple-500 p-4 rounded">3</div>
  <div class="bg-pink-500 p-4 rounded">4</div>
  <div class="bg-cyan-500 p-4 rounded">5</div>
  <div class="bg-purple-500 p-4 rounded">6</div>
</div>

Вы также можете задать зазоры раздельно: gap-x-4 (только по горизонтали) и gap-y-8 (по вертикали).

"Растягивание" элементов: `col-span`

Вот здесь и начинается магия Grid. Что, если вы хотите, чтобы один элемент занимал не одну колонку, а две или три?

Для этого используется класс col-span-{n} (span = "растянуться на").

<!-- Сетка на 4 колонки с зазором -->
<div class="grid grid-cols-4 gap-4 bg-slate-800 p-4">
  
  <!-- Этот элемент растянут на 2 колонки -->
  <div class="col-span-2 bg-pink-500 p-4 rounded">Я занимаю 2 колонки (1 и 2)</div>
  
  <div class="bg-cyan-500 p-4 rounded">3</div>
  <div class="bg-purple-500 p-4 rounded">4</div>
  
  <div class="bg-cyan-500 p-4 rounded">5</div>
  
  <!-- Этот элемент растянут на 3 колонки -->
  <div class="col-span-3 bg-pink-500 p-4 rounded">Я занимаю 3 колонки (6, 7 и 8)</div>
</div>

Точно так же существует row-span-{n} для растягивания по вертикали.

Практический пример: Макет блога

Давайте сверстаем классический макет блога (Шапка, Сайдбар, Контент, Футер) на Grid. Это займет буквально пару минут.

<!-- 
  Мы создаем сетку из 4-х колонок.
  Контейнеру задаем высоту h-screen (во весь экран) 
  и зазор gap-4.
-->
<div class="grid grid-cols-4 gap-4 h-screen bg-slate-900 p-4">
  
  <!-- Шапка: растягиваем на все 4 колонки -->
  <header class="col-span-4 bg-pink-500 rounded-lg p-4 text-white">
    Шапка (col-span-4)
  </header>

  <!-- Сайдбар: занимает 1 колонку -->
  <aside class="bg-cyan-500 rounded-lg p-4">
    Сайдбар (col-span-1)
  </aside>

  <!-- Контент: растягиваем на 3 колонки -->
  <main class="col-span-3 bg-slate-200 rounded-lg p-4">
    Основной контент (col-span-3)
  </main>

  <!-- Футер: растягиваем на все 4 колонки -->
  <footer class="col-span-4 bg-pink-500 rounded-lg p-4 text-white">
    Футер (col-span-4)
  </footer>

</div>

Grid или Flex? Используйте оба!

Вам не нужно выбирать что-то одно. Лучшие макеты используют и то, и другое.

Золотое правило:
Используйте Grid для общей раскладки страницы (<header>, <main>, <aside>).
А внутри этих блоков используйте Flexbox для выравнивания мелких элементов (кнопок, текста, иконок).

Например, в нашем примере выше, вы можете добавить flex justify-between items-center в <header>, чтобы красиво расставить в нем логотип и меню навигации.