2012-09-05 10 views
513

Tengo div etiqueta que contiene varias etiquetas ul.¿Cómo puedo usar un selector no: primer hijo?

Si yo tratando propiedades CSS fijadas solo por primera ul etiqueta, y este código funciona:

div ul:first-child { 
    background-color: #900; 
} 

cuando quiero establecer las propiedades CSS para cada etiqueta ul excepto el primero, he intentado esto:

div ul:not:first-child { 
    background-color: #900; 
} 

también esto:

div ul:not(:first-child) { 
    background-color: #900; 
} 

y esto:

div ul:first-child:after { 
    background-color: #900; 
} 

Pero a ningún efecto. ¿Cómo debo escribir en CSS: "cada elemento, excepto el primero"?

+6

li: no (: first-child) – zloctb

Respuesta

886

Una de las versiones que registró actually works para todos los navegadores modernos (donde CSS selectors level 3 son supported):

div ul:not(:first-child) { 
    background-color: #900; 
} 

Si tiene que soportar navegadores antiguos, o si se ven obstaculizados por la :not selector de limitation (sólo acepta un simple selector como argumento) luego puede usar otra técnica:

Defina una regla que tenga un alcance mayor de lo que pretende y luego "revoque" condicionalmente, limitando su alcance a lo que pretende:

div ul { 
    background-color: #900; /* applies to every ul */ 
} 

div ul:first-child { 
    background-color: transparent; /* limits the scope of the previous rule */ 
} 

Al limitar el alcance del uso default value para cada atributo CSS que está configurando.

+0

@OTARIKI: En realidad ': no (: first-child)' funciona - por favor, eche un vistazo a la actualización. – Jon

+1

Ups, por alguna razón esto no funcionaba en mi Chrome, (primero probando este código solo en Chrome), ahora pruebo esto en otros navegadores y el código funciona. problema resuelto, gracias :) – RIKI

+0

¿sabe exactamente en qué versiones no es compatible? –

51

Bueno ya :not no es aceptada por IE6 ~ 8, me gustaría sugerir esto:

div ul:nth-child(n+2) { 
    background-color: #900; 
} 

Así que recoger todos los ul en su elemento padre excepto el primero.

hacen referencia al artículo "Useful :nth-child Recipes" de Chris Coyer para más nth-childexamples.

+7

En realidad, debería ser (n + 2) para obtener el 2 ° elemento y seguir adelante AKA omita el primer elemento – stuyam

+1

@Yamartino tiene razón, debería ser n + 2, sería bueno obtener esta respuesta editada. –

+2

@ ed1nk0 He editado su respuesta para corregir el selector, por favor siéntase libre de retroceder si he subvertido sus intenciones aquí :) De lo contrario, +1 - esta es la mejor manera de seleccionar todo menos el primer elemento. – jammypeach

126

Esta solución CSS2 ("cualquier ul después de otra ul") funciona también y es compatible con más navegadores.

div ul + ul { 
    background-color: #900; 
} 

diferencia de :not y :nth-sibling, el adjacent sibling selector está soportado por IE7 +.

Si tiene JavaScript cambia estas propiedades después de la página se carga, usted debe buscar en algunos errores conocidos en la IE7 y IE8 implementaciones de este. See this link.

Para cualquier página web estática, esto debería funcionar perfectamente.

+0

El selector '+' no parece funcionar en IE7. – Leven

+3

@Leven: Ese [enlace de quirksmode] (http://www.quirksmode.org/css/selectors/) dice que debería funcionar en IE7, pero solo estáticamente. Si su JS coloca otro elemento delante de él, es posible que no se actualice correctamente. ¿Es ese el problema que viste? –

+0

podría valer la pena señalar que en una secuencia de elementos como: 'ul ul div ul' (donde estos elementos son hermanos), solo se seleccionará el segundo ul, ya que el último no tiene un' ul' anterior a sí mismo –

14
div li~li { 
    color: red; 
} 

Soporta IE7

0

not(:first-child) no parece funcionar. Al menos con las versiones más recientes de Chrome y Firefox.

En su lugar, intente esto:

ul:not(:first-of-type) {} 
+0

Ambos trabajan, pero tienen un significado diferente. 'ul: not (: first-child)' significa literalmente "cualquier elemento' ul' que no sea primer hijo de su elemento primario ", por lo que no coincidirá ni siquiera con el primer' ul' si está precedido por otro elemento ('p ', partida, etc.). Por el contrario, 'ul: not (: first-of-type)' significa "cualquier elemento' ul' excepto el 1er 'ul' en el contenedor". Tienes razón en que OP probablemente necesitó el último comportamiento, pero tu explicación es bastante engañosa. –

Cuestiones relacionadas