Does nth mean anything in CSS?
Categories:
Understanding 'nth' in CSS: Selectors for Structured Styling

Explore the powerful 'nth' pseudo-classes in CSS, including :nth-child()
, :nth-of-type()
, and their variations, to precisely target elements based on their position within a parent.
In CSS, the term nth
refers to a family of pseudo-classes that allow you to select elements based on their position among a group of siblings. These selectors are incredibly powerful for applying styles to alternating rows, specific items in a list, or any element that follows a predictable pattern. Understanding how to use :nth-child()
, :nth-of-type()
, and their last
and only
counterparts is fundamental for creating dynamic and maintainable stylesheets without relying heavily on JavaScript or adding excessive classes to your HTML.
The Core 'nth' Pseudo-classes
The primary nth
pseudo-classes are :nth-child()
and :nth-of-type()
. While they both target elements by position, their key difference lies in what they count. :nth-child()
counts all sibling elements, regardless of their type, whereas :nth-of-type()
only counts siblings of the same element type.
flowchart TD A[Start] A --> B{Select Element by Position?} B -->|Yes| C{Count All Siblings?} C -->|Yes| D[":nth-child()"] C -->|No| E{Count Siblings of Same Type?} E -->|Yes| F[":nth-of-type()"] E -->|No| G[Error/Re-evaluate] D --> H[Apply Styles] F --> H[Apply Styles] H --> I[End] B -->|No| I
Decision flow for choosing between :nth-child() and :nth-of-type()
Understanding :nth-child()
The :nth-child(an+b)
pseudo-class selects elements that are the an+b
-th child of their parent. The an+b
expression is a formula where a
is an integer representing the cycle size, n
is a counter (starting at 0), and b
is an offset. Common keywords like odd
and even
are also available as shorthand.
/* Selects every second list item (2, 4, 6, ...) */
li:nth-child(even) {
background-color: #f0f0f0;
}
/* Selects every third paragraph (3, 6, 9, ...) */
p:nth-child(3n) {
font-weight: bold;
}
/* Selects the first 3 items (1, 2, 3) */
.item:nth-child(-n+3) {
border-bottom: 1px solid blue;
}
/* Selects the 5th child */
div:nth-child(5) {
color: red;
}
Examples of :nth-child()
usage with various patterns.
:nth-child()
counts all siblings, regardless of their tag name. If you have a div
followed by a p
and then another div
, div:nth-child(2)
would select the p
element if it's the second child, not the second div
.Understanding :nth-of-type()
Similar to :nth-child()
, :nth-of-type(an+b)
selects elements based on their position, but it only counts siblings of the same element type. This is crucial when you want to target, for example, the second p
tag within a parent, even if there are div
s or span
s before it.
/* Selects every second paragraph among its paragraph siblings */
p:nth-of-type(even) {
color: blue;
}
/* Selects the first list item of its type */
li:nth-of-type(1) {
list-style-type: square;
}
/* Selects the last paragraph of its type */
p:nth-last-of-type(1) {
border-top: 1px dashed gray;
}
Examples of :nth-of-type()
and :nth-last-of-type()
.
Variations: :nth-last-child()
and :nth-last-of-type()
These pseudo-classes work identically to their nth-child
and nth-of-type
counterparts, but they count from the end of the list of siblings rather than the beginning. This is useful for styling the last few items without knowing the total count.
/* Selects the last list item */
li:nth-last-child(1) {
font-style: italic;
}
/* Selects the second to last paragraph of its type */
p:nth-last-of-type(2) {
text-decoration: underline;
}
Using :nth-last-child()
and :nth-last-of-type()
.
Shorthand: :first-child
, :last-child
, :first-of-type
, :last-of-type
, :only-child
, :only-of-type
For common scenarios, CSS provides convenient shorthands:
:first-child
is equivalent to:nth-child(1)
.:last-child
is equivalent to:nth-last-child(1)
.:first-of-type
is equivalent to:nth-of-type(1)
.:last-of-type
is equivalent to:nth-last-of-type(1)
.:only-child
selects an element that is the only child of its parent.:only-of-type
selects an element that is the only child of its type within its parent.
/* Styles the first child of any parent */
*:first-child {
margin-top: 0;
}
/* Styles a paragraph only if it's the sole paragraph within its parent */
p:only-of-type {
text-align: center;
}
Shorthand pseudo-classes for common selections.
an+b
syntax is incredibly flexible. For example, 3n+1
selects the 1st, 4th, 7th, etc., elements. n
alone selects all elements (1, 2, 3, ...), and -n+b
selects the first b
elements.