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

Какое свойство задает одинаковые отступы между items внутри display: flex?

1.8 Middle🔥 181 комментариев
#HTML и CSS

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

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

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

Свойство gap в Flexbox для отступов между элементами

Свойство gap (раньше называлось grid-gap) — это один из самых полезных способов для создания одинаковых отступов между элементами внутри flex контейнера. Это избавляет от необходимости писать отдельные margin на каждый элемент.

Базовое использование gap

/* Самый простой способ */
.container {
  display: flex;
  gap: 1rem;
  /* Создаёт 1rem отступ между всеми элементами */
}

Это эквивалентно старому подходу через margin, но намного чище:

/* Старый способ (не рекомендуется) */
.container {
  display: flex;
}

.item {
  margin-right: 1rem;
}

.item:last-child {
  margin-right: 0; /* Убираем последний отступ */
}

/* Новый способ (правильно) */
.container {
  display: flex;
  gap: 1rem; /* Вот и всё! */
}

Различные направления и двумерные отступы

/* Одинаковый отступ по всем направлениям */
.flex-row {
  display: flex;
  gap: 1rem;
}

/* Отступ между строками при flex-wrap */
.flex-wrap {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
  /* 1rem между элементами горизонтально */
  /* 1rem между строками вертикально */
}

/* Разные отступы: строки и столбцы */
.custom-gap {
  display: flex;
  flex-wrap: wrap;
  row-gap: 2rem; /* Отступ между строками */
  column-gap: 1rem; /* Отступ между столбцами */
}

/* Сокращенно (row-gap column-gap) */
.custom-gap-short {
  display: flex;
  gap: 2rem 1rem;
}

Практические примеры

Навигационное меню

.navbar {
  display: flex;
  align-items: center;
  gap: 2rem;
  padding: 1rem;
}

.nav-item {
  /* Не нужен margin, gap справляется */
  color: white;
  cursor: pointer;
}

/* Результат: 2rem между каждым пунктом меню */

Сетка карточек с переносом

.cards-grid {
  display: flex;
  flex-wrap: wrap;
  gap: 1.5rem; /* Отступ между карточками */
  justify-content: center;
}

.card {
  width: 300px;
  /* Карточки равномерно распределены с отступами */
}

/* Без gap это было сложнее:
   нужно было считать ширину экрана и использовать margin-right */

Кнопка с иконкой и текстом

.button {
  display: flex;
  align-items: center;
  gap: 0.5rem; /* Небольший отступ между иконкой и текстом */
  padding: 0.75rem 1rem;
  border: none;
  border-radius: 4px;
  background-color: #007bff;
  color: white;
}

/* Без gap: нужен отдельный margin на иконку */
/* С gap: всё работает автоматически */

Column направление (вертикальная раскладка)

.form {
  display: flex;
  flex-direction: column;
  gap: 1rem;
  /* Отступ между полями формы */
}

.form-group {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}

label {
  /* Отступ между label и input */
}

input {
  padding: 0.5rem;
}

/* Результат: элементы красиво выстроены вертикально с отступами */

Адаптивные отступы (responsive gap)

.adaptive-container {
  display: flex;
  gap: 1rem;
  flex-wrap: wrap;
}

/* На мобильных экранах меньше отступ */
@media (max-width: 640px) {
  .adaptive-container {
    gap: 0.5rem;
  }
}

/* На планшетах нормальный отступ */
@media (min-width: 768px) {
  .adaptive-container {
    gap: 1rem;
  }
}

/* На десктопе больше отступ */
@media (min-width: 1024px) {
  .adaptive-container {
    gap: 2rem;
  }
}

Поддержка браузерами

/* Gap поддерживается всеми современными браузерами */
/* Chrome 84+, Firefox 63+, Safari 14.1+, Edge 84+ */

.flex-container {
  display: flex;
  gap: 1rem;
  
  /* Fallback для очень старых браузеров (если нужен IE11) */
  /* Используй margin-right + :not(:last-child) */
}

/* Для IE11 нужно использовать margin на элементы */

Сравнение способов создания отступов

/* СПОСОБ 1: Старый (через margin) */
.old-way .item {
  margin-right: 1rem;
}

.old-way .item:last-child {
  margin-right: 0;
}

/* СПОСОБ 2: Через gap (правильно) */
.new-way {
  display: flex;
  gap: 1rem;
}

/* СПОСОБ 3: Через margin с селектором */
.another-way .item:not(:last-child) {
  margin-right: 1rem;
}

/* gap — это идеальный способ! */

Реальный пример: React компонент

interface FlexListProps {
  items: string[];
  gap?: string;
  direction?: "row" | "column";
}

export function FlexList({ 
  items, 
  gap = "1rem", 
  direction = "row" 
}: FlexListProps) {
  return (
    <div 
      style={{
        display: "flex",
        flexDirection: direction,
        gap: gap,
        padding: "1rem"
      }}
    >
      {items.map((item, idx) => (
        <div key={idx} style={{ flex: 1 }}>
          {item}
        </div>
      ))}
    </div>
  );
}

/* Использование:
   <FlexList items={["Item 1", "Item 2", "Item 3"]} gap="2rem" />
*/

Best Practices

  1. Используй gap вместо margin — это чище и понятнее
  2. Комбинируй row-gap и column-gap для сложных макетов
  3. Помни о flex-wrap — gap работает для обеих осей
  4. Адаптируй gap на разных экранах — мобильные могут требовать меньше отступов
  5. gap работает и в Grid — не только в Flexbox

Свойство gap — это стандарт для создания отступов между элементами в flex и grid контейнерах. Это делает код чище и избавляет от граничных случаев с последними элементами.

Какое свойство задает одинаковые отступы между items внутри display: flex? | PrepBro