$ sudo teach|
    $ sudo teach|
    IT school
  • Telegram
  • Партнёрам
  • Все курсы
$ sudo teach IT
OOO "SALEPROFIT"Контакты и реквизитыIT-Park Logo

Школа

  • Блог
  • Проверить сертификат

Сотрудничество

  • Стать учителем
  • Партнёрская программа
  • О проекте

Право

  • Оферта
  • Политика конфиденциальности

© 2023–2026 $ sudo teach IT™. All Rights Reserved. Public user contributions licensed under CC BY-SA 4.0 license with attribution required
TelegramGitHubYouTube
ГлавнаяБлогFlexbox vs Grid: когда использовать каждый инструмент вёрстки

Flexbox vs Grid: когда использовать каждый инструмент вёрстки

$ sudo teach IT
·17 июля 2026 г.·7 мин·69
Flexbox vs Grid: когда использовать каждый инструмент вёрстки

Сравниваем два главных инструмента CSS-раскладки на живых примерах и объясняем, какой подход выбрать для конкретных задач. Разбираем типичные ошибки, из-за которых верстка «ломается» на мобильных.

Содержание
Откуда вообще взялась путаницаОдно измерение против двухКогда использовать FlexboxНавигация и горизонтальные спискиКарточки с переменным содержимымЦентрирование элементовДинамические компоненты с неизвестным числом элементовКогда использовать GridРаскладка страницы целикомСетки карточекСложные дашборды и интерфейсыТипичные ошибки, из-за которых верстка ломается на мобильныхОшибка 1: фиксированные размеры вместо гибких единицОшибка 2: забытый min-width: 0 у flex-элементовОшибка 3: flex-wrap без учёта минимальной шириныОшибка 4: Grid без адаптации под мобильныеОшибка 5: вложенные флексы вместо GridМожно ли комбинировать Flexbox и Grid?Практический ориентир: как принять решениеВывод

Среди разработчиков до сих пор нет единого мнения о том, что выбрать — Flexbox или CSS Grid. Одни говорят, что Grid вытеснил Flexbox и теперь он не нужен. Другие верстают всё подряд через flex, потому что «так привычнее». Оба подхода ошибочны, и оба приводят к одному результату: верстке, которая ломается на мобильных, требует костылей и плохо читается другими разработчиками.

Правда в том, что Flexbox и Grid решают разные задачи. Они не конкурируют — они дополняют друг друга. Разобраться в этом различии — значит перестать бороться с CSS и начать думать на его языке.


Откуда вообще взялась путаница

До появления Flexbox (2012) и Grid (2017) разработчики верстали раскладки через float, inline-block и таблицы. Это было неудобно, ненадёжно и требовало огромного количества хаков. Когда Flexbox появился в браузерах, он стал настоящим спасением — и многие просто начали использовать его везде, для любых задач.

Grid появился позже и поначалу воспринимался как «что-то сложное для сеток». Постепенно поддержка браузеров выровнялась, и сегодня оба инструмента доступны без каких-либо полифилов. Но привычка «всё на флексах» никуда не делась.

Чтобы понять, когда что использовать, нужно вернуться к базовому вопросу: что именно ты раскладываешь?


Одно измерение против двух

Ключевое различие между Flexbox и Grid — это количество осей, с которыми они работают.

Flexbox — это одномерная система. Ты выстраиваешь элементы либо в строку, либо в колонку. Да, элементы могут переноситься на новую строку через flex-wrap, но каждая строка при этом живёт независимо — Flexbox не знает ничего о соседних строках.

Grid — двумерная система. Ты явно задаёшь строки и колонки, и элементы размещаются в пересечении этих осей. Grid «видит» всю раскладку целиком.

Это звучит абстрактно, поэтому разберём на конкретных примерах.


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

Навигация и горизонтальные списки

Классический случай — шапка сайта с логотипом слева и меню справа. Это типичная одномерная задача: выстроить элементы в строку и распределить пространство между ними.

code
.header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 0 24px;
}

Здесь Grid был бы избыточен. Нам не нужны строки — только одна ось и контроль над выравниванием.

Карточки с переменным содержимым

Допустим, у тебя есть карточка товара: картинка, заголовок, описание и кнопка «Купить». Нужно, чтобы кнопка всегда прижималась к низу карточки, независимо от длины текста.

code
.card {
  display: flex;
  flex-direction: column;
  height: 100%;
}

.card__body {
  flex: 1; /* занимает всё доступное пространство */
}

.card__button {
  margin-top: auto;
}

Это задача для Flexbox: управление распределением пространства внутри одного элемента по одной оси.

Центрирование элементов

Один из самых частых запросов — «как отцентрировать блок по вертикали и горизонтали». Flexbox справляется с этим в две строки:

code
.container {
  display: flex;
  justify-content: center;
  align-items: center;
}

Простая задача — простое решение.

Динамические компоненты с неизвестным числом элементов

Если количество элементов заранее неизвестно (теги, чипы, список фильтров), Flexbox с flex-wrap — правильный выбор. Элементы сами перенесутся на новую строку, когда закончится место.

code
.tags {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

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

Раскладка страницы целиком

Если нужно разбить страницу на шапку, боковую панель, основной контент и подвал — это задача для Grid. Ты явно описываешь структуру, и браузер строго её соблюдает.

code
.page {
  display: grid;
  grid-template-columns: 240px 1fr;
  grid-template-rows: auto 1fr auto;
  grid-template-areas:
    "header  header"
    "sidebar content"
    "footer  footer";
  min-height: 100vh;
}

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

Попробуй сделать то же самое на Flexbox — и ты быстро обнаружишь, что тебе нужны вложенные контейнеры, дополнительные обёртки и масса компромиссов.

Сетки карточек

Галереи, каталоги товаров, плитки — всё, где нужно выровнять элементы и по горизонтали, и по вертикали одновременно.

code
.catalog {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 24px;
}

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

Сложные дашборды и интерфейсы

Когда элементы должны занимать несколько строк или колонок, Grid незаменим:

code
.dashboard {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 16px;
}

.widget--wide {
  grid-column: span 2;
}

.widget--tall {
  grid-row: span 2;
}

Это невозможно выразить через Flexbox без значительных усложнений.


Типичные ошибки, из-за которых верстка ломается на мобильных

Здесь стоит остановиться подробнее — именно эти ошибки чаще всего встречаются у разработчиков, которые только осваивают раскладки.

Ошибка 1: фиксированные размеры вместо гибких единиц

code
/* Плохо */
.grid {
  display: grid;
  grid-template-columns: 300px 300px 300px;
}

/* Хорошо */
.grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
}

На экране шириной 320px три колонки по 300px дадут горизонтальный скролл. 1fr — дробная единица, которая делит доступное пространство, а не задаёт абсолютный размер.

Ошибка 2: забытый min-width: 0 у flex-элементов

Flex-элементы по умолчанию не могут быть меньше размера своего содержимого. Это приводит к переполнению контейнера длинными словами или URL.

code
/* Текст внутри может вылезти за пределы */
.flex-item {
  flex: 1;
}

/* Правильно */
.flex-item {
  flex: 1;
  min-width: 0;
}

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

Ошибка 3: flex-wrap без учёта минимальной ширины

code
.container {
  display: flex;
  flex-wrap: wrap;
}

.item {
  flex: 1 1 200px; /* хочу перенос при ширине меньше 200px */
}

Выглядит логично, но если у item есть padding или border, а box-sizing не установлен в border-box — реальный размер окажется больше 200px, и перенос произойдёт не там, где ожидалось. Всегда добавляй в сброс стилей:

code
*, *::before, *::after {
  box-sizing: border-box;
}

Ошибка 4: Grid без адаптации под мобильные

code
/* Только для десктопа */
.grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
}

