Flexbox в реальных интерфейсах

Flexbox редко используется сам по себе. В реальной верстке он помогает решать конкретные задачи: выровнять элементы, разнести их по краям, занять свободное пространство, прижать блок к нижней части контейнера или разрешить элементам переноситься.

При этом один и тот же интерфейсный паттерн можно реализовать разными способами. Поэтому важно не просто знать свойства Flexbox, а понимать, какую задачу каждое из них решает.

В этой статье разберем несколько небольших приемов, которые постоянно встречаются в интерфейсах.

Прижать элемент к правому краю

Представим небольшую панель:

<div class="toolbar">
  <span>Документы</span>

  <button>Создать</button>
</div>

Нужно, чтобы заголовок находился слева, а кнопка — справа.

Один из вариантов:

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

space-between распределяет свободное пространство между элементами.

Но иногда в интерфейсе нужно прижать к правому краю не последний элемент, а целую группу элементов.

Например:

<div class="toolbar">
  <span>Документы</span>

  <div class="actions">
    <button>Фильтр</button>
    <button>Создать</button>
  </div>
</div>

Здесь можно использовать:

.toolbar {
  display: flex;
}

.actions {
  margin-left: auto;
}

margin-left: auto забирает всё доступное свободное пространство слева от .actions.

В результате группа действий оказывается у правого края.

Когда использовать space-between, а когда margin: auto

Оба варианта могут дать похожий визуальный результат:

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

и:

.toolbar {
  display: flex;
}

.actions {
  margin-left: auto;
}

Но смысл у них разный.

justify-content: space-between распределяет пространство между всеми flex-элементами.

margin-left: auto забирает пространство конкретным элементом или группой.

Элемент занимает оставшееся пространство

Другой распространенный паттерн — когда один элемент должен занять всё доступное пространство между другими.

Например:

<div class="search">
  <button>Назад</button>
  <input type="search" placeholder="Поиск">
  <button>Найти</button>
</div>

Нам не нужно задавать полю конкретную ширину.

Можно позволить ему занять всё оставшееся пространство:

.search {
  display: flex;
  gap: 12px;
}

.search input {
  flex: 1;
}

Теперь поле будет увеличиваться и занимать доступное место между кнопками.

Если контейнер станет шире — поле увеличится.

Если контейнер станет уже — поле уменьшится, пока это позволяют остальные ограничения.

Несколько элементов делят пространство поровну

flex: 1 можно использовать не только для одного элемента.

Например:

<div class="columns">
  <div class="column">Первый</div>
  <div class="column">Второй</div>
  <div class="column">Третий</div>
</div>
.columns {
  display: flex;
  gap: 20px;
}

.column {
  flex: 1;
}

Теперь все три элемента получают одинаковую долю доступного пространства.

Если контейнер станет шире или уже, размеры колонок будут изменяться вместе с ним.

Если одному элементу нужна большая доля:

.column:first-child {
  flex: 2;
}

Теперь первый элемент получит большую часть доступного пространства.

Прижать элемент к низу карточки

Flexbox особенно полезен внутри вертикальных компонентов.

Представим условную карточку:

<article class="card">
  <h2>Название</h2>

  <p>
    Какой-то текст карточки.
  </p>

  <a href="#">Подробнее</a>
</article>

Если у разных карточек разное количество текста, кнопки или ссылки могут оказаться на разной высоте.

Карточку можно превратить во flex-контейнер:

.card {
  display: flex;
  flex-direction: column;
}

А элемент, который нужно прижать к низу, получить:

.card__link {
  margin-top: auto;
}

Автоматический верхний отступ заберет всё свободное вертикальное пространство.

В результате ссылка окажется в нижней части карточки.

Выровнять элементы внутри строки

Flexbox часто нужен не для распределения пространства, а просто для аккуратного выравнивания нескольких элементов.

Например:

<div class="user">
  <img src="avatar.jpg" alt="">
  <span>Иван Иванов</span>
</div>

Можно написать:

.user {
  display: flex;
  align-items: center;
  gap: 12px;
}

Теперь аватар и имя находятся в одной flex-линии и выровнены по поперечной оси.

gap отвечает за расстояние между ними.

При этом не нужно использовать дополнительные margin, относительное позиционирование или другие приемы только ради вертикального выравнивания.

Группа элементов с одинаковым расстоянием

Еще одна типичная задача — расположить несколько элементов рядом с одинаковым расстоянием.

Например:

<div class="actions">
  <button>Изменить</button>
  <button>Удалить</button>
  <button>Отменить</button>
</div>

Вместо:

button {
  margin-right: 12px;
}

можно использовать:

.actions {
  display: flex;
  gap: 12px;
}

Теперь расстояние между элементами контролируется контейнером.

Это особенно удобно, если количество элементов может измениться.

Заключение

Flexbox встречается в самых разных частях интерфейса — от небольших групп кнопок до сложных компонентов.

Главное — не запоминать готовые комбинации свойств, а понимать, как элементы должны располагаться и как между ними должно распределяться пространство. Тогда подходящий инструмент Flexbox обычно находится сам.

предыдущий пост