nth-child

nth-child() es una pseudo-clase que selecciona a los elementos en un grupo de hermanos que coinciden con el patrón especificado.

/* Tercer elemento */
li:nth-child(3) {
    background: red;
}

/* Todos los elementos pares */
li:nth-child(2n) {
    background: green;
}

/* Todos los elementos impares */
li:nth-child(2n+1) {
    background: blue;
}

La forma en la que se construye dicho patrón va desde palabras clave, valores enteros, una fórmula e incluso selectores.

<ul>
  <li>Elemento 01</li>
  <li>Elemento 02</li>
  <li>Elemento 03</li>
  <li>Elemento 04</li>
  <li>Elemento 05</li>
</ul>
li:nth-child(patrón) { ... }

Palabras clave

Para las palabras clave solo existen dos opciones, pares o impares.

odd

Representa todos los elementos impares del grupo de hermanos.

li:nth-child(odd) {
  background: green; 
}

even

Representa todos los elementos pares del grupo de hermanos.

li:nth-child(even) {
  background: green;
}

Valores enteros

Cuando se especifica un número entero, solo se selecciona el elemento especificado y no más.

nth-child(3)

Selecciona solo el tercer elemento del grupo de hermanos.

li:nth-child(3) {
  background: red;
}

Fórmulas

Seleccionan todos los elementos coincidentes del grupo de hermanos a partir de un patrón que utiliza la fórmula An+B.

  • A: Un valor entero.
  • n:  El Valor literal "n" representa todos los números enteros positivos, comenzando desde 0.
  • +: Es el operador de la fórmula y puede ser + o -.
  • B: Un valor entero requerido si existe el operador en la fórmula.

Lo sé, es confuso y puede que hasta este punto aún no se entienda en que consisten las fórmulas o como es su funcionamiento. Para ello lo explicaré paso por paso.

Hay que imaginar un iterador, en donde se va a ir número por número (n) verificando que se cumpla la condición y así poder seleccionar un elemento.

Por ejemplo, en el caso de los elementos impares, la fórmula que representa odd sería:

li:nth-child(2n+1) { ... }

Y se desglosaría de la siguiente forma:

2n + 1

2 x 0 + 1 = 1 /* Selecciona el primer elemento */
2 x 1 + 1 = 3 /* Selecciona el tercer elemento */
2 x 2 + 1 = 5 /* Selecciona el quinto elemento */
2 x 3 + 1 = 7 /* Selecctiona el séptimo elemento */

...

Como puedes ver, el factor clave es n, que va cambiando como hace un iterador, especificando que el resultado de la operación sea el número a seleccionar.

Para el caso de los pares, la fórmula que representa even sería:

li:nth-child(2n) { ... }

El desglose sería el siguiente:

2n

2 x 0 = 0 /* No selecciona nada */
2 x 1 = 2 /* Selecciona el segundo elemento */
2 x 2 = 4 /* selecciona el cuarto elemento */
2 x 3 = 6 /* Sekecciona el sexto elemento */

A continuación varias fórmulas útiles para entender mejor el concepto, recuerda desglosar la fórmula si no entiendes la selección.

nth-child(n+3)

Selecciona todos los elementos a partir del tercero.

li:nth-child(n+3) {
  background: blue;
}

nth-child(-n+3)

Selecciona solo los tres primeros elementos.

li:nth-child(-n+3) {
  background: blue;
}

nth-child(3n-2)

Selecciona un elemento por cada 2 de ellos, a partir del primer elemento.

li:nth-child(3n-2) {
	background: blue;
}

Selectores

Finalmente otra forma de usar nth-child es por medio de los selectores, utilizando la palabra clave of.  Esto puede ser muy útil en el caso de contenido mixto.

Por ejemplo, al querer seleccionar solo las primeras 3 imágenes de un grupo de hermanos. Las clases .image para representar imágenes y .video para representar videos.

<section class="container">
  <div class="image"></div>
  <div class="video"></div>
  <div class="video"></div>
  <div class="image"></div>
  <div class="video"></div>
  <div class="image"></div>
  <div class="image"></div>
  <div class="video"></div>
  <div class="image"></div>
  <div class="video"></div>
</section>
.container div:nth-child(-n+3 of .image) {
  border: 1px solid red;
}
Advertencia

De momento la característica de usar selectores con nth-child es muy limitada. Te recomiendo checar la compatibilidad en CanIUse.

Recursos

Comparte tu opinión o duda:
Se parte de mi newsletter

Compartiré contigo las últimas novedades del sitio y otros recursos sobre desarrollo web que no te puedes perder.