← Назад к вопросам

В чём разница между Flexbox и CSS Grid?

1.2 Junior🔥 161 комментариев
#HTML и CSS

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между Flexbox и CSS Grid

Flexbox и CSS Grid — два мощных инструмента для создания макетов в современном CSS. Они решают разные задачи и работают по разным принципам.

Основные различия

Размерность

Flexbox — одномерная система. Она работает либо по горизонтали (строки), либо по вертикали (колонки).

.container {
  display: flex;
  flex-direction: row; /* или column */
  gap: 16px;
}

.item {
  flex: 1; /* растёт поровну */
  flex-grow: 2; /* растёт в 2 раза больше */
  flex-shrink: 0; /* не сжимается */
  flex-basis: 200px; /* базовый размер */
}

CSS Grid — двумерная система. Позволяет одновременно контролировать строки и колонки.

.container {
  display: grid;
  grid-template-columns: 1fr 2fr 1fr; /* 3 колонки */
  grid-template-rows: auto 200px auto; /* 3 строки */
  gap: 16px;
}

.item {
  grid-column: 1 / 3; /* занимает 2 колонки */
  grid-row: 1 / 2;
}

Когда использовать Flexbox

  1. Выравнивание элементов в одной оси — навигация, меню, список кнопок
  2. Адаптивные одномерные макеты — карточки в ряд, которые переносятся
  3. Выравнивание по центру — Flexbox намного проще для центрирования
/* Идеальное центрирование */
.centered {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 400px;
}
  1. Компоненты с неизвестным количеством детей — навигация, теги
  2. Равномерное распределение пространства — footer с элементами
.navbar {
  display: flex;
  justify-content: space-between; /* слева и справа */
  align-items: center;
}

.navbar-items {
  display: flex;
  gap: 24px;
}

Когда использовать CSS Grid

  1. Сложные двумерные макеты — дизайн страницы, таблицы
  2. Точный контроль позиции элементов — размещение по сетке
  3. Макеты с явной структурой строк и колонок — шапка, сайдбар, основной контент
.layout {
  display: grid;
  grid-template-columns: 250px 1fr 300px;
  grid-template-rows: 80px 1fr 60px;
  height: 100vh;
}

.header {
  grid-column: 1 / -1; /* во всю ширину */
}

.sidebar {
  grid-column: 1;
  grid-row: 2;
}

.main {
  grid-column: 2;
  grid-row: 2;
}
  1. Выравнивание элементов в обе стороны — галерея фото с точным размером
  2. Создание шаблонов областей — semanticHTML структура
.layout {
  display: grid;
  grid-template-areas:
    "header header header"
    "sidebar main sidebar"
    "footer footer footer";
}

.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }

Выравнивание элементов

СвойствоFlexboxGrid
align-itemsось crossвсе элементы (обе оси)
justify-contentось mainвсе элементы (обе оси)
gapестьесть
orderперепорядочитьнельзя без изменения grid-column

Производительность

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

Практические примеры

Flexbox — навигация:

.navbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 16px 24px;
}

.nav-left {
  display: flex;
  gap: 32px;
}

Grid — адаптивная галерея:

.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 24px;
}

Комбинация обоих:

.card {
  display: grid;
  grid-template-columns: 100px 1fr;
  gap: 16px;
}

.card-content {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}

Итоговое правило

  • Flexbox: "Как расположить элементы в одной линии?"
  • Grid: "Как разместить элементы в таблице с несколькими строками и колонками?"

Николи не думай, что нужно выбрать один из них. Они дополняют друг друга: используй Grid для макета страницы, Flexbox для компонентов внутри него.