Схема довольно проста с flexbox.Вам не нужно flex-direction: column
.
Просто используйте flex-direction: row
с flex-wrap: wrap
.
. Затем сделайте каждый элемент достаточно длинным, чтобы занимать полный ряд.
Уменьшите flex-basis
на элементах, которые должны совместно использовать строку.
.flex-column {
display: flex;
flex-wrap: wrap;
}
.column-item {
flex: 1 0 61%; /* flex-grow, flex-shrink, flex-basis */
margin: 2px;
background-color: lightgreen;
}
.column-item:nth-of-type(4),
.column-item:nth-of-type(5) {
flex-basis: 40%;
}
<div class="flex-column">
<div class="column-item">a</div>
<div class="column-item">b</div>
<div class="column-item">c</div>
<div class="column-item">d</div>
<div class="column-item">e</div>
</div>
С flex-grow: 1
, определенным в стенографии flex
, нет необходимости использовать calc()
.
Поскольку flex-grow
будетпотребляя свободное место в строке, flex-basis
должно быть достаточно большим, чтобы обеспечить перенос.В этом случае с flex-basis: 61%
достаточно места для полей, но никогда не хватает места для второго элемента.
Существует еще более простое и эффективное решение с использованием CSS Grid:
.flex-column {
display: grid;
grid-template-columns: 1fr 1fr;
grid-gap: 5px;
}
.column-item:nth-of-type(-n + 3) {
grid-column: span 2;
}
.column-item {
background-color: lightgreen;
}
<div class="flex-column">
<div class="column-item">a</div>
<div class="column-item">b</div>
<div class="column-item">c</div>
<div class="column-item">d</div>
<div class="column-item">e</div>
</div>