Идея флексбокса:
.container {
display:flex;
padding:0;
margin:0;
flex-wrap:wrap;
border:1px solid red;
--w:300px; /* the width of 4 items */
}
.container > * {
flex-grow:1;
flex-basis:calc(var(--w)/4);
border:1px solid;
box-sizing:border-box;
list-style:none;
}
.container > *:nth-child(8n + 4) {
margin-right:calc(100% - var(--w));
}
.container > *:nth-child(8n + 5) {
margin-left:calc(100% - var(--w));
}
/* Irrelevant style to maintain the square ratio */
.container > *::before {
content:"";
display:inline-block;
padding-top:100%;
}
<ul class="container">
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
</ul>
<ul class="container" style="--w:200px">
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
</ul>
<ul class="container" style="--w:60%">
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
</ul>
Вы также можете использовать старый метод с плавающей запятой:
.container {
padding:0;
margin:0;
border:1px solid red;
overflow:auto;
--w:300px; /* the width of 4 items */
}
.container > * {
float:left;
width:calc(var(--w)/4);
border:1px solid;
box-sizing:border-box;
list-style:none;
}
.container > *:nth-child(8n + 5),
.container > *:nth-child(8n + 6),
.container > *:nth-child(8n + 7),
.container > *:nth-child(8n + 8){
float:right;
}
.container > *:nth-child(8n + 5) {
clear:left;
}
.container > *:nth-child(8n + 1) {
clear:right;
}
/**/
.container > *::before {
content:"";
display:inline-block;
padding-top:100%;
}
/**/
<ul class="container">
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
</ul>
<ul class="container" style="--w:200px">
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
</ul>
<ul class="container" style="--w:60%">
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
<li class="item"></li>
</ul>