I want to leverage CSS Grid to evenly size those elements which are part of the same CSS Grid axis:
[class*=' container-grid-'], [class^='container-grid-'] {
/* give margin-bottom to all kinds of "container-grid-", see https://stackoverflow.com/a/13352103/923560 */
margin-bottom: 2rem;
}
[class*=' container-grid-'] > .col, [class^='container-grid-'] > .col {
display: contents;
}
.container-grid-2by2 {
display: grid;
grid-auto-flow: column;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(2, auto);
row-gap: 0;
column-gap: 1rem;
}
.container-grid-3by3 {
display: grid;
grid-auto-flow: column;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(3, auto);
row-gap: 0;
column-gap: 1rem;
}
.red {
background-color: red;
}
.green {
background-color: green;
}
.blue {
background-color: skyblue;
}
.limit-width {
max-width: 20rem;
background-color: silver;
}
<div class="limit-width">
<h1><code>.container-grid-2by2</code></h1>
<div class="container-grid-2by2">
<div class="col">
<div class="red">
Foo1
</div>
<div class="green">
Bar1
</div>
</div>
<div class="col">
<div class="red">
Foo2 Foo2 Foo2 Foo2 Foo2 Foo2 Foo2 Foo2 Foo2 Foo2 Foo2 Foo2 Foo2 Foo2 Foo2 Foo2 Foo2
</div>
<div class="green">
Bar2 Bar2 Bar2 Bar2 Bar2 Bar2 Bar2
</div>
</div>
</div>
</div>
<div class="limit-width">
<h1><code>.container-grid-3by3</code></h1>
<div class="container-grid-3by3">
<div class="col">
<div class="red">
Foo1
</div>
<div class="green">
Bar1
</div>
<div class="blue">
Baz1
</div>
</div>
<div class="col">
<div class="red">
Foo2 Foo2 Foo2 Foo2 Foo2 Foo2 Foo2 Foo2 Foo2 Foo2 Foo2 Foo2 Foo2 Foo2 Foo2 Foo2 Foo2
</div>
<div class="green">
Bar2 Bar2 Bar2 Bar2 Bar2 Bar2 Bar2
</div>
<div class="blue">
Baz3
</div>
</div>
<div class="col">
<div class="red">
Foo3 Foo3 Foo3 Foo3 Foo3 Foo3 Foo3 Foo3
</div>
<div class="green">
Bar3 Bar3 Bar3 Bar3 Bar3 Bar3 Bar3 Bar3
</div>
<div class="blue">
Baz3
</div>
</div>
</div>
</div>
As you can see, elements on the same CSS grid row axis receive the same height, e.g. a cell with little text content (Foo1) stretches to match the height of the cell with most text content (Foo2 Foo2 Foo2 ...). Awesome, that's exactly what I want!
HTML follows the following structure: a <div class="container-grid-*">
element acting as the CSS grid container; inside it several <div class="col">
acting as columns; and then inside those columns the actual content HTML elements. The .col
elements use display: contents;
to "delegate" CSS grid cell determination to the actual content HTML elements.
But right now, my CSS requires explicit rules for each column and row count: .container-grid-2by2
, .container-grid-3by3
, .container-grid-2by3
, .container-grid-3by2
, etc.
There should be a way to refactor this, no?
Is there any CSS trick to automatically derive CSS grid column and row counts?
For my circumstances, it can always be assumed that within a container, each column has the same amount of actual HTML content elements; e.g. within a container all columns will have x elements.