← Назад к вопросам

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

1.0 Junior🔥 281 комментариев
#HTML и CSS

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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

Flexbox (Flexible Box Layout) — это мощная CSS система раскладки, предназначенная для распределения пространства и выравнивания элементов в одном измерении (строка или столбец). Это один из самых полезных инструментов современного веб-дизайна.

Основные случаи использования

1. Выравнивание элементов в строке

<nav class="navbar">
  <div class="logo">Logo</div>
  <ul class="menu">
    <li><a href="/">Home</a></li>
    <li><a href="/about">About</a></li>
    <li><a href="/contact">Contact</a></li>
  </ul>
  <button class="auth">Login</button>
</nav>
.navbar {
  display: flex;
  justify-content: space-between; /* Logo слева, menu посередине, Login справа */
  align-items: center;             /* Все элементы выравнены по центру по высоте */
  padding: 1rem;
}

.menu {
  display: flex;
  gap: 2rem; /* Промежуток между пунктами меню */
  list-style: none;
}

Преимущества:

  • Легко выравнивать элементы
  • Не нужны float'ы или absolute positioning
  • Гибкое распределение пространства

2. Создание макета карточек

<div class="cards-container">
  <div class="card">
    <img src="image.jpg" />
    <h3>Card Title</h3>
    <p>Description...</p>
    <button>Action</button>
  </div>
  <!-- Много карточек... -->
</div>
.cards-container {
  display: flex;
  flex-wrap: wrap;      /* Переносит на новую строку при нехватке места */
  gap: 1rem;            /* Промежуток между карточками */
  justify-content: center; /* Центрирует карточки */
}

.card {
  flex: 0 1 300px;      /* flex-grow: 0, flex-shrink: 1, flex-basis: 300px */
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

.card button {
  margin-top: auto;     /* Кнопка внизу карточки */
}

3. Центрирование контента (классическая задача)

/* Центрирование по обоим осям */
.modal {
  display: flex;
  justify-content: center;  /* По горизонтали */
  align-items: center;      /* По вертикали */
  width: 100%;
  height: 100vh;
}

.modal-content {
  width: 500px;
  background: white;
  padding: 2rem;
}

Это намного проще, чем:

/* ❌ Старый способ с absolute */
.modal {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

4. Панель с инструментами (toolbar)

<div class="toolbar">
  <button>Save</button>
  <button>Edit</button>
  <button>Delete</button>
  <div class="spacer"></div> <!-- Промежуток -->
  <button>Settings</button>
</div>
.toolbar {
  display: flex;
  gap: 0.5rem;
  padding: 1rem;
  background: #f5f5f5;
}

.spacer {
  flex: 1; /* Занимает все свободное место */
}

5. Боковая панель + основной контент

<div class="layout">
  <aside class="sidebar">
    <!-- Меню или навигация -->
  </aside>
  <main class="content">
    <!-- Основной контент -->
  </main>
</div>
.layout {
  display: flex;
  height: 100vh;
}

.sidebar {
  flex: 0 0 250px;  /* Фиксированная ширина 250px */
  background: #333;
  overflow-y: auto;
}

.content {
  flex: 1;          /* Займет оставшееся место */
  overflow-y: auto;
}

6. Список элементов в столбец

<ul class="todo-list">
  <li class="todo-item">
    <input type="checkbox" />
    <span>Task 1</span>
    <button>Delete</button>
  </li>
  <!-- Больше элементов... -->
</ul>
.todo-list {
  display: flex;
  flex-direction: column;  /* Элементы в столбец */
  gap: 0.5rem;
  list-style: none;
}

.todo-item {
  display: flex;
  align-items: center;     /* Выравнивание по центру */
  gap: 1rem;
  padding: 0.5rem;
  background: #f9f9f9;
  border-radius: 4px;
}

.todo-item span {
  flex: 1;                 /* Займет все свободное место */
}

7. Адаптивные макеты (responsive)

.responsive-layout {
  display: flex;
  flex-wrap: wrap;  /* Переносит элементы на новую строку */
  gap: 1rem;
}

.responsive-item {
  flex: 1 1 200px;  /* Минимум 200px, затем равномерное расширение */
}

/* На мобильных - полная ширина */
@media (max-width: 768px) {
  .responsive-item {
    flex: 1 1 100%;   /* На всю ширину */
  }
}

Ключевые свойства Flexbox

/* На контейнере */
.flex-container {
  display: flex;
  
  /* Направление: row (по умолчанию), column, row-reverse, column-reverse */
  flex-direction: row;
  
  /* Переносить ли элементы на новую строку */
  flex-wrap: wrap;
  
  /* Выравнивание по главной оси */
  justify-content: center;  /* flex-start, flex-end, center, space-between, space-around, space-evenly */
  
  /* Выравнивание по побочной оси */
  align-items: center;      /* flex-start, flex-end, center, stretch, baseline */
  
  /* Выравнивание строк (если flex-wrap: wrap) */
  align-content: center;    /* то же, что justify-content */
  
  /* Промежуток между элементами */
  gap: 1rem;                /* или row-gap / column-gap */
}

/* На элементах */
.flex-item {
  /* Увеличение при наличии свободного места */
  flex-grow: 1;
  
  /* Уменьшение при нехватке места */
  flex-shrink: 1;
  
  /* Базовый размер */
  flex-basis: 100px;
  
  /* Краткая запись: flex: grow shrink basis */
  flex: 1 1 100px;
  
  /* Выравнивание отдельного элемента */
  align-self: flex-end;
}

Когда НЕ использовать Flex

Используй Grid вместо Flex когда:

/* ❌ Двумерный макет - лучше Grid */
.grid-layout {
  display: flex;
  flex-wrap: wrap;
  /* Сложно выравнивать столбцы */
}

/* ✅ Правильно - Grid для двумерных макетов */
.grid-layout {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1rem;
}

Практические шпаргалки

Центрирование чего-либо:

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

Максимальное использование пространства:

.expand {
  display: flex;
  flex: 1;
}

Распределение элементов:

.spread {
  display: flex;
  justify-content: space-between;
}

Вертикальный стек с равномерным расширением:

.vstack {
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

.vstack > * {
  flex: 1;
}

Flexbox — это фундаментальный инструмент современного веб-дизайна. Он решает 80% задач раскладки элементов и значительно упрощает создание адаптивных интерфейсов.