Just wrap your columns items inside a div and everything inside a flexbox or grid-container.
Sample: https://codepen.io/antekai/pen/NOGEYB?editors=1100
HTML
FLEXBOX SOLUTION
<div class="flex-container">
<div>
<div class="item">a1</div>
<div class="item">a2</div>
<div class="item">a3</div>
</div>
<div>
<div class="item">b1</div>
<div class="item">b2</div>
<div class="item">b3</div>
</div>
</div>
CSS GRID SOLUTION
<div class="grid-container">
<div>
<div class="item">a1</div>
<div class="item">a2</div>
<div class="item">a3</div>
</div>
<div>
<div class="item">b1</div>
<div class="item">b2</div>
<div class="item">b3</div>
</div>
</div>
CSS
//flexbox solution
.flex-container{
display:flex;
flex-flow:row wrap;
}
// CSS Grid solution
.grid-container{
display:grid;
grid-template-columns: repeat(auto-fit,minmax(200px,1fr))
}
//helper class
.item{
height:100px;
width:200px;
background-color: black;
color:white;
margin:10px;
}
EDIT
At the following link you can find enhanced solution for the case of unequal height of items. For the flexbox solution, a dynamic JS based enhancement and for the CSS grid a static CSS based enhancement. The logic of the enhancements is the same: add an empty item with height equal to the difference of heights between respective items (e.g. empty item after b1 with height=a1-b1 when a1-b1>0 which results vertical align of a2 and b2). The flexbox enhanced solution can be extended to CSS grid solution and the contrary.
Sample: https://codepen.io/antekai/pen/OBMyqv
Note: for the JS based enhancement (flexbox solution) when you resize the viewport between the breakpoint (at 400px) just type anything (to html,css or js panel) so the codepen refreshes the live-reload.