Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между 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
- Выравнивание элементов в одной оси — навигация, меню, список кнопок
- Адаптивные одномерные макеты — карточки в ряд, которые переносятся
- Выравнивание по центру — Flexbox намного проще для центрирования
/* Идеальное центрирование */
.centered {
display: flex;
align-items: center;
justify-content: center;
height: 400px;
}
- Компоненты с неизвестным количеством детей — навигация, теги
- Равномерное распределение пространства — footer с элементами
.navbar {
display: flex;
justify-content: space-between; /* слева и справа */
align-items: center;
}
.navbar-items {
display: flex;
gap: 24px;
}
Когда использовать CSS Grid
- Сложные двумерные макеты — дизайн страницы, таблицы
- Точный контроль позиции элементов — размещение по сетке
- Макеты с явной структурой строк и колонок — шапка, сайдбар, основной контент
.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;
}
- Выравнивание элементов в обе стороны — галерея фото с точным размером
- Создание шаблонов областей — 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; }
Выравнивание элементов
| Свойство | Flexbox | Grid |
|---|---|---|
| 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 для компонентов внутри него.