Поскольку ваши элементы имеют фиксированный размер, заставить их оборачиваться парами или большим кратным довольно сложно.
Простой способ обернуть несколько элементов - задать их длину в процентах. Затем с помощью медиазапросов можно контролировать количество элементов в строке, регулируя проценты.
В макете с, скажем, шестью элементами (такими как ваш макет), ширина может быть установлена на 16% для представлений рабочего стола.
[ 16% ] [ 16% ] [ 16% ] [ 16% ] [ 16% ] [ 16% ]
Затем, для представления с ноутбука, может появиться медиа-запрос, изменяя ширину до 33%:
[ 33% ] [ 33% ] [ 33% ]
[ 33% ] [ 33% ] [ 33% ]
Та же идея для просмотра планшета:
[ 50% ] [ 50% ]
[ 50% ] [ 50% ]
[ 50% ] [ 50% ]
То же самое для мобильного просмотра:
[ 100% ]
[ 100% ]
[ 100% ]
[ 100% ]
[ 100% ]
[ 100% ]
Вот иллюстрация:
jsFiddle
.box {
display: flex;
flex-wrap: wrap;
}
.box div {
flex: 1 0 15%;
height: 50px;
margin: 5px;
background-color: yellow;
border: 1px solid gray;
}
@media ( max-width: 800px) {
.box div {
flex-basis: 30%;
}
}
@media ( max-width: 600px) {
.box div {
flex-basis: 40%;
}
}
@media ( max-width: 400px) {
.box div {
flex-basis: 100%;
margin: 0 0 5px 0;
}
}
* {
box-sizing: border-box;
}
<div class="box">
<div>One</div>
<div>Two</div>
<div>Three</div>
<div>Four</div>
<div>Five</div>
<div>Six</div>
</div>
Конечно, проблема с демонстрацией выше, поскольку она касается вашего вопроса, заключается в том, что элементы не имеют фиксированной ширины. В процентах они гибкие.
Итак, давайте попробуем обратный подход: вместо того, чтобы регулировать размер элементов, давайте отрегулируем размер контейнера. Сжимая контейнер (с медиазапросами), мы можем контролировать поведение обтекания и , сохраняя размер фиксированной ширины каждого элемента:
jsFiddle
.box {
display: flex;
flex-wrap: wrap;
width: 360px;
background-color: lightgreen;
}
.box div {
flex: 0 0 50px;
height: 50px;
margin: 5px;
background-color: yellow;
border: 1px solid gray;
}
@media ( max-width: 800px) {
.box {
width: 180px;
}
}
@media ( max-width: 600px) {
.box {
width: 120px;
}
}
@media ( max-width: 400px) {
.box {
width: 60px;
}
}
* {
box-sizing: border-box;
}
<div class="box">
<div>One</div>
<div>Two</div>
<div>Three</div>
<div>Four</div>
<div>Five</div>
<div>Six</div>
</div>
Так что, если вы можете использовать гибкую длину на предметах или уменьшить ширину контейнера, тогда ваша проблема решена. Однако, если ни один из вариантов не подходит, вот чистое и простое решение с использованием CSS Grid Layout.
jsFiddle
.box {
display: grid;
grid-template-columns: repeat(6, 50px);
grid-auto-rows: 50px;
grid-gap: 5px;
}
@media ( max-width: 800px) {
.box {
grid-template-columns: repeat(3, 50px);
}
}
@media ( max-width: 600px) {
.box {
grid-template-columns: 50px 50px;
}
}
@media ( max-width: 400px) {
.box {
grid-template-columns: 50px;
}
}
.box div {
background-color: yellow;
border: 1px solid gray;
}
* {
box-sizing: border-box;
}
<div class="box">
<div>One</div>
<div>Two</div>
<div>Three</div>
<div>Four</div>
<div>Five</div>
<div>Six</div>
</div>