Вариант 1 – отрицательный отступ для родительского блока
Самый простой способ установить минимальное расстояние между элементами flexbox – используем margin: 0 5px
для дочерних элементов .item
и отрицательный отступ margin: 0 -5px
для родительского контейнера .box
.
CSS
.box { display: flex; margin: 0 -5px; } .item { flex: 1 1 auto; margin: 0 5px; }
HTML
<div class='box'> <div class='item'></div> <div class='item'></div> <div class='item'></div> <div class='item'></div> </div>
See the Pen NWGKWGJ by Denis (@deniscreative) on CodePen.dark
Вариант 2 – без отрицательного отступа с отступами по бокам
Не используем отрицательные отступы и не используем :first-child/:last-child
. Задаем внутреннее поле для контейнера padding:5px
и задаем отступы для дочерних элементов margin:5px
. Таким образом мы получаем равномерный отступ 10px
между дочерними элементами и от дочерних элементов до контейнера.
CSS
.box { display: flex; padding: 0 5px; } .item { flex: 1 1 auto; margin: 0 5px; }
HTML
<div class='box'> <div class='item'></div> <div class='item'></div> <div class='item'></div> <div class='item'></div> </div>
See the Pen Uniform distribution of blocks with flex 2 by Denis (@deniscreative) on CodePen.dark
Вариант 3 – фиксированная ширина с помощью calc()
Задаем фиксированную ширину для дочерних элементов с учетом отступа между ними с помощью CSS функции calc()
. Данный способ не совсем хорош для размещения флексбокс-элементов в несколько рядов, потому что элементы растягиваются по краям контейнера justify-content: space-between
.
CSS
.box { display: flex; flex-wrap: wrap; justify-content: space-between; } .item { width: calc(1/3*100% - (1 - 1/3)*10px); margin: 0 0 10px; }
где 1/3 – это 3 колонки в ряд, и 10px – это ширина между колонками.
HTML
<div class='box'> <div class='item'></div> <div class='item'></div> <div class='item'></div> <div class='item'></div> </div>
See the Pen Uniform distribution of blocks with flex 3 by Denis (@deniscreative) on CodePen.dark
Вариант 4 – фиксированная ширина с помощью calc() с отступами по бокам
Задаем фиксированную ширину для дочерних элементов с учетом отступа между ними с помощью CSS функции calc()
. Но главное отличие от предыдущего варианта, что для дочерних элементов .item
заданы отступы по бокам, а для родительского контейнера .box
заданы отрицательные отступы как в первом примере. И таким образом, мы можем задать justify-content: flex-start;
чтобы flexbox-элементы располагались равномерно слева направо.
Я чаще всего использую этот вариант, как наиболее универсальный и удобный для размещения любых flexbox-элементов.
CSS
.box { display: flex; flex-wrap: wrap; justify-content: flex-start; margin: 0 -5px; } .item { width: calc(1/3*100% - 10px); margin: 5px; }
где 1/3 – это 3 колонки в ряд, и 10px – это ширина между колонками.
HTML
<div class='box'> <div class='item'></div> <div class='item'></div> <div class='item'></div> <div class='item'></div> </div>
See the Pen Uniform distribution of blocks with flex 4 by Denis (@deniscreative) on CodePen.dark
Естественно, что способов для того, чтобы задать отступы между флексбокс-элементами или для их равномерного размещения внутри контейнера, гораздо больше, и есть гораздо более изощренные варианты. Но я привел наиболее часто используемые способы и самые простые для понимания.
Как много верстальщиков “сломало головы” при позиционировании элементов за все время активного развития сети Интернет!
Задачи из серии “расставить горизонтально три одинаковых (или разных) по ширине блока” или “позиционировать 2 блока по краям родительского, да еще и чтобы контент был центрирован по вертикали” отняли немало времени и нервов многих создателей веб страниц.
С стремительным появлением всевозможных девайсов ситуация только усугубилась. Ведь теперь сайты, созданные лишь для просмотра на десктопе никому не нужны. Страница должна одинаково хорошо отображаться на всех возможных устройствах (ну или как минимум на самых популярных).
Когда-то при верстке веб-страниц вообще использовались таблицы. Поверьте, в Интернете до сих пор полно таких сайтов.
Позиционирование при помощи float имеет немало “подводных камней” и может создать для верстальщика новые проблемы.
Свойство position: absolut также не обладает нужной гибкостью, ведь контент с данным свойством просто “выпадает” из общего потока.
Наверняка многие из вас являются поклонниками технологии Bootstrap, которая действительно легко решает многие проблемы позиционирования блоков (и не только). Однако не всегда есть возможность интегрировать ее в проект.
Сегодня речь пойдет о позиционировании FlexBox.
Если вы читаете этот паблик, то вероятно слышали о данной технологии, а возможно и пытались в ней разобраться.
Не важно по каким причинам вам это не удалось, сегодня мы рассмотрим FlexBox позиционирование так, что вы его полюбите и никогда уже больше не вспомните о float (разве что для обтекания текстом картинки).
Сразу небольшая оговорка. Я не буду рассказывать в этой статье о всех возможностях FlexBox – о них вы узнаете из последующих постов. Здесь мы раз и навсегда разберемся с позиционированием блоков. Вы увидите всю гибкость и бесспорные плюсы такого подхода.
Итак поехали!
Понимание Flex позиционирования
Для понимания Flex позиционирования будем использовать простейшую разметку.
Создадим div, который будет являться контейнером. Внутри него будут еще 4 div, каждый разного цвета. Так вы сможете все увидеть наглядно.
<div class="container"> <div class="red"></div> <div class="green"></div> <div class="blue"></div> <div class="purple"></div> </div>
Зададим минимальные стили. Ширину и высоту для контейнера, а также высоту, ширину и цвет для внутренних элементов, чтобы их было видно.
.container { height: 200px; width: 100%; } .red { background-color: red; width: 100px; height: 100px; } .green { background-color: green; width: 100px; height: 100px; } .blue { background-color: blue; width: 100px; height: 100px; } .purple { background-color: purple; width: 100px; height: 100px; }
Вот, что мы увидим:
Чтобы расставить элементы горизонтально, достаточно div с классом container прописать свойство display: flex.
.container { height: 200px; width: 100%; display: flex; }
Добавив всего одну строчку кода, мы получим нужный результат.
Расстояние между flex элементами
Мы добились того, что элементы расположились горизонтально и увидели, что сделать это очень просто.
Однако сейчас наши квадратики прилипли друг к другу. Давайте поговорим о распределении элементов и расстоянии между ними.
Для управления расстоянием между элементами используется css свойство justify-content.
Это свойство также применяется к блоку-контейнеру и может принимать следующие значения:
- flex-start – элементы расположены друг за другом начиная с начала контейнера (оно применяется по умолчанию и соответствует виду из изображения выше);
- flex-end – элементы расположены друг за другом и смещены к концу контейнера;
- center – элементы расположены друг за другом и центрированы;
- space-between – элементы равномерно распределены от начала до конца контейнера с отступами между друг-другом;
- space- around – элементы равномерно расположены от начала до конца контейнера с отступами между друг-другом, а также от краев контейнера.
justify-content: flex-end
justify-content: center
justify-content: space-between
justify-content: space-around
Теперь мы умеем распределять элементы по горизонтали.
Однако FlexBox технология также дает возможность выравнивать их и по вертикали.
Чтобы увидеть, как это происходит, зададим нашему контейнеру рамку.
.container { height: 200px; width: 600px; display: flex; justify-content: space-around; border: 2px solid #ccc; }
Для выравнивания flex элементов по вертикали используется свойство align-items, которое применяется к контейнеру.
Здесь мы можем задать следующие значения:
- flex-start – значение по умолчанию, элементы выравниваются по верхней границе контейнера;
- flex-end – элементы выравниваются по нижней границе контейнера;
- center – элементы выравниваются по середине контейнера.
align-items: flex-start
align-items: flex-end
align-items: center
Направление flex-элементов
Кроме всего прочего мы можем задать направление для flex-элементов при помощи flex-direction.
Свойство может принимать следующие значения:
- row – слева направо (по умолчанию);
- row-reverse – справа налево;
- column – сверху вниз;
- column-reverse – снизу вверх.
flex-direction: row-reverse;
flex-direction: column
flex-direction: column-reverse
Многострочность flex-контейнера
Сейчас у нас всего 4 элемента в контейнере, но их может быть и больше. FlexBox дает нам возможность определять, как следует поступать с элементами: ужимать их и размещать в одной строке или переносить на следующие строки.
За это отвечает свойство контейнера flex-wrap.
Оно может принимать следующие значения:
- nowrap – элементы в одной строке, если не помещаются в контейнер, то выходят за его границы (стоит по умолчанию);
- wrap – элементы переносятся на следующие строки, если не помещаются в одну;
- wrap-reverse – похоже на wrap, только в обратном направлении.
Чтобы посмотреть, как это работает, давайте добавим в нашу верстку побольше элементов, например, еще 8.
Итак, если мы не зададим свойство flex-wrap или зададим его со значением nowrap, то получим такой результат.
.container { height: 200px; width: 600px; display: flex; justify-content: space-around; border: 2px solid #ccc; flex-wrap: nowrap; }
flex-wrap: nowrap;
При значении flex-wrap: wrap увидим следующую картину:
flex-wrap: wrap;
Если зададим flex-wrap: wrap-reverse, то получим вот что:
flex-wrap: wrap-reverse;
Выравнивание многострочного контента внутри контейнера
Мы можем определять положение многострочного контента внутри контейнера по вертикальной оси (если элементы расположены горизонтально).
Например, можно позиционировать его вверху, внизу, в середине, по всему контейнеру (первая и последняя строки прижаты к краям), по всему контейнеру (с равным расстоянием между строками и краями), а также растягивая элементы по всей возможной области (если элементам не задана высота).
Отвечает за такое выравнивание свойство align-content.
Принимает следующие значения:
ачения:
- flex-start (по умолчанию);
- flex-end
- center
- space-between
- space-around
- stretch (если элементам задана высота, то будет проигнорировано).
Для большей наглядности я увеличу высоту нашего контейнера, а в верстке оставлю 8 элементов.
У контейнера в итоге будут следующие стили:
.container { height: 400px; width: 600px; display: flex; border: 2px solid #ccc; flex-wrap: wrap; align-content:flex-start; }
Вы можете видеть align-content:flex-start – значение по умолчанию. Давайте менять его и смотреть, что получится:
align-content: flex-start;
align-content:flex-end;
align-content: center;
align-content: space-between
align-content: space-around;
align-content: stretch;
Сегодня мы поговорили о FlexBox стилях для элемента контейнера и вы уже могли увидеть, как много возможностей для позиционирования у нас появилось. Причем реализуется это буквально парой строчек кода.
В следующей статье я расскажу вам о flex-стилях для самих элементов и тогда вы действительно ощутите всю мощь FlexBox.
Чтобы поскорее к нему привыкнуть, начните использовать его прямо сейчас. Это здорово облегчит вам жизнь )) До связи.
With flexbox, creating gutters is a pain, especially when wrapping is involved.
You need to use negative margins (as shown in the question):
#box {
display: flex;
width: 100px;
margin: 0 -5px;
}
… or alter the HTML (as shown in another answer):
<div class='flex-wrapper'>
<div class='flex'>
<div class='box'></div>
<div class='box'></div>
...
</div>
</div>
… or something else.
In any case, you need an ugly hack to make it work because flexbox doesn’t provide a «flex-gap
» feature
(at least for now).
The issue of gutters, however, is simple and easy with CSS Grid Layout.
The Grid spec provides properties that create space between grid items, while ignoring the space between items and the container. These properties are:
grid-column-gap
grid-row-gap
grid-gap
(the shorthand for both properties above)
Recently, the spec has been updated to conform with the CSS Box Alignment Module, which provides a set of alignment properties for use across all box models. So the properties are now:
column-gap
row-gap
gap
(shorthand)
However, not all Grid-supporting browsers support the newer properties, so I’ll use the original versions in the demo below.
Also, if spacing is needed between items and the container, padding
on the container works just fine (see the third example in the demo below).
From the spec:
10.1. Gutters: the
row-gap
,column-gap
, andgap
propertiesThe
row-gap
andcolumn-gap
properties (and theirgap
shorthand),
when specified on a grid container, define the gutters between grid
rows and grid columns. Their syntax is defined in CSS Box Alignment 3
§8 Gaps Between Boxes.The effect of these properties is as though the affected grid lines
acquired thickness: the grid track between two grid lines is the space
between the gutters that represent them.
.box {
display: inline-grid;
grid-auto-rows: 50px;
grid-template-columns: repeat(4, 50px);
border: 1px solid black;
}
.one {
grid-column-gap: 5px;
}
.two {
grid-column-gap: 10px;
grid-row-gap: 10px;
}
.three {
grid-gap: 10px;
padding: 10px;
}
.item {
background: lightgray;
}
<div class='box one'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
<hr>
<div class='box two'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
<hr>
<div class='box three'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
More information:
- Browser Support for CSS Grid
- Make it easier to define margins that only apply between flex-items (discussion)
- Spacing between flexbox items
With flexbox, creating gutters is a pain, especially when wrapping is involved.
You need to use negative margins (as shown in the question):
#box {
display: flex;
width: 100px;
margin: 0 -5px;
}
… or alter the HTML (as shown in another answer):
<div class='flex-wrapper'>
<div class='flex'>
<div class='box'></div>
<div class='box'></div>
...
</div>
</div>
… or something else.
In any case, you need an ugly hack to make it work because flexbox doesn’t provide a «flex-gap
» feature
(at least for now).
The issue of gutters, however, is simple and easy with CSS Grid Layout.
The Grid spec provides properties that create space between grid items, while ignoring the space between items and the container. These properties are:
grid-column-gap
grid-row-gap
grid-gap
(the shorthand for both properties above)
Recently, the spec has been updated to conform with the CSS Box Alignment Module, which provides a set of alignment properties for use across all box models. So the properties are now:
column-gap
row-gap
gap
(shorthand)
However, not all Grid-supporting browsers support the newer properties, so I’ll use the original versions in the demo below.
Also, if spacing is needed between items and the container, padding
on the container works just fine (see the third example in the demo below).
From the spec:
10.1. Gutters: the
row-gap
,column-gap
, andgap
propertiesThe
row-gap
andcolumn-gap
properties (and theirgap
shorthand),
when specified on a grid container, define the gutters between grid
rows and grid columns. Their syntax is defined in CSS Box Alignment 3
§8 Gaps Between Boxes.The effect of these properties is as though the affected grid lines
acquired thickness: the grid track between two grid lines is the space
between the gutters that represent them.
.box {
display: inline-grid;
grid-auto-rows: 50px;
grid-template-columns: repeat(4, 50px);
border: 1px solid black;
}
.one {
grid-column-gap: 5px;
}
.two {
grid-column-gap: 10px;
grid-row-gap: 10px;
}
.three {
grid-gap: 10px;
padding: 10px;
}
.item {
background: lightgray;
}
<div class='box one'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
<hr>
<div class='box two'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
<hr>
<div class='box three'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
More information:
- Browser Support for CSS Grid
- Make it easier to define margins that only apply between flex-items (discussion)
- Spacing between flexbox items
With flexbox, creating gutters is a pain, especially when wrapping is involved.
You need to use negative margins (as shown in the question):
#box {
display: flex;
width: 100px;
margin: 0 -5px;
}
… or alter the HTML (as shown in another answer):
<div class='flex-wrapper'>
<div class='flex'>
<div class='box'></div>
<div class='box'></div>
...
</div>
</div>
… or something else.
In any case, you need an ugly hack to make it work because flexbox doesn’t provide a «flex-gap
» feature
(at least for now).
The issue of gutters, however, is simple and easy with CSS Grid Layout.
The Grid spec provides properties that create space between grid items, while ignoring the space between items and the container. These properties are:
grid-column-gap
grid-row-gap
grid-gap
(the shorthand for both properties above)
Recently, the spec has been updated to conform with the CSS Box Alignment Module, which provides a set of alignment properties for use across all box models. So the properties are now:
column-gap
row-gap
gap
(shorthand)
However, not all Grid-supporting browsers support the newer properties, so I’ll use the original versions in the demo below.
Also, if spacing is needed between items and the container, padding
on the container works just fine (see the third example in the demo below).
From the spec:
10.1. Gutters: the
row-gap
,column-gap
, andgap
propertiesThe
row-gap
andcolumn-gap
properties (and theirgap
shorthand),
when specified on a grid container, define the gutters between grid
rows and grid columns. Their syntax is defined in CSS Box Alignment 3
§8 Gaps Between Boxes.The effect of these properties is as though the affected grid lines
acquired thickness: the grid track between two grid lines is the space
between the gutters that represent them.
.box {
display: inline-grid;
grid-auto-rows: 50px;
grid-template-columns: repeat(4, 50px);
border: 1px solid black;
}
.one {
grid-column-gap: 5px;
}
.two {
grid-column-gap: 10px;
grid-row-gap: 10px;
}
.three {
grid-gap: 10px;
padding: 10px;
}
.item {
background: lightgray;
}
<div class='box one'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
<hr>
<div class='box two'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
<hr>
<div class='box three'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
More information:
- Browser Support for CSS Grid
- Make it easier to define margins that only apply between flex-items (discussion)
- Spacing between flexbox items
Given this 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;
}
This layout has the first item in each row aligned to the left, and the last item aligned to the right, as required.
As the browser window is made narrower, the distributed div
elements will move closer together until they touch, at which point they are re-arranged over an additional row. Again, the first div on each row is aligned left, and the last aligned right with space between.
Is there any way of setting a minimum spacing so that the inner div
elements always have a gap between them.
padding and margin will probably not work, as the alignment
<-- 1st left in row
and last right in row -->
will not hold.
TylerH
20.5k62 gold badges75 silver badges97 bronze badges
asked Oct 7, 2015 at 4:49
1
Bit late the the party but I ran into the same issue. The way I solved it probably wont work for everyone but here it is for those who can use it.
The basic idea is that you have a min gap of x
. You set the left and right margins of each item to x/2
so that the distance between the items will be x
(margin + margin). Then you wrap all of the items in a container with a left and right margin of -x/2
. This will hide the margin on the items at the edges of each row.
Here is a working example:
.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>
The overflow-x: hidden;
on .box
is to prevent the horizontal scrollbar that shows up in some browsers because of the margin overflowing.
If you want the gap to always be consistent and for rows with only one item to have that item span the whole row then you can add flex-grow: 1
to .item
.
answered Jan 25, 2018 at 19:31
bygracebygrace
5,8101 gold badge30 silver badges56 bronze badges
3
You can add another div with flex style for holding the needed gap between inner divs. and for the minimum width for that gap use this property (as mentioned in W3Schools.com):
flex: flex-grow flex-shrink flex-basis|auto|initial|inherit;
which flex-shrink is :
flex-shrink: A number specifying how much the item will shrink relative to the rest of the flexible items
so, for example you set this css code for the gap div :
flex: 1 0 10px;
that tells gap div will have 10px width, and will grow relative to the rest of the flexible items, but WON’T SHRINK. so the minimum width will be 10px at the narrowest width of the screen.
answered Oct 7, 2015 at 6:54
PiMLPiML
4944 silver badges4 bronze badges
2
In 2022 you can just use gap
CSS property:
div.container {
display: flex;
flex-flow: row wrap;
justify-content: space-between;
border: 1px solid blue;
gap: 20px;
}
To support older browsers you may use margin hack.
div.container > * {
margin: 12px 0 0 12px;
}
div.container {
display: inline-flex;
flex-wrap: wrap;
margin: -12px 0 0 -12px;
width: calc(100% + 12px);
}
answered Jun 26, 2022 at 13:21
EugeneEugene
7281 gold badge9 silver badges22 bronze badges
1
Since April 2021 support for flexbox-gap
has arrived in all major browsers (IE considered dead). Combining it w/ space-between
solves your problem.
div.container {
display: flex;
gap: 10px; /* minimum gap between flex-items */
justify-content: space-between;
}
answered Jun 27, 2022 at 8:36
esprettoespretto
2042 silver badges11 bronze badges
It’s a couple of days passed since this question was asked, but I thought I should add my solution if anybody comes past and has the same issue.
I suggest using calc, width, and media to solve this issue. Yes, it’s a little work but it’s a visual clean solution in my opinion.
.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>
For the needed breakpoints I calculate the width I want the divs to use and subtract the space I want them to have.
I hope this helps someone and that I explained it understandable.
Regards.
answered Oct 21, 2019 at 13:08
DBRDBR
1481 silver badge10 bronze badges
Setting a flex-basis with percentage also will do the trick. Then the min space between will be also in percentage.
For instance, with 3 elements, flex: 0 0 30% will allow a fixed 10% space reparted between elements.
with 6 elements, flex: 0 0 15% and so on.
answered Aug 9, 2019 at 20:17
lemospylemospy
3413 silver badges8 bronze badges
Given this 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;
}
This layout has the first item in each row aligned to the left, and the last item aligned to the right, as required.
As the browser window is made narrower, the distributed div
elements will move closer together until they touch, at which point they are re-arranged over an additional row. Again, the first div on each row is aligned left, and the last aligned right with space between.
Is there any way of setting a minimum spacing so that the inner div
elements always have a gap between them.
padding and margin will probably not work, as the alignment
<-- 1st left in row
and last right in row -->
will not hold.
TylerH
20.5k62 gold badges75 silver badges97 bronze badges
asked Oct 7, 2015 at 4:49
1
Bit late the the party but I ran into the same issue. The way I solved it probably wont work for everyone but here it is for those who can use it.
The basic idea is that you have a min gap of x
. You set the left and right margins of each item to x/2
so that the distance between the items will be x
(margin + margin). Then you wrap all of the items in a container with a left and right margin of -x/2
. This will hide the margin on the items at the edges of each row.
Here is a working example:
.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>
The overflow-x: hidden;
on .box
is to prevent the horizontal scrollbar that shows up in some browsers because of the margin overflowing.
If you want the gap to always be consistent and for rows with only one item to have that item span the whole row then you can add flex-grow: 1
to .item
.
answered Jan 25, 2018 at 19:31
bygracebygrace
5,8101 gold badge30 silver badges56 bronze badges
3
You can add another div with flex style for holding the needed gap between inner divs. and for the minimum width for that gap use this property (as mentioned in W3Schools.com):
flex: flex-grow flex-shrink flex-basis|auto|initial|inherit;
which flex-shrink is :
flex-shrink: A number specifying how much the item will shrink relative to the rest of the flexible items
so, for example you set this css code for the gap div :
flex: 1 0 10px;
that tells gap div will have 10px width, and will grow relative to the rest of the flexible items, but WON’T SHRINK. so the minimum width will be 10px at the narrowest width of the screen.
answered Oct 7, 2015 at 6:54
PiMLPiML
4944 silver badges4 bronze badges
2
In 2022 you can just use gap
CSS property:
div.container {
display: flex;
flex-flow: row wrap;
justify-content: space-between;
border: 1px solid blue;
gap: 20px;
}
To support older browsers you may use margin hack.
div.container > * {
margin: 12px 0 0 12px;
}
div.container {
display: inline-flex;
flex-wrap: wrap;
margin: -12px 0 0 -12px;
width: calc(100% + 12px);
}
answered Jun 26, 2022 at 13:21
EugeneEugene
7281 gold badge9 silver badges22 bronze badges
1
Since April 2021 support for flexbox-gap
has arrived in all major browsers (IE considered dead). Combining it w/ space-between
solves your problem.
div.container {
display: flex;
gap: 10px; /* minimum gap between flex-items */
justify-content: space-between;
}
answered Jun 27, 2022 at 8:36
esprettoespretto
2042 silver badges11 bronze badges
It’s a couple of days passed since this question was asked, but I thought I should add my solution if anybody comes past and has the same issue.
I suggest using calc, width, and media to solve this issue. Yes, it’s a little work but it’s a visual clean solution in my opinion.
.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>
For the needed breakpoints I calculate the width I want the divs to use and subtract the space I want them to have.
I hope this helps someone and that I explained it understandable.
Regards.
answered Oct 21, 2019 at 13:08
DBRDBR
1481 silver badge10 bronze badges
Setting a flex-basis with percentage also will do the trick. Then the min space between will be also in percentage.
For instance, with 3 elements, flex: 0 0 30% will allow a fixed 10% space reparted between elements.
with 6 elements, flex: 0 0 15% and so on.
answered Aug 9, 2019 at 20:17
lemospylemospy
3413 silver badges8 bronze badges
CSS Flexbox and CSS Grid are fantastic tools available for managing layout on the Web. Flexbox handles single-dimensional layouts very well, while CSS Grid handles two-dimensional layouts with columns and rows. Often we want to add space between the items within our layout. This post will show how to add space between flex items using the CSS gap
property and the necessary workarounds for browser support.
Inline Flex
To demonstrate CSS Gap, we will use Flexbox. CSS Gap works in CSS Grid, but there are many cases where we have inline lists that need space without a defined grid.
<div class="flex-gap">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
</div>
.flex-gap {
display: inline-flex;
flex-wrap: wrap;
}
We use inline-flex
to have flex items but display our parent element as an inline element instead of a block element. The flex-wrap: wrap
property will allow our items to wrap as the parent container shrinks or is constrained.
If we want to add space between each item, we could use margin on each item.
.flex-gap {
display: inline-flex;
flex-wrap: wrap;
}.flex-gap > div {
margin: 6px;
}
Margins works but is not the same behavior as CSS Gap space. Notice the extra space surrounding the boxes. With gap spacing, we only want space applied between the items. Using CSS Gap, we can achieve this.
.flex-gap {
display: inline-flex;
flex-wrap: wrap;
gap: 12px;
}
CSS Gap is a feature of the CSS Grid spec and Flexbox. Currently Firefox is the only major browser that supports Update: As of April 25, 2021, CSS Gap for Flexbox is supported in all major browsers! 🎉gap
on flex items.
To support older browsers that don’t support Flex Gap in Flexbox we can use a margin hack to create a close workaround.
<div class="emulated-flex-gap">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
</div>
.emulated-flex-gap > * {
margin: 12px 0 0 12px;
}.emulated-flex-gap {
display: inline-flex;
flex-wrap: wrap;
margin: -12px 0 0 -12px;
width: calc(100% + 12px);
}
We can set margin space on the top and left of each item. On the flex parent element, we use negative margins to counter the excess margin on the outer child elements. This technique will get a similar effect to CSS gap
space.
We can clean up the CSS a bit by using CSS Custom Properties, so it is easier to change the margin spacing.
.emulated-flex-gap {
--gap: 12px;
display: inline-flex;
flex-wrap: wrap;
margin: calc(-1 * var(--gap)) 0 0 calc(-1 * var(--gap));
width: calc(100% + var(--gap));
}.emulated-flex-gap > * {
margin: var(--gap) 0 0 var(--gap);
}
With this workaround, we can get something close to CSS Gap space in older browsers. With CSS Gap spacing, we can remove much of the white space complexities in CSS when using margins. Check out the full working demo below!