Так как вы хотите, чтобы данная позиция в сетке была разделена между двумя различными элементами, вам необходимо установить конкретные позиции для обоих элементов.
Установка позиции для синих прямоугольников очень проста.Установка позиций для элементов в общем виде немного сложнее.
Я установил это таким общим образом, но если вы находите селекторы слишком жесткими, вы всегда можете установить позиции сетки 1 на 1.
.wrapper {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
}
.box {
border-radius: 5px;
border: 1px solid brown;
font-size: 150%;
height: 120px;
}
.overlay {
background-color: lightblue;
height: 70px;
margin-top: 30px;
border-radius: 10px;
}
#ov1 {
grid-column: 2 / span 2;
grid-row: 1;
}
#ov2 {
grid-column: 1 / span 2;
grid-row: 2;
}
.box:nth-child(3n + 1) {
grid-column: 1;
}
.box:nth-child(3n + 2) {
grid-column: 2;
}
.box:nth-child(3n) {
grid-column: 3;
}
.box:nth-child(-n + 3) {
grid-row: 1;
background-color: lightyellow;
}
.box:nth-child(-n + 6):nth-child(n + 4) {
grid-row: 2;
background-color: tomato;
}
<div class="wrapper">
<div class="box">Item 1</div>
<div class="box">Item 2</div>
<div class="box">Item 3</div>
<div class="box">Item 4</div>
<div class="box">Item 5</div>
<div class="box">Item 6</div>
<div class="box">Item 7</div>
<div class="box">Item 8</div>
<div class="box">Item 9</div>
<div class="overlay" id="ov1">Blue overlay</div>
<div class="overlay" id="ov2">Blue overlay</div>
</div>