Ещё недавно вёрстка держалась на float и position, а адаптивный макет собирался часами. Сегодня практически любую страницу можно сверстать за вечер — если понимать, когда использовать Flexbox, а когда CSS Grid. Именно на этом вопросе спотыкаются почти все новички: кажется, что нужно выбрать один инструмент и учить только его.
На самом деле выбирать не придётся. Flexbox и Grid — не конкуренты, а два разных подхода к раскладке элементов. Разберём разницу на понятных примерах и выведем простое правило, которое поможет принимать решение за пару секунд.
Главное отличие: одно измерение против двух
Flexbox — это одномерная модель раскладки. Вы выстраиваете элементы либо в строку, либо в колонку и управляете их порядком, размерами и выравниванием вдоль этой оси. Даже если включить перенос строк (flex-wrap), логика остаётся прежней: элементы текут друг за другом по одной оси.
CSS Grid — двумерная модель. Вы описываете сетку из строк и столбцов и размещаете элементы сразу в двух измерениях, точно указывая, какую область занимает каждый блок.
Проще говоря:
- Flexbox отвечает на вопрос «как расположить элементы в ряд и как их выровнять между собой»;
- Grid отвечает на вопрос «как разбить страницу на области и распределить блоки по сетке».
Когда выбирать Flexbox
Flexbox идеален везде, где содержимое задаёт размеры, а не наоборот. Это «резиновые» интерфейсные элементы, которые должны подстраиваться под текст и количество пунктов.
Типичные задачи для Flexbox
- Шапка сайта: логотип слева, меню справа, кнопка на своём месте.
- Навигационное меню в строку с равными отступами между пунктами.
- Карточка: заголовок, описание и кнопка, прижатая к низу карточки.
- Строка «иконка + текст», где иконка всегда выровнена по центру строки.
- Центрирование блока по горизонтали и вертикали — буквально три свойства.
- Ряд кнопок, которые переносятся на новую строку на узких экранах.
Ещё одно преимущество: Flexbox хорошо работает с содержимым неизвестного размера. Если в блоке окажется длинный заголовок или пять кнопок вместо трёх, вёрстка не развалится — элементы просто перераспределятся.
Когда выбирать CSS Grid
Grid берут, когда у макета есть чёткая структура: колонки, боковые панели, области разной ширины. Здесь вы управляете всей картиной сразу, а не отдельными строками.
Типичные задачи для Grid
- Общий каркас страницы: шапка, боковая колонка, контент, подвал.
- Галерея или сетка карточек товаров с одинаковыми ячейками.
- Журнальная раскладка, где блоки занимают разное количество колонок и строк.
- Раскладка с наложением элементов друг на друга — когда двум блокам заданы одинаковые координаты области.
- Адаптивные сетки через repeat(auto-fit, minmax(…)) — без единого медиазапроса.
Ключевая сила Grid — жёсткая структура при гибком поведении. Вы один раз описываете сетку, а дальше просто говорите каждому блоку, какую область он занимает.
Как выбрать за десять секунд
Задайте себе три вопроса по порядку:
- Мне нужно выстроить элементы в один ряд или одну колонку? Берите Flexbox.
- У макета есть строки и столбцы одновременно? Берите Grid.
- Нужно, чтобы раскладку определяло содержимое? Снова Flexbox.
И ещё один ориентир. Если вы ловите себя на мысли «как бы это расположить по сетке» — скорее всего, вам нужен Grid. Если думаете «как выровнять эти элементы между собой» — Flexbox.
Сила в комбинации, а не в выборе
В реальных проектах оба инструмента работают вместе, и это нормально. Классический пример — сетка карточек:
- внешний контейнер — Grid: он раскладывает карточки по колонкам и сам подстраивается под ширину экрана;
- внутренняя часть карточки — Flexbox: она выравнивает заголовок, текст и кнопку по вертикали.
Такая связка встречается постоянно. Grid задаёт каркас и крупные области, Flexbox отвечает за мелочи внутри компонентов. Поэтому учить нужно оба, начиная с Flexbox — он проще и быстрее даёт результат.
Пример со страницей блога
Допустим, вы верстаете страницу блога. Общий макет — шапка, контент, сайдбар, подвал — собирается на Grid. Список статей в одной колонке — обычный поток. Карточка статьи с картинкой, заголовком и метаданными — Flexbox. Шапка — Flexbox. Пагинация — тоже Flexbox. Как видите, Grid на странице чаще всего один, а Flexbox используется повсюду.
Частые ошибки новичков
- Пытаться сверстать всю страницу на Flexbox. Технически возможно, но получится нагромождение вложенных контейнеров, которое тяжело поддерживать.
- Использовать Grid для одной строки. Если задача — выровнять три пункта меню, Grid избыточен.
- Забывать про min-width: 0 у flex-элементов. Без этого длинный текст или код может растянуть блок и сломать раскладку.
- Смешивать свойства без понимания осей. justify-content работает по главной оси, align-items — по поперечной; при смене flex-direction на column они меняются местами.
- Игнорировать gap. Отступы между элементами давно решаются одним свойством, без марджин-костылей.
Что учить первым
Начните с Flexbox: синтаксис короче, результат виден сразу, а большинство интерфейсных задач закрывается именно им. Освоив выравнивание, перенос строк и свойство flex, переходите к Grid. Там стоит разобраться с fr, repeat(), minmax() и именованными областями — этого достаточно для девяноста процентов макетов.
Дальше останется только практика: возьмите любой понравившийся сайт и попробуйте повторить его раскладку. Через пару таких упражнений выбор между Flexbox и Grid станет автоматическим.
Итог
Flexbox — для одномерных задач и выравнивания содержимого. Grid — для двумерных сеток и структуры страницы. Они не заменяют, а дополняют друг друга, и в современной вёрстке используются одновременно. Освойте оба — и вопрос «что использовать» перестанет вас мучить: ответ будет зависеть просто от формы макета.
Спасибо за пример с карточкой и кнопкой внизу. Я раньше прижимала кнопку через position absolute, а теперь поняла, что во Flexbox достаточно margin-top: auto. Стало заметно проще.
Не совсем понял про flex-wrap. Если элементы переносятся на новую строку, это всё ещё одномерная раскладка? Например, меню в шапке на узком экране — лучше flex-wrap или уже grid?
Ты правильно заметил: flex-wrap не делает раскладку двумерной, потому что строки не связаны в общую сетку. Если меню просто переносится и выравнивается по строке — бери flex. Если нужны строгие колонки и ряды — grid.
Собирала каркас блога на grid: шапка, сайдбар, контент, подвал. А внутри карточек уже использовала flex для строки с иконкой и текстом. Как в статье: grid для областей, flex для содержимого.
Я бы не сказал, что grid всегда только для чёткой структуры. Иногда проще сделать сетку карточек через grid с auto-fit, чем возиться с flex-wrap. Но общее правило про одно и два измерения верное.
Согласна, для одинаковых карточек grid с auto-fit реально удобнее. Я пришла к этому после того, как flex-wrap оставлял разную ширину в последнем ряду.
А если элемент должен занимать две колонки в grid, но внутри у него кнопки в ряд — тут комбинировать? Или можно всё сделать одним grid без flex внутри?
Понял главное: flex — про линию, grid — про карту. Забрал правило в заметки, буду пробовать на следующем макете.