2009-07-25 9 views
256

Je suis un peu confus entre ces 2 sélecteurs.Sélecteur CSS enfant vs descendant

Est-ce que le descendant sélecteur:

div p 

sélectionner tous p dans un div si oui ou non il est un descedent immédiat? Donc, si le p est dans un autre div, il sera toujours sélectionné?

Puis le enfant sélecteur:

div > p 

Quelle est la différence? Est-ce qu'un enfant signifie immédiat enfant? Par exemple.

<div><p> 

vs

<div><div><p> 

seront tous deux sélectionnés, ou non?

+0

J'ai essayé d'expliquer [ici] (http://stackoverflow.com/a/22632849/1542290) en détail, peut se référer simplement si son Incase utile à tout le monde ... –

Répondre

400

Il suffit de penser à ce que les mots « enfant » et « descendant » signifie en anglais:

  • Ma fille est à la fois mon enfant et mon descendant
  • Ma petite-fille est pas mon enfant, mais elle est ma descendant.
+35

Une note importante est qu'un sélecteur enfant va être plus rapide que le sélecteur descendant, ce qui peut avoir un effet visible sur les pages avec des milliers d'éléments DOM. –

+90

Je déteste être ce type, mais je suis sûr que vous voulez dire 'effet'. Oh et par la haine, je veux dire l'amour bien sûr. – marcusklaas

+11

Cela affectera la page, mais aura un effet sur la page. –

42

Oui, vous avez raison. div p correspondra à l'exemple suivant, mais pas div > p.

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

Le premier est appelé descendant selector et le second est appelé child selector.

8

Sachez que le sélecteur de l'enfant ne sont pas pris en charge dans Internet Explorer 6. (Si vous utilisez le sélecteur dans un jQuery/Prototype/YUI etc Sélecteur plutôt que dans une feuille de style, il fonctionne toujours bien)

+0

Je pense que je l'utilise en CSS.mais dans jquery je détecte si le navigateur est ie6 (dans jquery je peux faire ceci? ou dois-je utiliser ) et ajouter une classe – iceangel89

+2

jquery reniflant la fonction plutôt que renifler le navigateur si je ne Je pense que vous pouvez détecter si le navigateur est ie6. Et tu ne devrais pas. La meilleure chose est d'inclure une feuille de style supplémentaire pour ie6 avec des commentaires conditionnels comme vous l'avez décrit. – rlovtang

20

Bascailly, "ab" sélectionne tous les b est à l'intérieur d'un, alors que "a> b" Précise de b ce ne sont que des enfants au un, il ne choisirons pas b ce qui est l'enfant de b qu'est-ce qu'un enfant de a.

Cet exemple illustre la différence:

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

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

couleur de fond de abc et def sera vert, mais ghi aura la couleur de fond rouge.

IMPORTANT: Si vous modifiez l'ordre des règles:

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

Toutes les lettres auront fond rouge, parce que sélecteur descendant sélectionne l'enfant est trop.

+0

La section "Important" que vous avez ajoutée complète cette réponse. Merci! –

2
div p

Sélectionne tous __gVirt_NP_NNS_NNPS<__ éléments 'p' où le parent est un élément 'div'

div > p

Il signifie que les enfants immédiats Sélectionne tous les éléments 'p' où le parent est un élément 'div'

6

En théorie: enfant => un descendant d'un ancêtre immédiat (par exemple Joe et son père)

Descendant => tout élément descendant d'un ancêtre particulier (par ex. Joe et son arrière-grand-grand-grand-père)

En pratique: essayer ce 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> 

avec ce CSS:

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

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

+0

Intéressant sur quel navigateur vous l'avez testé, puisqu'il semble effectivement fonctionner –

+1

FYI, CSS en réponse ne correspond pas à CSS dans JSFiddle ('red' et' blue' permuté). – Pang

-1

sélection CSS et appliquer un style à un élément particulier peut être fait en traversant l'élément dom [Exemple

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> 
Questions connexes