To rearrange the display sequence, you can utilize the order
property ;)
You can achieve this by using the nth-child(n)
selector in your HTML code as shown below:
.grid {
display: grid;
grid-template-columns: 48px 1fr 48px 1fr;
column-gap: 12px;
align-items: center;
justify-content: center;
background-color: orange;
border: 1px solid black;
}
.grid-item {
padding: 16px;
border: 1px solid black;
font-size: 12px;
background-color: aliceblue;
}
.grid-item:nth-child(4n) ,/* catch 4, 8, ..*/
.grid-item:nth-child(4n - 1)/*, catch 3,7,...)*/
{
order: 1;
color:green;
font-weight:bold;
}
<section class="grid">
<div class="grid-item">1</div>
<div class="grid-item">Item 1</div>
<div class="grid-item">2</div>
<div class="grid-item">Item 2</div>
<div class="grid-item">3</div>
<div class="grid-item">Item 3</div>
<div class="grid-item">4</div>
<div class="grid-item">Item 4</div>
</section>
Resources:
If the number of items is uncertain (and if there is a maximum possible known number), you can set up rules utilizing the :nth-last-child():first-child
selector to distribute items into different columns based on the item count.
For instance, with 8 items (16):
.grid {
display: grid;
grid-template-columns: 48px 1fr 48px 1fr;
column-gap: 12px;
align-items: center;
justify-content: center;
background-color: orange;
border: 1px solid black;
grid-auto-flow:row dense;
}
.grid-item {
padding: 16px;
border: 1px solid black;
font-size: 12px;
background-color: aliceblue;
}
/* Fill first two columns */
.grid-item:nth-child(odd) {
grid-column:1;
}
.grid-item:nth-child(even) {
grid-column:2;
}
/* Separate odds and evens into respective columns for 8 items (16) */
.grid-item:nth-last-child(16):first-child~:nth-child(8) ~ .grid-item:nth-child(odd) {
grid-column:3;
}
.grid-item:nth-last-child(16):first-child~:nth-child(8) ~ .grid-item:nth-child(even) {
grid-column:4;
}
<section class="grid">
<div class="grid-item">1</div>
<div class="grid-item">Item 1</div>
<div class="grid-item">2</div>
<div class="grid-item">Item 2</div>
<div class="grid-item">3</div>
<div class="grid-item">Item 3</div>
<div class="grid-item">4</div>
<div class="grid-item">Item 4</div>
<div class="grid-item">5</div>
<div class="grid-item">Item 5</div>
<div class="grid-item">6</div>
<div class="grid-item">Item 6</div>
<div class="grid-item">7</div>
<div class="grid-item">Item 7</div>
<div class="grid-item">8</div>
<div class="grid-item">Item 8</div>
</section>
In the previous snippet, you can adjust the rules by updating
.grid-item:nth-last-child(XX):first-child~:nth-child(X)
based on the number of child items being tested
Javascript can also be used to assign elements to specific columns easily.
let item = document.querySelectorAll(".grid-item");
i = 0;
let evenodd = (item.length/2)%2; // to make first col higher if amount of item not balanced
for (let e of document.querySelectorAll(".grid-item")) {
i++;
if (i > item.length / 2 + evenodd ) {
let pos = i;
let odd = pos % 2;
if (odd == 1) {
e.classList.toggle("col3");
} else {
e.classList.toggle("col4");
}
}
}
.grid {
display: grid;
grid-template-columns: 48px 1fr 48px 1fr;
column-gap: 12px;
align-items: center;
justify-content: center;
background-color: orange;
border: 1px solid black;
grid-auto-flow: row dense;
}
.grid-item {
padding: 16px;
border: 1px solid black;
font-size: 12px;
background-color: aliceblue;
}
.grid-item:nth-child(odd) {
grid-column: 1;
}
.grid-item:nth-child(even) {
grid-column: 2;
}
/* Class assignment will be done through JavaScript */
.grid-item.col3 {
grid-column: 3;
}
.grid-item.col4 {
grid-column: 4;
}
<section class="grid">
<div class="grid-item">1</div>
<div class="grid-item">Item 1</div>
<div class="grid-item">2</div>
<div class="grid-item">Item 2</div>
<div class="grid-item">3</div>
<div class="grid-item">Item 3</div>
<div class="grid-item">4</div>
<div class="grid-item">Item 4</div>
<div class="grid-item">5</div>
<div class="grid-item">Item 5</div>
<div class="grid-item">6</div>
<div class="grid-item">Item 6</div>
<div class="grid-item">7</div>
<div class="grid-item">Item 7</div>
<div class="grid-item">8</div>
<div class="grid-item">Item 8</div>
<div class="grid-item">9</div>
<div class="grid-item">Item 9</div>
</section>