css-pseudo-clases-estructurales

Pseudo-clases estructurales en CSS para seleccionar hijos

  • 4 min

Las pseudo-clases estructurales en CSS son selectores basados en la posición del elemento dentro de su contenedor.

Ya hemos visto cómo seleccionar elementos por etiqueta (p), clase (.boton) o ID (#cabecera). Eso está bien para decir “quiero este tipo de elemento”.

Pero muchas veces queremos algo más fino: el primer elemento de una lista, el último enlace de un menú, las filas pares de una tabla o cada tercera tarjeta de una galería.

Para eso usamos pseudo-clases estructurales. No miran si el usuario está encima con el ratón, ni si un campo tiene foco. Miran dónde está colocado el elemento dentro del árbol HTML.

Primer y último elemento

Las pseudo-clases y ` seleccionan un elemento si es, respectivamente, el primer o el último hijo de su padre.

li:first-child {
    font-weight: bold;
}

li:last-child {
    border-bottom: none;
}
Copied!

Esto es muy habitual para quitar separadores del último elemento de una lista, destacar el primer resultado o ajustar márgenes sin tener que añadir clases extra en el HTML.

<ul class="menu">
    <li>Inicio</li>
    <li>Servicios</li>
    <li>Contacto</li>
</ul>
Copied!

:first-child no significa “el primer <li> que encuentre por ahí”. Significa “este elemento es el primer hijo de su padre”.

Seleccionar por posición con :nth-child()

La pseudo-clase () selecciona elementos según su posición entre hermanos. Es perfecta para listas, tablas o colecciones repetidas.

/* Filas pares de una tabla */
tr:nth-child(even) {
    background-color: #f5f5f5;
}

/* El tercer elemento de una lista */
li:nth-child(3) {
    font-weight: bold;
}
Copied!

Esto nos permite crear patrones visuales sin llenar el HTML de clases artificiales.

<ul>
    <li>Primer elemento</li>
    <li>Segundo elemento</li>
    <li>Tercer elemento</li>
</ul>
Copied!

:nth-of-type()

La pseudo-clase :key[:nth-of-type()] se parece a :nth-child(), pero solo cuenta elementos del mismo tipo de etiqueta.

<section>
    <h2>Título</h2>
    <p>Primer párrafo</p>
    <p>Segundo párrafo</p>
    <p>Tercer párrafo</p>
</section>
Copied!
/* Selecciona el segundo párrafo, ignorando el h2 */
p:nth-of-type(2) {
    background: #fef3c7;
}
Copied!

Con p:nth-child(2) seleccionaríamos el primer párrafo, porque es el segundo hijo de section. Con p:nth-of-type(2) seleccionamos el segundo <p>. La diferencia está en qué está contando el navegador.

Otros selectores estructurales útiles

Hay algunas pseudo-clases más que conviene tener localizadas, aunque no las uséis todos los días.

  • :only-child: Selecciona un elemento si es el único hijo de su padre.
  • :first-of-type: Selecciona el primer elemento de su tipo.
  • :last-of-type: Selecciona el último elemento de su tipo.
  • :empty: Selecciona elementos que no tienen contenido.
.mensaje:empty {
    display: none;
}

article p:first-of-type {
    font-size: 1.1rem;
}
Copied!