
CSS Grid Layout: полное руководство с примерами
ДБ
Дмитрий Борисенко
· 3 минуты чтения
CSS Grid Layout — двумерная система вёрстки. Flexbox раскладывает элементы по одной оси, а Grid позволяет работать одновременно и со строками, и с колонками. Именно поэтому на нём собирают макеты страниц целиком.
Базовый grid-контейнер
Чтобы создать grid-контейнер, достаточно применить к элементу display: grid:
Так мы получаем сетку из трёх равных колонок и двух строк с заданной высотой.
Grid Template Areas
Именованные области (template areas) — самая наглядная часть CSS Grid:
Такую сетку быстрее построить мышью в генераторе CSS Grid и забрать готовый код, чем подбирать значения вслепую.
Адаптивная сетка с auto-fit и minmax
Создавайте адаптивные сетки без медиазапросов:
Это создаёт адаптивную галерею, в которой элементы автоматически переносятся на новые строки по мере необходимости.
auto-fit или auto-fill — что выбрать
Разница проявляется ровно в одном случае, когда элементов меньше, чем помещается колонок. В остальных ситуациях они ведут себя одинаково, поэтому подмену легко не заметить. До того дня, когда в галерее останется две карточки.
auto-fillсохраняет пустые колонки. Две карточки в сетке на четыре колонки останутся узкими и прижмутся влево, а оставшиеся две колонки просто пустуют.auto-fitсхлопывает пустые колонки до нуля. Те же две карточки растянутся и займут всю ширину.
Практическое правило. Для галерей и карточек берите auto-fit, растянуться
обычно лучше, чем оставить дыру. auto-fill пригодится, когда ширина элемента
принципиальна и растягивать его нельзя.
И ещё одна ловушка. minmax(250px, 1fr) вылезет за узкий экран, если контейнер
уже 250px. Страхует от этого min():
Продвинутое размещение элементов
Управляйте расположением элементов с точностью до дорожки:
Здесь нужно сразу поймать одну вещь, на которой спотыкаются все. Числа в
grid-column — это номера линий, а не колонок. Линии — границы между дорожками,
и в сетке из трёх колонок их четыре.
Поэтому grid-column: 1 / 3 занимает две колонки (от линии 1 до линии 3), а не
три.
Неявная и явная сетка
CSS Grid автоматически создаёт дорожки, когда это необходимо:
Практический пример: макет дашборда
Вот полноценный макет дашборда на CSS Grid:
Почему .card.wide ломает эту раскладку
В коде выше есть мина, которая срабатывает не на мобильном, а на планшете, где-то между 769px и 1050px. Разберём, потому что ошибка типовая.
Колонки nav и sidebar съедают 450px фиксированной ширины. На экране 800px
центральной колонке остаётся около 300px, и в auto-fit, minmax(200px, 1fr)
помещается одна колонка. А карточка .wide требует grid-column: span 2, то
есть двух колонок, которых нет. Grid покорно создаёт неявную вторую колонку, и
дашборд уезжает за край экрана.
Медиазапрос на 768px не спасает, поломка живёт выше его порога.
Лечится это контейнерным запросом, а не медиазапросом по ширине окна. Растягивать карточку надо тогда, когда места хватает у самого контейнера, а не у экрана.
Общее правило. span N всегда рискует создать неявную колонку. Если не уверены,
что колонок хватит, значением по умолчанию делайте span 1, а растягивание
включайте отдельно.
Выравнивание в сетке
Управляйте выравниванием как всей сетки, так и отдельных элементов:
Subgrid
Subgrid работает во всех основных браузерах с 2023 года, это Baseline, и относиться к нему как к экзотике больше не нужно.
Он решает конкретную боль: у вложенных карточек не выравниваются внутренности. Заголовки съезжают, потому что каждая карточка сама себе сетка и ничего не знает о соседях. Subgrid заставляет дочернюю сетку жить по дорожкам родителя:
Теперь заголовки всех карточек стоят на одной линии, тексты на одной, кнопки прибиты к низу. Раньше ради этого приходилось задавать фиксированные высоты.
Важная деталь. subgrid наследует дорожки родителя, а вот gap можно
переопределить, дочерняя сетка не обязана повторять отступы родительской.
Что учитывать на практике
- Grid берут под двумерные макеты, когда нужно управлять и строками, и колонками.
- Общий макет собирайте на Grid, а внутреннюю структуру компонентов на Flexbox.
- Начинайте с мобильной раскладки и достраивайте её для больших экранов.
- Размещение в сетке не отменяет семантики, теги выбирайте по смыслу.
- Fallback для старых браузеров закладывайте, только если он вам действительно нужен.
Grid снял с вёрстки почти всё, ради чего раньше держали флоаты и позиционирование. Макет теперь описывается там же, где и рисуется, а не собирается из обходных приёмов.
CSS Grid генератор
Визуальный генератор CSS Grid: постройте адаптивную сетку без кода и скопируйте результат в CSS или Tailwind.
Попробовать



