juanjonavarro.com

secciones

Dar estilos distintos según el número de elementos sólo con CSS

Una cosa con la que nos enfrentamos a veces es con la necesidad de dar estilos distintos dependiendo de cuantos elementos haya en un grupo. Un ejemplo sería dar un color a unos párrafos cuando sólo hay entre 1 y 3 párrafos, y otro color cuando el número de párrafos es mayor que 3. Lo que queremos no es dar un color distinto a los 3 primeros párrafos, sino que todos los párrafos tomen un color u otro dependiendo del número total.

Para esto existen varias soluciones:

  • Podemos contar los párrafos en el lenguaje de programación de servidor (JSP, PHP) y dar una clase u otra a los párrafos (o al elemento padre) dependiendo del número total de elementos. Esto es lo más usual, pero es verdad que esto nos obliga a modificar la programación cuando el criterio cambia (se pasa de 3 a 4, por ejemplo) además de que obliga a meter clases adicionales.
<div class="<?php print $parrafos > 3 ? "muchos" : "pocos"; ?>">
// Inserción de los párrafos
</div>
  • Otra solución es utilizar javascript (jquery, por ejemplo) para insertar las mismas clases dinámicamente, como en este ejemplo (aquí el ejemplo funcionando en Codepen)
$('div').each(function() {
  var hijos=$(this).children('p');
  if (hijos.length > 3) {
    $(this).addClass('muchos');
  } else {
    $(this).addClass('pocos');
  }
});

Ahora, gracias a este artículo en A List Apart podemos ver un método puramente CSS. Básicamente, consiste en utilizar el siguiente selector:

div p:nth-last-child(n+4):first-child,
div p:nth-last-child(n+4):first-child ~ p {
  background-color: #faa;
}

En el ejemplo anterior se daría ese color para 4 elementos o más. Puedes verlo en funcionamiento en este CodePen donde he puesto cómo se seleccionarían N, más de N o menos de N.

See the Pen dPjWgE by Juanjo Navarro (@juanjonavarro) on CodePen.

El artículo en A List Apart está además muy bien explicado, utilizando cada vez selectores más complejos hasta llegar a esta solución y tiene algunos selectores relacionados interesantes.

Comentarios cerrados para este artículo