Sélecteurs CSS Child vs Descendant

299

Je suis un peu confus entre ces 2 sélecteurs.

Le sélecteur descendant :

div p

sélectionner tout pdans un divsi c'est un descendant immédiat ou non? Donc, si le pest à l'intérieur d'un autre, divil sera toujours sélectionné?

Ensuite, le sélecteur d' enfant :

div > p

Quelle est la différence? Un enfant signifie-t-il un enfant immédiat ? Par exemple.

<div><p>

contre

<div><div><p>

seront tous deux sélectionnés ou non?

iceangel89
la source
J'ai essayé d'expliquer ici en détail, peut se référer juste au cas où cela serait utile à n'importe qui ...
M. Alien

Réponses:

469

Pensez à ce que les mots «enfant» et «descendant» signifient en anglais:

  • Ma fille est à la fois mon enfant et mon descendant
  • Ma petite-fille n'est pas mon enfant, mais elle est ma descendante.
RichieHindle
la source
49
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 contenant des milliers d'éléments DOM.
Jake Wilson
Bonne réponse, mais j'ajouterais simplement des réponses directes à ses exemples dans la question - juste pour que ce soit ridiculement clair.
JoeCool
45

Oui vous avez raison. div pcorrespondra à l'exemple suivant, mais div > pne le sera pas.

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

Le premier est appelé sélecteur descendant et le second est appelé sélecteur enfant .

Çağdaş Tekin
la source
23

Bascailly, " ab " sélectionne tous les b à l'intérieur de a, tandis que " a> b " sélectionne les b qui ne sont que des enfants pour le a , il ne sélectionnera pas b ce qui est enfant de b ce qui est 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>

La couleur d'arrière-plan de abc et def sera verte, mais ghi aura une couleur d'arrière-plan rouge.

IMPORTANT: si vous changez l'ordre des règles en:

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

Toutes les lettres auront un fond rouge, car le sélecteur descendant sélectionne également l'enfant.

Ignas2526
la source
La section "Important" que vous avez ajoutée complète cette réponse. Merci!
Aakash Verma
10

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

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

En pratique: essayez 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/

Snowcrash
la source
Intéressant sur quel navigateur vous l'avez testé, car il semble fonctionner effectivement
yoel halb
3
Pour info, CSS en réponse ne correspond pas avec CSS dans JSFiddle ( redet blueéchangé).
Pang
7

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

rlovtang
la source
je pense que je l'utilise en CSS. mais dans jquery je détecte si le navigateur est ie6 (dans jquery je peux le faire? ou dois-je utiliser <! - [si IE 6]>) et ajouter une classe
iceangel89
2
jquery propose le reniflement plutôt que le reniflement du navigateur, donc je ne pense pas que vous puissiez détecter si le navigateur est ie6. Et tu ne devrais pas. Le mieux est d'inclure une feuille de style supplémentaire pour ie6 avec des commentaires conditionnels comme vous l'avez décrit.
rlovtang
4
div p 

Sélectionne tous les éléments 'p' dont le parent est un élément 'div'

div> p

Cela signifie que les enfants immédiats sélectionnent tous les éléments «p» dont le parent est un élément «div»

user3351229
la source
-1

La sélection CSS et l'application de style à un élément particulier peuvent être effectuées en parcourant l'élément dom [Exemple

Exemple

.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>
Aravind Cheekkallur
la source