На мобильном четыре колонки превратятся в узкие полоски. Используй auto-fill или auto-fit с minmax, либо явно переопределяй шаблон в медиазапросе:

code
.grid {
  display: grid;
  grid-template-columns: 1fr; /* мобильный — одна колонка */
}

@media (min-width: 768px) {
  .grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (min-width: 1200px) {
  .grid {
    grid-template-columns: repeat(4, 1fr);
  }
}

Ошибка 5: вложенные флексы вместо Grid

Когда разработчик пытается построить двумерную раскладку через Flexbox, он неизбежно приходит к вложенным контейнерам. Это усложняет HTML, создаёт проблемы с выравниванием строк и делает код хрупким.

code
<!-- Антипаттерн: имитация Grid через вложенные flex -->
<div class="row">
  <div class="col">...</div>
  <div class="col">...</div>
</div>
<div class="row">
  <div class="col">...</div>
  <div class="col">...</div>
</div>

Если тебе нужна сетка — используй Grid. Это именно то, для чего он создан.


Можно ли комбинировать Flexbox и Grid?

Не только можно — нужно. В реальных проектах они работают вместе на разных уровнях.

Типичная схема: Grid задаёт общую раскладку страницы или крупных блоков, а Flexbox управляет содержимым внутри этих блоков — выравниванием элементов в карточке, распределением иконок в кнопке, навигационными ссылками в шапке.

code
/* Grid — структура страницы */
.layout {
  display: grid;
  grid-template-columns: 1fr 3fr;
  gap: 32px;
}

/* Flexbox — содержимое карточки внутри grid-ячейки */
.card {
  display: flex;
  flex-direction: column;
  gap: 12px;
}

Именно такой подход используется в большинстве современных дизайн-систем и компонентных библиотек.


Практический ориентир: как принять решение

Вот простой алгоритм, который помогает сделать выбор:

  • Один ряд или один столбец → Flexbox
  • Сетка, таблица, двумерная раскладка → Grid
  • Неизвестное количество элементов, которые должны переноситься → Flexbox с flex-wrap
  • Элементы должны выравниваться относительно друг друга по двум осям → Grid
  • Нужно управлять пространством внутри компонента → Flexbox
  • Нужно задать структуру всей страницы или крупного раздела → Grid

Если сомневаешься — задай себе вопрос: «Мне важно, как элементы выстраиваются относительно соседних строк?» Если да — Grid. Если нет — Flexbox.

Тем, кто хочет разобраться в этих инструментах системно, а не через разрозненные примеры из Stack Overflow, может быть полезен курс «HTML/CSS» — там раскладки разбираются в контексте реальной вёрстки, от базовых концепций до адаптивных компонентов.


Вывод

Flexbox и Grid — не конкуренты и не замена друг другу. Это два инструмента с разными зонами ответственности. Flexbox отлично справляется с одномерными задачами: выравниванием, распределением пространства внутри строки или колонки, управлением компонентами с переменным содержимым. Grid берёт на себя двумерные раскладки: структуру страниц, сетки карточек, сложные интерфейсы.

Большинство проблем с мобильной версткой — это не баги браузеров и не недостатки CSS. Это следствие применения инструмента не по назначению: попытки построить двумерную сетку через Flexbox, использования фиксированных размеров там, где нужны гибкие единицы, или игнорирования box-sizing.

Когда понимаешь, что именно ты раскладываешь и по скольким осям — выбор между Flexbox и Grid становится очевидным. Если хочется углубиться в тему и выстроить понимание с нуля, курс «HTML/CSS» — один из разумных способов это сделать структурированно, а не методом проб и ошибок.

Войдите, чтобы поставить лайк и оставить комментарий.

Автор

$ sudo teach IT

HTML/CSS

Курс по теме

HTML/CSS

С нуля до своих сайтов на HTML и CSS. Никакой магии — просто теги, стили и твой первый опубликованный проект. Хватит гадать, почему всё разваливается — научись верстать так, чтобы было красиво и работало везде.

Бесплатно
Открыть курс

Продолжите обучение

Все курсы
Python – для начинающих!

Python – для начинающих!

С нуля до профессионального уровня. Подходит для всех. Учитесь каждый день и овладейте самым популярным языком программирования.

Перейти к курсу
Простыми словами о защищенном соединении

Простыми словами о защищенном соединении

Базовый курс для обычных людей: что такое защищённое соединение, как оно устроено, что оно умеет и чего не умеет, как выбрать сервис и настроить его на своих устройствах.

Перейти к курсу
Ботостроение Telegram

Ботостроение Telegram

Лёгкий, быстрый и доступный способ познакомиться с миром ботостроения в Telegram. Видео, конспекты, практика и помощь – всё у нас на курсе.

Перейти к курсу
Сервис, который не падает - как построить безопасную зашифрованную сеть

Сервис, который не падает - как построить безопасную зашифрованную сеть

Практический курс по безопасности сети: как собрать собственный сервис защищённого доступа - от пустого сервера до подписки с автовыбором - и, что важнее, как потом не уронить его своими руками.

Перейти к курсу

Другие статьи

FastAPI и фоновые задачи: когда лучше использовать BackgroundTasks, а когда очередь
fastapi

FastAPI и фоновые задачи: когда лучше использовать BackgroundTasks, а когда очередь

Поймём различия между синхронной обработкой, BackgroundTasks и внешними очередями. Разберём idempotency, ретраи и мониторинг фоновых процессов.

22 июля 2026 г.
980
TypeScript vs JavaScript: когда типы спасают проект, а когда мешают
typescript

TypeScript vs JavaScript: когда типы спасают проект, а когда мешают

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

16 июля 2026 г.
740
Создание Telegram бота в 2026 легко и просто! Полный курсы!
создание

Создание Telegram бота в 2026 легко и просто! Полный курсы!

19 июня 2026 г.
1431
Как выбрать, куда идти в IT: веб, боты, данные — без хаоса
выбрать

Как выбрать, куда идти в IT: веб, боты, данные — без хаоса

Разберём самые понятные направления для новичка (веб, боты, аналитика/данные) и чем они отличаются по шагам обучения. В конце вы получите простой план, как проверить, что вам подходит, и какой стартовый путь выбрать.

5 октября 2026 г.
580
Путь от README до демо: как собрать портфолио разработчика, чтобы его хотели смотреть
путь

Путь от README до демо: как собрать портфолио разработчика, чтобы его хотели смотреть

Разберём структуру репозитория, как упаковать проект в понятную историю (проблема → решение → запуск → метрики качества) и какие артефакты повышают доверие: скринкасты, архитектурная схема, чек-лист продакшн-готовности.

17 сентября 2026 г.
1090
Как понять, какой язык программирования учить первым: простой тест и выбор
понять

Как понять, какой язык программирования учить первым: простой тест и выбор

Помогу новичку выбрать первый язык без стресса: объясню варианты по целям (веб, боты, анализ данных), что учить в первую очередь и как не потратить месяцы впустую. В конце — краткий план старта на ближайшие недели.

2 октября 2026 г.
630

Комментарии

Станьте первым в обсуждении

Поделитесь мнением о статье или задайте вопрос автору

Содержание

Откуда вообще взялась путаницаОдно измерение против двухКогда использовать FlexboxНавигация и горизонтальные спискиКарточки с переменным содержимымЦентрирование элементовДинамические компоненты с неизвестным числом элементовКогда использовать GridРаскладка страницы целикомСетки карточекСложные дашборды и интерфейсыТипичные ошибки, из-за которых верстка ломается на мобильныхОшибка 1: фиксированные размеры вместо гибких единицОшибка 2: забытый min-width: 0 у flex-элементовОшибка 3: flex-wrap без учёта минимальной шириныОшибка 4: Grid без адаптации под мобильныеОшибка 5: вложенные флексы вместо GridМожно ли комбинировать Flexbox и Grid?Практический ориентир: как принять решениеВывод