Everything you need to know about :nth-child
Let’s talk about nth-child
. You can do a lot of things with it, but most people don’t know most of them.
We’re going to use a blank ol’ 9x9 table as demonstration. Without any nth-child
shenanigans, it looks like this:
The basics.
td:nth-child(2) {
background-color: #f15b29;
}
tr:nth-child(3) td {
background-color: #f15b29;
}
Note that indices start from one:
td:nth-child(1) {
background-color: #f15b29;
}
Ranges.
Think of n
as a substitute that matches from zero to infinity: so nth-child(n + 4)
is the equivalent of nth-child(4)
, nth-child(5)
, etc.
td:nth-child(n + 4) {
background-color: #f15b29;
}
You can do the same thing (well, I guess, the opposite thing) with -n
, which evaluates to 0, -1, -2, and so on:
tr:nth-child(-n + 7) td {
background-color: #f15b29;
}
Sort of advanced topics.
You can chain these ranges to provide finite subsets:
td:nth-child(n+4):nth-child(-n+6) {
background-color: #f15b29;
}
And, just as you can turn n
into -n
, you can also turn it into 2n
to grab every other element (again, think of n as the infinite set of positive integers, so 2n = 2, 4, 6, 8, ...
.)
td:nth-child(2n) {
background-color: #f15b29;
}
These multiples can also be modified and chained, just like anything else:
td:nth-child(2n + 1):nth-child(-n + 7) {
background-color: #f15b29
}
You can apply the pseudoselector to multiple elements in a definition (and there are odd
and even
keywords, too!)
tr:nth-child(odd) td:nth-child(even) {
background-color: #f15b29
}
nth-of-type
There’s also the criminally little-used nth-of-type
pseudoselector, which works the exact same way as nth-child
except it counts by the number elements of the specific type of the selector, as opposed to nth-child
(which counts all child elements.)
Our square table makes the difference difficult to illustrate, since they only have tr
elements (which only have td
elements.) Instead, lets make something a little kookier:
<div class='examplediv'>
<span>(S) This is some text.</span>
<div>(D) Here is some more text!</div>
<div>(D) Please, sir, can I have some more text?!</div>
<span>(S) Here's the last bit of text.</span>
<div>(D) Ha, just kidding! This is the last element!</div>
<span>(S) (This space intentionally left blank.)</span>
</div>
If we were to try and grab the second span element, nth-child
might not necessarily get us what we want:
span:nth-child(2) {
font-weight: bold;
}
This specifies a span element which is also the second child element of its parent; but since the second child element of our parent div
is not a span, nothing matches. But if we were to slap a nth-of-type
on that bad boy, we’d be golden!
span:nth-of-type(2) {
font-weight: bold;
}
nth-last-child
There’s also nth-last-child
, which is nth-child
’s evil twin: instead of counting from the first element, this counts from the last element.
td:nth-last-child(2) {
background-color: #f15b29
}
Conclusion
Hope this helped! nth-child
is an incredibly powerful front-end tool once you get the hang of it. If there are any other nice recipes or tricks I omitted, lemme know in the comments.