Cours Développement Frontend - Les sélecteurs avancés

Nous avons vu les sélecteurs simples ainsi que leurs spécificités. Nous allons maintenant voir les sélecteurs avancés.

Un sélecteur avancé n’est autre qu’une combinaison de sélecteurs simples. Il y a plusieurs types de combinaisons.

Les combinaisons

Le sélecteur de descendants

Ce sélecteur permet de sélectionner les noeuds (éléments) qui sont les descendant d’un ou plusieurs autres éléments.

Par exemple, dans le code suivant :

<div id="favorites">
	<h2>Boissons favorites</h2>
	<ul>
		<li>Lait d'avoine</li>
		<li>Chocolat Chaud</li>
		<li>Huile de moteur</li>
	</ul>
	
	<h2>Plats favoris</h2>
	<ul>
		<li>Bourguignon</li>
		<li>Pizza</li>
		<li>Quiche</li>
	</ul>
</div>

<div id="activities">
	<h2>Activités</h2>
	<ul>
		<li>Boxe</li>
		<li>Escalade</li>
		<li>Peinture</li>
		<li>Ecriture</li>
	</ul>
</div>

On pourrait sélectionner tous les éléments li en utilisant le sélecteur suivant :

li {
/* on mettrait ensuite les instructions CSS que l'on veut*/
}

Mais comment faire pour sélectionner uniquement les éléments li de la div d’ID favorites ?

Dans ce cas là, le sélecteur de descendants pourra être très utile. On aura ainsi le sélecteur suivant :

#favorites li {
/* on mettrait ensuite les instructions CSS que l'on veut*/
}

Le sélecteur de descendants est donc un simple espace entre deux sélecteurs simples.

Question : à votre avis, quelle est la spécificité, dans notre cas, d’un tel sélecteur ?

Le sélecteur d’éléments enfants

Un peu plus spécifique que le précédent, ce sélecteur ne va atteindre que les descendants directs. Son symbole est un chevron ouvrant (signe supérieur >).

Si on reprend le code HTML suivant :

<div id="favorites">
	<h2>Boissons favorites</h2>
	<ul>
		<li>Lait d'avoine</li>
		<li>Chocolat Chaud</li>
		<li>Huile de moteur</li>
	</ul>
	
	<h2>Plats favoris</h2>
	<ul>
		<li>Bourguignon</li>
		<li>Pizza</li>
		<li>Quiche</li>
	</ul>
</div>

<div id="activities">
	<h2>Activités</h2>
	<ul>
		<li>Boxe</li>
		<li>Escalade</li>
		<li>Peinture</li>
		<li>Ecriture</li>
	</ul>
</div>

Si pour sélectionner les éléments li au sein de la div d’ID favorites j’écris le sélecteur CSS suivant :

#favorites > li {}

Mon sélecteur n’atteindra aucun élément : en effet, aucun des éléments descendants directs de la div d’ID favorites n’est un élément li. Pour les atteindre en utilisant le sélecteurs d’éléments enfants, il faudrait écrire :

#favorites > ul > li {}

Question 1 : à votre avis, quelle est la spécificité, dans notre cas, d’un tel sélecteur ? Question 2 : En partant du code HTML précédent, et en vous basant sur le code CSS suivant, quelle sera la taille de police d’écriture des éléments li ?

#favorites ul > li {
	font-size: 20px;
}

#favorites > ul > li {
	font-size: 16px;
}

#favorites li {
	font-size: 24px;
}

Le sélecteur de voisins

Tout comme le sélecteur de descendants permet de sélectionner des éléments descendants, peu importe leur hiérarchie au sein de l’élément parent, le sélecteur de voisins permet de sélectionner des éléments voisins, peu importe leur position.

Le symbole de ce sélecteur est la tilde ~.

Prenons le code HTML suivant :

<section>
	<h1>Contract List</h1>
	<p>Your contract List</p>
	<ul>
		<li>
			<p>Contract 1</p>
			<p>Description contract 1</p>
			<p>Bénéficiaires : ...</p>
		</li>
		<li>
			<p>Contract 2</p>
			<p>Description contract 3</p>
			<p>Bénéficiaires : ...</p>
		</li>
		<li>
			<p>Contract 3</p>
			<p>Description contract 3</p>
			<p>Bénéficiaires : ...</p>
		</li>
	</ul>
</section>

Pour sélectionner chaque paragraphe suivant le titre d’un contrat, on pourrait faire :

p ~ p {/*...*/}

Le sélecteur de voisins directs

De la même manière que le sélecteur d’enfants directs permet de sélectionner les éléments enfants directs, ce sélecteur permet de sélectionner les voisins directs. Son symbole est le signe +.

Question : En reprenant le code suivant, comment faire pour ne sélectionner QUE le second paragraphe de chaque élément de liste.

Appliquer un même style pour plusieurs sélecteurs

Pour appliquer un même style pour plusieurs sélecteurs, il suffira d’utiliser la virgule :

sélecteur1, sélecteur2, ..., sélecteurn {}

Exercices - calcul de spécificités

Pour chaque cas ci-dessous, calculez la spécificité correspondante.

<section>
	<h2>Favoris</h2>
	<h3 id="title-favorite-activities">Activités favorites</h3>
	<ul class="favorite-list">
		<li>Lire</li>
		<li>Peindre</li>
		<li class="highlight">Coder</li>
		<li>Twitch</li>
	</ul>

	<h3 id="title-favorite-drinks">Boissons préférées</h3>
	<ul id="drink-list">
		<li class="drink-item">Jus d'orange</li>
		<li class="drink-item highlight">Jus de mangue</li>
		<li class="drink-item">Thé</li>
	</ul>
<section>

Cas 1

.favorite-list li.highlight {}

Cas2

section > ul > li.highlight {} 

Cas 3

section > ul .highlight {} 

Cas 4

.title-favorite-activities {}

Cas 5

section .drink-list > .drink-item.highlight {}