0

Как задать минимальный отступ между элементами flexbox?

26

Описание проблемы

У меня есть следующий CSS-код:

div.container {
  display: flex;
  flex-flow: row wrap;
  justify-content: space-between;
  border: 1px solid blue;
}
div.container div {
  width: 200px;
  border: 1px solid gray;
  display: inline-block;
  text-align: center;
}

В этом макете первый элемент в каждой строке выравнен по левому краю, а последний — по правому, что соответствует требованиям.

Когда я уменьшаю ширину окна браузера, распределённые элементы <div> сдвигаются ближе друг к другу, пока они не «соприкоснутся». В этот момент они перестраиваются в новую строку. Снова первый <div> в каждой строке выравнен по левому краю, а последний — по правому, при этом между ними остаётся промежуток.

Однако возникает вопрос: возможно ли установить минимальное расстояние между внутренними <div>, чтобы они всегда имели зазор между собой?

Я предполагаю, что padding и margin в данном случае не подойдут, так как это нарушит текущее выравнивание:

<-- 1-й слева в строке    и    последний справа в строке -->

Если у вас есть какие-либо предложения или решения, буду признателен!

5 ответ(ов)

0

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

Основная идея заключается в том, что у вас есть минимальное расстояние x. Вы устанавливаете левый и правый отступы каждого элемента по x/2, так что расстояние между элементами будет равно x (отступ + отступ). Затем вы оборачиваете все элементы в контейнер с левым и правым отступами -x/2. Это скроет отступ у элементов на краях каждой строки.

Вот рабочий пример:

.box {
  border: 1px solid black;
  overflow-x: hidden;
}

.container {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  margin: 0 -1em;
}

.item {
  display: flex;
  border: 1px solid grey;
  padding: 1em;
  width: 20%;
  margin: 0 1em;
}
<div class="box">
  <div class="container">
    <div class="item">1</div>
    <div class="item">2</div>
    <div class="item">3</div>
    <div class="item">4</div>
    <div class="item">5</div>
  </div>
</div>

Свойство overflow-x: hidden; у .box предотвращает появление горизонтальной полосы прокрутки, которая появляется в некоторых браузерах из-за переполнения отступом.

Если вы хотите, чтобы расстояние всегда оставалось одинаковым, и чтобы строки с одним элементом занимали всю ширину строки, вы можете добавить flex-grow: 1 к .item.

0

Вы можете добавить еще один div с стилем flex, чтобы удерживать необходимый зазор между внутренними div. Для минимальной ширины этого зазора используйте следующее свойство (как упомянуто на W3Schools.com):

flex: flex-grow flex-shrink flex-basis|auto|initial|inherit;

При этом flex-shrink обозначает:

flex-shrink: Число, указывающее, насколько элемент будет сжиматься относительно остальных гибких элементов.

Таким образом, например, если вы зададите этот CSS-код для gap div:

flex: 1 0 10px;

это будет означать, что gap div будет иметь ширину 10px и будет расти относительно остальных гибких элементов, но не будет сжиматься. Таким образом, минимальная ширина зазора составит 10px даже при минимальной ширине экрана.

0

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

Я предлагаю использовать calc, width и медиа-запросы для решения этой задачи. Да, это требует немного работы, но, на мой взгляд, этот подход визуально выглядит аккуратно.

.main{
  display:         flex;
  justify-content: space-between;
  flex-wrap:       wrap;
}
.main > div{
  width: 100%;
  height: 125px;
  border: 1px solid red;
}

@media (min-width: 576px) {
  .main > div{
    width: calc(100% / 2 - 5px);
    margin-bottom: 5px;
  }
}
@media (min-width: 992px) {
  .main > div{
    width: calc(100% / 3 - 5px);
  }
}
@media (min-width: 1140px) {
  .main > div{
    width: calc(100% / 6 - 5px);
    margin-bottom: 0;
  }
}
<div class="main">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
</div>

Для нужных брейкпоинтов я вычисляю ширину, которую хочу задать для div, и вычитаю пространство, которое хочу оставить между ними.

Надеюсь, это поможет кому-то, и я объяснил все достаточно понятно.

С уважением.

0

Вы также можете использовать функцию clamp вместе с свойством gap, чтобы эффективно задать минимальное и максимальное значение отступов. В приведенном ниже примере отступы останавливаются на 4px и увеличиваются до 64px. Более удобно протестировать изменение размеров на сайте https://jsfiddle.net/90wxsp5a/.

ul {
    display: inline-flex;
    padding: 0;
    list-style: none;
    gap: clamp(4px, 1vw, 64px);
}

li {
    border: 1px solid gray;
    padding: 5px;
}
<!-- Уменьшите окно/панель, чтобы увидеть, как это работает -->

<ul>
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
</ul>

Таким образом, с помощью clamp вы можете динамически управлять промежутками между элементами списка в зависимости от размера окна.

0

Вопрос: Как задать фиксированное пространство между элементами с использованием flexbox?

Ответ: Задание flex-basis в процентах также решит эту задачу. В этом случае минимальное пространство между элементами также будет в процентах. Например, если у вас есть 3 элемента и вы зададите flex: 0 0 30%, то будет оставаться фиксированное пространство в 10%, распределенное между элементами. Если у вас 6 элементов, можно использовать flex: 0 0 15% и так далее.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь