nth-of-type es una pseudo-clase que selecciona a los elementos en un grupo de hermanos que coinciden con el patrón especificado y su ordenamiento de origen.
/* Tercer elemento <p> */
p:nth-of-type(3) {
background: red;
}
/* Todos los elementos impares <p> */
p:nth-of-type(2n+1) {
background: blue;
}La forma en la que se construye dicho patrón es usando 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-of-type(patrón) { ... }nth-of-type(3)
Selecciona solo el tercer elemento del grupo de hermanos.
p:nth-of-type(3) {
background: red;
}Para más detalles sobre que patrones podrías aplicar, te recomiendo ver :nth-child.
nth-child vs. nth-of-type
Las pseudo-clases son completamente iguales en el caso de tener los mismos elementos dentro de un padre, no hay una diferencia visual.
<section>
<p>Elemento 01</p>
<p>Elemento 02</p>
<p>Elemento 03</p>
<p>Elemento 04</p>
<p>Elemento 05</p>
</section>
p:nth-child(2) {
background: pink;
}
p:nth-of-type(2) {
background: yellow;
}
La diferencia radica cuando hay otro tipo de elementos dentro del padre.
<section>
<strong>Elemento 01</strong>
<p>Elemento 02</p>
<p>Elemento 03</p>
<p>Elemento 04</p>
<p>Elemento 05</p>
</section>
p:nth-child(2) {
background: pink;
}
p:nth-of-type(2) {
background: yellow;
}
Esto pasa porque nth-child comprueba que el elemento sea exactamente el segundo hijo del padre y que también sea un elemento <p>. Se enfoca en la posición y el elemento.
Mientras que nth-of-type comprueba que se seleccione el segundo elemento <p> del padre. Se enfoca en el tipo de elemento.
Es decir, nth-child es más estricto al momento de buscar una coincidencia.
Otra forma de verlo es que nth-child comienza a contar desde el primer elemento del padre, sin importar el tipo y nth-of-type comienza a contar desde el elemento especificado.
Para nth-child el conteo sucede así:
<section>
<strong>Elemento 01</strong> <!-- Primer elemento -->
<p>Elemento 02</p> <!-- Segundo elemento -->
<p>Elemento 03</p> <!-- Tercer elemento -->
<p>Elemento 04</p> <!-- Cuarto elemento -->
<p>Elemento 05</p> <!-- Quinto elemento -->
</section>
Y para nth-of-type el conteo sucede así:
<section>
<strong>Elemento 01</strong> <!-- No cuenta -->
<p>Elemento 02</p> <!-- Primer elemento -->
<p>Elemento 03</p> <!-- Segundo elemento -->
<p>Elemento 04</p> <!-- Tercer elemento -->
<p>Elemento 05</p> <!-- Cuarto elemento -->
</section>
Tomando esos detalles en cuenta, el siguiente código no tendría efecto para nth-child:
p:nth-of-type(1) {
background: yellow;
}
p:nth-child(1) {
background: pink;
}¿Por qué?
Porque sencillamente el primer elemento no es un <p>, sino un <strong> y no se cumple la condición para nth-child. Pero, si para nth-of-type.