Это сложная проблема, которую часто просто обходят.Веб-страницы гораздо проще кодировать в сетках, поэтому вещи обычно располагаются в столбцах и строках.В вашем примере, когда обернут, строка должна быть достаточно высокой, чтобы содержать третий элементЭто означает, что если четвертый элемент находится там, где вы хотите, он будет находиться внутри ячейки первого элемента.
Вы можете использовать что-то вроде Masonary , которое, как я считаю, рассчитывается сверху и слева.позиции по мере изменения размера.Или я думаю, что вы можете использовать flex и множество div-ов-оболочек, но это станет грязным и будет ужасным обслуживанием.Это настолько грязно, что я никогда не запускал его в производство, потому что я потерял рассудок, пытаясь, или ненавидел мысль о его сохранении, когда он работал в небольшом примере.
Masonary допускает довольно простую компоновку
<div class="grid">
<div class="grid-item"></div>
<div class="grid-item grid-item--height2"></div>
<div class="grid-item grid-item--height3"></div>
<div class="grid-item grid-item--height2"></div>
</div>
Пример JSFiddle