Frontend

CSS без боли: как реально работают Flexbox и Grid

CSS без боли: как реально работают Flexbox и Grid

Если вы когда-либо пытались центрировать div с помощью margin: 0 auto или, упаси боже, использовали float: left для создания сеток, то вы знаете: верстка может превратиться в настоящий кошмар. Долгое время CSS напоминал попытку собрать пазл, где детали меняют форму, стоит вам изменить размер окна браузера.

Но сегодня у нас есть два мощных инструмента: Flexbox и CSS Grid. Проблема в том, что большинство туториалов объясняют их через сухие свойства (justify-content, align-items), не объясняя главного — логики.

В этой статье мы разберем, как перестать гадать, какое свойство прописать, и начать видеть структуру страницы как систему координат.

Почему мы вообще об этом говорим?

Раньше мы строили сайты на таблицах, потом на блоках с фиксированной шириной, затем пришли фреймворки вроде Bootstrap. Но все они пытались решить одну задачу: как распределить элементы на странице так, чтобы они не «разлетались» на разных экранах.

Flexbox и Grid — это не просто «новые свойства». Это разные философии управления пространством.

    • Flexbox — это про поток (одномерность).
    • Grid — это про каркас (двумерность).

Если вы пытаетесь сделать сетку сайта на Flexbox, вы, скорее всего, создаете лишние обертки-контейнеры. Если пытаетесь выровнять одну кнопку по центру с помощью Grid — вы используете кувалду, чтобы забить маленький гвоздь.

 

Flexbox: Магия одной оси

Главная ошибка новичков — думать, что flex просто «расставляет блоки в ряд». На самом деле, Flexbox работает по принципу главной и поперечной осей.

1. Понимаем оси (Main и Cross Axis)

Представьте, что внутри вашего контейнера проложена невидимая рельса. Это Main Axis (главная ось). По умолчанию она идет слева направо. Все, что касается justify-content, работает именно вдоль этой рельсы.

Cross Axis (поперечная ось) всегда перпендикулярна главной. Все, что начинается с align-, управляет элементами именно по этой оси.

Важный нюанс: если вы меняете flex-direction: column, ваши оси меняются местами! Теперь главная ось идет сверху вниз. Это тот момент, где у 90% разработчиков начинается «боль», потому что justify-content внезапно начинает двигать элементы по вертикали, а не по горизонтали.

2. Три кита Flexbox

Чтобы перестать путаться, запомните эти три концепции:

  1. Распределение пространства (justify-content): Это про то, как элементы «расталкивают» друг друга. space-between — прижать к краям, center — сгрудить в кучу посередине.
  2. Выравнивание (align-items): Это про то, как элементы ведут себя относительно высоты (или ширины) контейнера. Хотите, чтобы все блоки были одной высоты? Используйте stretch (он стоит по умолчанию).
  3. Гибкость (flex-grow, flex-shrink, flex-basis): Это самое сердце Flexbox.
    • flex-grow: 1 говорит элементу: «Забери всё свободное место, которое осталось».
    • flex-shrink определяет, кто первым «схлопнется», если места станет слишком мало.
    • flex-basis — это «желаемый» размер элемента до того, как начнется распределение свободного места.

Совет из практики: Вместо того чтобы писать три отдельных свойства, используйте сокращение flex: 0 1 auto. Это сэкономит время и сделает код чище.

 

CSS Grid: Архитектура и контроль

Если Flexbox — это река, по которой плывут элементы, то Grid — это шахматная доска. Здесь вы не просите элементы «распределиться», вы четко говорите: «Этот блок занимает две колонки и одну строку».

1. Сетка как фундамент

В Grid мы сначала создаем структуру (сетку), а потом раскладываем в неё контент. Это принципиально иной подход. Вы определяете grid-template-columns и grid-template-rows, создавая виртуальную таблицу.

2. Магия единицы fr (Fractional Unit)

Забудьте про проценты в Grid. Проценты коварны, потому что они не учитывают gap (отступы между колонками). Если вы поставите две колонки по 50% и добавите gap: 20px, ваш контент вылезет за пределы экрана.

Единица fr решает эту проблему. 1fr 2fr означает: «раздели всё доступное пространство на 3 части, первую отдай первому блоку, две остальные — второму». Это абсолютно безопасно и адаптивно.

3. Автоматизация с repeat() и minmax()

Самая мощная связка в современном CSS — это grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)).
Что это значит на человеческом языке?

    • «Создавай столько колонок, сколько влезет».
    • «Каждая колонка не может быть меньше 250px».
    • «Если места больше, растягивай их равномерно».

Результат: вы получаете адаптивную сетку без единого медиа-запроса (@media). Это буквально «святой грааль» верстки.

Когда и что использовать? (Шпаргалка)

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

  1. Нужно выровнять элементы в одну линию (меню, иконка с текстом, футер)? $\rightarrow$ Flexbox.
  2. Нужно создать сложный макет страницы (шапка, сайдбар, основной контент, подвал)? $\rightarrow$ Grid.
  3. Нужно, чтобы элементы переносились на новую строку, сохраняя свою независимость? $\rightarrow$ Flexboxflex-wrap: wrap).
  4. Нужно, чтобы элементы в разных строках были строго друг под другом (как в таблице)? $\rightarrow$ Grid.

Практические советы, чтобы не «сломать» верстку

Чтобы ваш код не превратился в кашу, придерживайтесь следующих правил:

  1. Не злоупотребляйте вложенностью. Если вы видите, что для центрирования одного элемента вам нужно создать три обертки div, значит, вы используете инструмент неправильно. Попробуйте Grid или проверьте align-items во Flexbox.
  2. Используйте gap вместо margin. Раньше мы мучились с :last-child { margin-right: 0 }. Теперь свойство gap работает и в Grid, и в большинстве современных браузеров во Flexbox. Это самый чистый способ задать расстояние между элементами.
  3. Инспектируйте через DevTools. В Chrome и Firefox есть специальные кнопки (маленькие значки «grid» и «flex» рядом с элементами в инспекторе). Нажмите на них, и браузер нарисует вам линии осей и сетки прямо на странице. Это лучший способ понять, почему ваш блок улетел куда-то влево.
  4. Не забывайте про box-sizing: border-box. Это база. Без этого свойства любые внутренние отступы (padding) будут увеличивать размер блока, и ваша идеальная сетка поплывёт.

Заключение

CSS перестал быть «угадайкой». Разница между Flexbox и Grid заключается в векторе мышления: линейность против плоскости.

Flexbox идеален для микро-разметки и простых списков. Grid незаменим для макро-разметки всей страницы. Когда вы перестанете воспринимать их как набор команд и начнете видеть оси и ячейки, верстка перестанет быть «болью» и станет просто сборкой конструктора.

Главное — не пытайтесь выучить все свойства наизусть. Поймите принцип работы осей и единицы fr, и вы обнаружите, что 90% ваших задач решаются тремя-четырьмя строками кода. Практикуйтесь, экспериментируйте в DevTools, и помните: если что-то не центрируется — скорее всего, вы просто перепутали главную ось с поперечной.