Selectores CSS avanzados

Ahora que IE 6 parece que está empezando a desaparecer de nuestras vidas (casi la mitad de los usuarios de IE se han pasado al 7) y por tanto de nuestras pesadillas, sería bueno recordar algunos de los selectores que por su culpa nos hemos podido utilizar de forma normal.

Artículos recientes

Ahora que IE 6 parece que está empezando a desaparecer de nuestras vidas (casi la mitad de los usuarios de IE se han pasado al 7) y por tanto de nuestras pesadillas, sería bueno recordar algunos de los selectores que por su culpa nos hemos podido utilizar de forma normal.

Todos tenemos en mente el selector universal (* {...}), el selector de tipo o etiqueta (p {...}), el selector descendente (p span {...}), el selector de clase (.clase {...}) y el selector de id (#id {...}). Pero, ¿alguien recuerda el selector de hijos, el selector de adyacentes o el selector de atributos?

Estos selectores (entre otros muchos) han sido los grandes damnificados del aplastante dominio tiránico que ha ejercido IE 6 a lo largo de los años. Este tipo de selectores no funcionan con este "navegador" por lo que no se ha podido hacer uso de ellos abogando por el "bien común".

Pasemos a ver cómo funcionan algunos de estos selectores:

Selector de hijos:

Se trata de un selector similar al selector descendente, pero muy diferente en su funcionamiento. Se utiliza para seleccionar un elemento que es hijo directo de otro elemento y se indica mediante el "signo de mayor que" (>). Por ejemplo:

p > span { color: blue; }  

<p><span>Texto1</span></p>  

<p><a href="#"><span>Texto2</span></a></p>

En el ejemplo anterior, el selector p &gt; span se interpreta como "cualquier elemento &lt;span&gt; que sea hijo directo de un elemento &lt;p&gt;", por lo que el primer elemento &lt;span&gt; cumple la condición del selector. Sin embargo, el segundo elemento &lt;span&gt; no la cumple porque es descendiente pero no es hijo directo de un elemento &lt;p&gt;.

Selector adyacente:

El selector adyacente utiliza el signo + y su sintaxis es:

elemento1 + elemento2 { ... }

La explicación del comportamiento de este selector no es sencilla, ya que selecciona todos los elementos de tipo elemento2 que cumplan las dos siguientes condiciones:

  • elemento1 y elemento2 deben ser hermanos, por lo que su elemento padre debe ser el mismo.
  • elemento2 debe aparecer inmediatamente después de elemento1 en el código HTML de la página.
    En el siguiente ejemplo:
h1 + h2 { color: red }  

<body>  
<h1>Titulo1</h1>  

<h2>Subtítulo</h2>  
...  

<h2>Otro subtítulo</h2>  
...  
</body>

Los estilos del selector h1 + h2 se aplican al primer elemento &lt;h2&gt; de la página, pero no al segundo &lt;h2&gt;, ya que:

  • El elemento padre del primer &lt;h2&gt; es &lt;body&gt;, el mismo padre que los dos elementos &lt;h2&gt;.
  • El primer elemento &lt;h2&gt; aparece en el código HTML justo después del elemento &lt;h1&gt;, por lo que se cumple la segunda condición.
  • El segundo elemento &lt;h2&gt; no aparece justo después del elemento &lt;h1&gt;, por lo que no se cumple la segunda condición y el selector h1 + h2 no se aplica en el segundo elemento &lt;h2&gt;.

Selector de atributos:

El último tipo de selectores avanzados lo forman los selectores de atributos, que permiten seleccionar elementos HTML en función de sus atributos y/o valores de esos atributos.

Los cuatro tipos de selectores de atributos son:

  • [nombre_atributo], selecciona los elementos que tienen establecido el atributo llamado nombre_atributo, independientemente de su valor.
  • [nombre_atributo=valor], selecciona los elementos que tienen establecido un atributo llamado nombre_atributo con un valor igual a valor.
  • [nombre_atributo~=valor], selecciona los elementos que tienen establecido un atributo llamado nombre_atributo y al menos uno de los valores del atributo es valor.
  • [nombre_atributo|=valor], selecciona los elementos que tienen establecido un atributo llamado nombre_atributo y cuyo valor es una serie de palabras separadas con guiones, pero que comienza con valor. Este tipo de selector sólo es útil para los atributos de tipo lang que indican el idioma del contenido del elemento.
    A continuación se muestran algunos ejemplos de estos tipos de selectores:
/* Se muestran de color azul todos los enlaces que tengan  
un atributo "class", independientemente de su valor */  

a[class] { color: blue; }  

/* Se muestran de color azul todos los enlaces que tengan  
un atributo "class" con el valor "externo" */  

a[class="externo"] { color: blue; }  

/* Se muestran de color azul todos los enlaces que apunten  
al sitio "http://www.ejemplo.com" */  

a[href="http://www.ejemplo.com"] { color: blue; }  

/* Se muestran de color azul todos los enlaces que tengan  
un atributo "class" en el que al menos uno de sus valores  
sea "externo" */  

a[class~="externo"] { color: blue; }  

/* Selecciona todos los elementos de la página cuyo  
atributo "lang" sea igual a "en", es decir,  
 todos los elementos en inglés */  

*[lang=en] { ... }  

/* Selecciona todos los elementos de la página cuyo  
atributo "lang" empiece por "es", es decir,  
 "es", "es-ES", "es-AR", etc. */  

*[lang|="es"] { color : red }

Estos son algunos de los "olvidados" que pueden volver con más fuerza a medida que el "demonio" (cámbiese por IE 6) desaparezca de nuestras vidas.

Por último, una aplicación que te dice qué selectores son válidos para el navegador que usas en ese momento:
Test de selectores CSS en red