I don't think this will be possible until browsers support display: contents
or display: subgrid
.
In the meanwhile, I think the closest you can get (without altering the HTML) is equal height rows across containers. The heights are set by the tallest item in each row.
Add this to your code:
.panel-grid {
display: grid;
grid-auto-rows: 1fr; /* new */
}
This overrides the grid-auto-rows: auto
default.
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-column-gap: 20px;
outline: 2px dashed red;
}
.panel-grid {
background-color: #f0f0f0;
outline: 1px solid blue;
display: grid;
grid-auto-rows: 1fr; /* new */
}
.row {
background-color: #5879c5;
text-align: center;
font-weight: bold;
}
.row2 {
background-color: #c5b07f;
text-align: center;
font-weight: bold;
}
.row3 {
background-color: #e0ffef;
text-align: center;
font-weight: bold;
}
<div class="grid">
<div class="panel-grid">
<div class="row">
<div>1</div>
<div>1</div>
<div>1</div>
</div>
<div class="row2">
<div>2</div>
</div>
<div class="row3">
<div>3</div>
</div>
</div>
<div class="panel-grid">
<div class="row">
<div>1</div>
</div>
<div class="row2">
<div>2</div>
<div>2</div>
<div>2</div>
</div>
<div class="row3">
<div>3</div>
</div>
</div>
<div class="panel-grid">
<div class="row">
<div>1</div>
</div>
<div class="row2">
<div>2</div>
</div>
<div class="row3">
<div>3</div>
</div>
</div>
</div>
If you can change the HTML–putting all items in a single container– then here's a possible option:
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(3, auto); /* new */
grid-auto-flow: column; /* new */
}
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(3, auto);
grid-auto-flow: column;
grid-gap: 5px;
outline: 2px dashed red;
}
.row {
background-color: #5879c5;
text-align: center;
font-weight: bold;
}
.row2 {
background-color: #c5b07f;
text-align: center;
font-weight: bold;
}
.row3 {
background-color: #e0ffef;
text-align: center;
font-weight: bold;
}
<div class="grid">
<div class="row">
<div>1</div>
<div>1</div>
<div>1</div>
</div>
<div class="row2">
<div>2</div>
</div>
<div class="row3">
<div>3</div>
</div>
<div class="row">
<div>1</div>
</div>
<div class="row2">
<div>2</div>
<div>2</div>
<div>2</div>
<div>2</div>
</div>
<div class="row3">
<div>3</div>
</div>
<div class="row">
<div>1</div>
</div>
<div class="row2">
<div>2</div>
</div>
<div class="row3">
<div>3</div>
</div>
</div>
More details: