El enésimo hijo
Seleccionar al enésimo hijo con :nth-child()
En el CSS3 podemos seleccionar al enésimo hijo de una caja padre utilizando el selector :nth-child
( de hecho una pseudo-clase ).
Por ejemplo: dada una lista <ul>
de 5 artículos, li:nth-child(3)
selecciona el tercer artículo de la lista.
#ul1 li:nth-child( 3 ){ background-color:LightSkyBlue;}
- artículo 1
- artículo 2
- artículo 3
- artículo 4
- artículo 5
- artículo 1
- artículo 2
- artículo 3
- artículo 4
- artículo 5
Pero el selector :nth-child
puede hacer mucho más que esto.
Utilizando palabras clave
Podemos seleccionar los hijos impares ( odd
) o pares ( even
) utilizando las palabras clave odd
o even
.
Por ejemplo: dada la misma lista <ul>
de 5 artículos , li:nth-child( even )
selecciona los artículos 2 y 4, ( los amarillos ) mientras que li:nth-child( odd )
selecciona los artículos 1, 3 y 5 ( los azules ).
#ul2 li:nth-child( even ){ background-color:Gold;}
#ul2 li:nth-child( odd ){ background-color:LightSkyBlue;}
- artículo 1
- artículo 2
- artículo 3
- artículo 4
- artículo 5
- artículo 1
- artículo 2
- artículo 3
- artículo 4
- artículo 5
Utilizando fórmulas :nth-child( an+b )
También podemos utilizar fórmulas, lo que es fantástico e inusual si pensamos que esto es CSS. Por ejemplo li:nth-child(2n)
selecciona todos los hijos pares, mientras que li:nth-child(3n)
selecciona cada hijo cuyo índice es un múltiplo de 3.
#ul3 li:nth-child( 2n ){ background-color:LightSkyBlue;}
#ul3 li:nth-child( 3n ){ background-color:Gold;}
- artículo 1
- artículo 2
- artículo 3
- artículo 4
- artículo 5
- artículo 1
- artículo 2
- artículo 3
- artículo 4
- artículo 5
Pero podemos hacer cosas todavía más complicadas y más interesantes: li:nth-child(2n+1)
selecciona los elementos 1, 3, 5 y 7 de la siguiente lista.
#ul4 li:nth-child( 2n+1 ){ background-color:LightSkyBlue;}
- artículo 1
- artículo 2
- artículo 3
- artículo 4
- artículo 5
- artículo 6
- artículo 7
- artículo 1
- artículo 2
- artículo 3
- artículo 4
- artículo 5
- artículo 6
- artículo 7
¿Como lo hace? y ¿qué significa n?
El parámetro n
es un contador que empieza a 0. Para entender porque li:nth-child(2n+1)
selecciona los elementos 1, 3, 5 y 7 miremos la siguiente tabla:
El parámetro n | 2n+1 | = |
---|---|---|
0 | 2*0+1 | 1 |
1 | 2*1+1 | 3 |
2 | 2*2+1 | 5 |
3 | 2*3+1 | 7 |
La formula que hemos utilizado se puede escribir así: nth-child(an+b)
. En el ejemplo anterior a
= 2, y b
=1. Los parámetros a
y b
son números enteros y pueden tomar tanto valores positivos como negativos.
www.sitepoint.com pública, en un artículo interesante acerca del selector nth-child
, esta tabla muy útil con los valores resultantes para nth-child(an+b)
:
n | 2n+1 | 4n+1 | 4n+4 | 4n | 5n-2 | -n+3 |
---|---|---|---|---|---|---|
0 | 1 | 1 | 4 | - | - | 3 |
1 | 3 | 5 | 8 | 4 | 3 | 2 |
2 | 5 | 9 | 12 | 8 | 8 | 1 |
3 | 7 | 13 | 16 | 12 | 13 | - |
4 | 9 | 17 | 20 | 16 | 18 | - |
5 | 11 | 21 | 24 | 20 | 23 | - |
Utilizando varios selectores nth-child concatenados
En el siguiente ejemplo utilizamos dos selectores nth-child
concatenados. El primer selector
li:nth-child(-n+16)
selecciona las primeras 16 autonomías de la lista. Si concatenamos otro selector, por ejemplo:
li:nth-child(-n+16):nth-child( 2n+4 )
de las primeras 16 autonomías ( el primer selector ) seleccionamos solo los elementos pares ( 2n+4 ) , empezando con el cuarto ( 2n+4 ).
#autonomias li:nth-child(-n+16){ background-color:Gold;}
#autonomias li:nth-child(-n+16):nth-child(2n+4){ background-color:LightSkyBlue;}
- Andalucía
- Cataluña
- Comunidad de Madrid
- Comunidad Valenciana
- Galicia
- Castilla y León
- País Vasco
- Canarias
- Castilla-La Mancha
- Región de Murcia
- Aragón
- Islas Baleares
- Extremadura
- Principado de Asturias
- Navarra
- Cantabria
- La Rioja
- Ceuta
- Melilla
- Andalucía
- Cataluña
- Comunidad de Madrid
- Comunidad Valenciana
- Galicia
- Castilla y León
- País Vasco
- Canarias
- Castilla-La Mancha
- Región de Murcia
- Aragón
- Islas Baleares
- Extremadura
- Principado de Asturias
- Navarra
- Cantabria
- La Rioja
- Ceuta
- Melilla
Alternancia de etiquetas
Utilizar una lista puede ser bastante ilustrativo, pero veamos que pasa si utilizamos una alternancia de títulos ( headers ) y párrafos.
Hijo 1 ( encabezado h6 )
hijo 2 ( párafo 1 )
hijo 3 ( párafo 2 )
hijo 4 ( párafo 3 )
Hijo 5 ( encabezado h6 )
hijo 6 ( párafo 4 )
hijo 7 ( párafo 5 )
div#enesimoHijo{width:200px; margin:0 auto; padding:3px; border:1px solid #d9d9d9;}
div#enesimoHijo p, div#enesimoHijo h6{ padding:2px 10px; margin:2px 0;}
#enesimoHijo p:nth-child(2n+1){border: 1px solid red;background-color:Chartreuse;}
Hijo 1 ( encabezado h6 )
hijo 2 ( párafo 1 )
hijo 3 ( párafo 2 )
hijo 4 ( párafo 3 )
Hijo 5 ( encabezado h6 )
hijo 6 ( párafo 4 )
hijo 7 ( párafo 5 )
Mirando la tabla de arriba llegamos a la conclusión que p:nth-child(2n+1)
tiene que seleccionar los hijos 1, 3, 5 y 7. ¿Qué pasó? Los encabezados son también hijos del
<div id="enesimoHijo">
, pero nosotros seleccionamos solo los parafos que cumplen la condición.
Si queremos seleccionar los párrafos 1, 3, 5. . . tenemos que utilizar otro selector :nth-of-type
( el enésimo de su tipo ).
div#enesimoDeSuTipo{width:200px; margin:0 auto; padding:3px; border:1px solid #d9d9d9;}
div#enesimoDeSuTipo p, div#enesimoHijo h6{ padding:2px 10px; margin:2px 0;}
#enesimoDeSuTipo p:nth-of-type(2n+1){border: 1px solid red;background-color:Chartreuse;}
Hijo 1 ( encabezado h6 )
hijo 2 ( párafo 1 )
hijo 3 ( párafo 2 )
hijo 4 ( párafo 3 )
Hijo 5 ( encabezado h6 )
hijo 6 ( párafo 4 )
hijo 7 ( párafo 5 )
Hijo 1 ( encabezado h6 )
hijo 2 ( párafo 1 )
hijo 3 ( párafo 2 )
hijo 4 ( párafo 3 )
Hijo 5 ( encabezado h6 )
hijo 6 ( párafo 4 )
hijo 7 ( párafo 5 )
Otras pseudo-clases
En el CSS3 hay otras pseudo-clases que permiten seleccionar de la misma manera múltiples elementos según su posición en el DOM ( Document Object Model ). Estas pseudo-clases son:
Selector | Ejemplo | Descripción |
---|---|---|
:nth-child(n) | p:nth-child(2) | Selecciona cada <p> que sea el segundo hijo de su padre. |
:nth-last-child(n) | p:nth-last-child(2) | Selecciona todos los <p> que sean el penúltimo hijo de su padre. ( El segundo a partir del último ) |
:nth-of-type(n) | p:nth-of-type(2) | Selecciona cada <p> que sea el segundo <p> hijo de su padre. |
:nth-last-of-type(n) | p:nth-last-of-type(2) | Selecciona todos los <p> que sean el penúltimo <p> hijo de su padre. ( El segundo a partir del último ) |