2009-07-25 12 views
256

Estoy un poco confundido entre estos 2 selectores.CSS Child vs Descendant selectores

¿El descendiente selector:

div p 

seleccionar todos p dentro de un div si es o no es un descedent inmediata? Entonces, si el p está dentro de otro div, ¿seguirá siendo seleccionado?

Entonces el niño selector:

div > p 

Cuál es la diferencia? ¿Significa un niño inmediato niño? P.ej.

<div><p> 

vs

<div><div><p> 

ambos serán seleccionados, o no?

+0

he tratado de explicar [aquí] (http://stackoverflow.com/a/22632849/1542290) en detalle, se puede referir sólo en caso si es útil a cualquiera ... –

Respuesta

400

Basta pensar en lo que las palabras "niño" y "descendientes" significan en Inglés:

  • Mi hija es a la vez mi hijo y mi descendiente
  • Mi nieta no es mi hijo, pero ella es mi descendiente.
+35

Una nota importante es que un selector de niños va a ser más rápido que el selector de descendientes, lo que puede tener un efecto visible en páginas con miles de elementos de DOM. –

+90

Odio ser ese tipo, pero estoy seguro de que te refieres a 'efecto'. Ah, y por odio, me refiero al amor, por supuesto. – marcusklaas

+11

Afectará la página, pero tendrá un efecto en la página. –

42

Sí, estás en lo cierto. div p coincidirá con el siguiente ejemplo, pero div > p no lo hará.

<div><table><tr><td><p> <!... 

El primero se llama descendant selector y el segundo se llama child selector.

8

Tenga en cuenta que el selector niño no es compatible en Internet Explorer 6. (Si utiliza el selector en un selector de jQuery/Prototype/YUI etc. en vez de en una hoja de estilo que todavía funciona, aunque)

+0

estoy pensando que lo uso en CSS.pero en jquery detecto si el navegador es ie6 (en jquery ¿puedo hacer esto? o ¿necesito usar ) y agrego una clase – iceangel89

+2

jquery hago sniffing en lugar de sniffing de navegador así que me pongo No creo que puedas detectar si el navegador es ie6. Y no deberías. Lo mejor es incluir una hoja de estilo adicional para ie6 con comentarios condicionales como los que describió. – rlovtang

20

Bascailly, "ab" selecciona todos los hostales del interior de una, mientras que "a> b" selecciona de b lo son sólo los niños a la un, no va a seleccionar b lo que es hijo de b lo que es hijo de a.

Este ejemplo ilustra la diferencia:

div span{background:red} 
div>span{background:green} 

<div><span>abc</span><span>def<span>ghi</span></span></div> 

Color de fondo de ABC y DEF será de color verde, pero ghi tendrá color de fondo rojo.

IMPORTANTE: Si cambia el orden de las reglas para:

div>span{background:green} 
div span{background:red} 

Todas las cartas tendrán fondo rojo, porque el selector descendiente selecciona niño es demasiado.

+0

La sección "Importante" que agregó hace que esta respuesta se complete. ¡Gracias! –

2
div p

Selecciona todos 'p' elementos en los que el padre es un elemento 'div'

div > p

significa hijos inmediatos selecciona todos los elementos 'p', donde el padre es un elemento 'div'

6

En teoría: niño => un descendiente inmediato de un antepasado (por ejemplo, Joe y su padre)

Descendiente => cualquier elemento que desciende de un antepasado en particular (p. Joe y su tatara-abuelo)

En la práctica: tratar este código HTML:

<div class="one"> 
    <span>Span 1. 
    <span>Span 2.</span> 
    </span> 
</div> 

<div class="two"> 
    <span>Span 1. 
    <span>Span 2.</span> 
    </span> 
</div> 

con este CSS:

span { color: red; } 
div.one span { color: blue; } 
div.two > span { color: green; } 

http://jsfiddle.net/X343c/1/

+0

Interesante en qué navegador lo ha probado, ya que parece funcionar de hecho –

+1

FYI, CSS en respuesta no coincide con CSS en JSFiddle ('rojo' y' azul' intercambiado). – Pang

-1

selección CSS y la aplicación de estilo a un elemento en particular se puede realizar atravesando el elemento dom [Ejemplo

Example

.a .b .c .d{ 
    background: #bdbdbd; 
} 
div>div>div>div:last-child{ 
    background: red; 
} 
<div class='a'>The first paragraph. 
<div class='b'>The second paragraph. 
    <div class='c'>The third paragraph. 
    <div class='d'>The fourth paragraph.</div> 
    <div class='e'>The fourth paragraph.</div> 
    </div> 
</div> 
</div> 
Cuestiones relacionadas