I have a content and I Want them in row-reverse and wrap-reverse but with reverse order. Here's code:
.a {
height: 200px;
width: 520px;
padding: 5px 5px 5px 10px;
display: flex;
flex-wrap: wrap-reverse;
flex-direction: row-reverse;
background-color: black;
}
.b {
min-width: 120px;
height: 90px;
text-align: center;
line-height: 90px;
margin-right: 5px;
background-color: aquamarine;
}
<div class="a">
<div class="b">1</div>
<div class="b">2</div>
<div class="b">3</div>
<div class="b">4</div>
<div class="b">5</div>
<div class="b">6</div>
</div>
The order should be reversed. Please answer this without using 'order' property. Something like this image(sorry for bad edit):
Please see code output first then image.
The flex items break into multiple lines. The cross-start is either equivalent to start or before depending flex-direction value and the cross-end is the opposite of the specified cross-start. wrap-reverse. Behaves the same as wrap but cross-start and cross-end are permuted.
Using the flex-direction property with values of row-reverse or column-reverse will create a disconnect between the visual presentation of content and DOM order.
default flex-direction: row; The flexbox items are ordered the same way as the text direction, along the main axis. flex-direction: row-reverse; The flexbox items are ordered the opposite way as the text direction, along the main axis.
We can make use of Quantity Queries to implement this layout (no js required!)
ul {
list-style: none;
min-height: 90px;
width: 500px;
padding: 5px;
background-color: black;
display: flex;
flex-wrap: wrap;
}
li {
display: inline-block;
min-width: 120px;
height: 90px;
text-align: center;
line-height: 90px;
margin-right: 5px;
margin-bottom: 5px;
background-color: aquamarine;
}
li:nth-last-child(4n + 3):first-child {
margin-left: 125px;
background-color: pink;
}
li:nth-last-child(4n + 2):first-child {
margin-left: 250px;
background-color: blue;
}
li:nth-last-child(4n + 1):first-child {
margin-left: 375px;
background-color: green;
}
li:nth-last-child(4n):first-child {
background-color: purple;
}
<ul>
<li>1</li>
</ul>
<hr>
<ul>
<li>1</li>
<li>2</li>
</ul>
<hr>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<hr>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
<hr>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
<hr>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
</ul>
<hr>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
</ul>
<hr>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
</ul>
<hr>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
</ul>
The layout required here essentially boils down to a regular four-column left to right layout with the first element indented according to how many items there are in the container.
When there are 4n items (4, 8, 12 etc) - no indentation is required.
When there are 4n + 1 items (1, 5, 9 etc) - a three-item indentation is required.
When there are 4n + 2 items (2, 6, 10 etc) - a two-item indentation is required.
When there are 4n + 3 items (3, 7, 11 etc) - a one-item indentation is required.
li:nth-last-child(4n + 3):first-child {
margin-left: 125px; /* one-item indentation */
}
li:nth-last-child(4n + 2):first-child {
margin-left: 250px; /* two-item indentation */
}
li:nth-last-child(4n + 1):first-child {
margin-left: 375px; /* three-item indentation */
}
li:nth-last-child(4n):first-child {
/* no indentation */
}
Say there are 6 items. We need to apply a two-item indentation to the first item.
The selector for this would be:
li:nth-last-child(4n + 2):first-child {
margin-left: 250px; /* 250 = 2 * 120 (item width) + 2 * 5px gap */
}
The interesting bit is :nth-last-child(4n + 2):first-child
which means:
'select the first child if it is also the 4n + 2 child from the last child.'
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With