Sélecteurs CSS : Guide pratique et avancé

Cet article combine les concepts de base des sélecteurs CSS issus du guide officiel et les approches plus avancées des solutions web modernes.

Sélecteurs de classe et d'identifiant

Les sélecteurs de classe et d'identifiant permettent de cibler des éléments spécifiques :

.warning.urgent
#firstp-para

Sélecteurs d'attribut

Sélecteur d'attribut simple

Sélectionner un élément possédant un attribut, sans se soucier de sa valeur :

h1[class] { color: red; }

Cela ciblera les balises <h1> ayant l'attribut class, quelle que soit sa valeur :

<h1 class="hoopla">Bonjour</h1> ✓
<h1>Sérénité</h1>
<h1 class="fancy">Astuce</h1> ✓

Sélecteur d'attribut exact

Cibler un élément dont la valeur d'attribut correspond exactement :

a[href="http://www.css-discuss.org/about.html"] { font-weight: bold; }

Sélecteurs d'attribut partiels

Syntaxe Description
[foo|="bar"] Valeur commençant par "bar" suivie d'un tiret
[foo~="bar"] Valeur contenant "bar" comme mot séparé par des espaces
[foo*="bar"] Valeur contenant "bar" n'importe où
[foo^="bar"] Valeur débutant par "bar"
[foo$="bar"] Valeur se terminant par "bar"
:not([foo]) Élément ne possédant pas l'attribut "foo"
:not(.layui-this) Élément ne possédant pas la classe "layui-this"

Exemple de [foo|="bar"] :

<h1 class="en"></h1> ✓
<h1 class="en-us"></h1> ✓
<h1 class="en-au"></h1> ✓
<h1 class="cy-en"></h1> ✗

Cas d'usage : images nommées figure-1.gif, figure-2.gif. Utilisation : img[src|="figure"] { }.

Sélecteur insensible à la casse

Ajouter i après la valeur pour ignorer la casse :

a[href$='.PDF' i] { }
plant[type*='rock' i] { }

Sélecteurs basés sur la structure du document

Sélecteur descendant

Cible un élément descendant d'un autre, à n'importe quel niveau :

h1 em { }

Sélecteur enfant direct

Cible un élément qui est un enfant immédiat :

h1 > strong { color: red; }

Sélecteur de frère adjacent

Cible un élément suivant immédiatement un autre (même parent) :

h1 + p { }

Exemple :

<div>
    <h1></h1>
    <p></p> ✓
</div>

Sélecteur de frère général

Cible tous les éléments frères suivants un autre :

h2 ~ ol { }

Exemple :

<div>
    <h2></h2>
    <p></p>
    <ol></ol> ✓
    <ol></ol> ✓
</div>

Pseudo-classes

Chaînage de pseudo-classes

Combinaison de pseudo-classes pour des ciblages précis :

a:link:hover { color: red; }
a:visited:hover { color: maroon; }

L'ordre n'a pas d'importance : a:hover:link fonctionne également.

Utilisation avec la pseudo-classe :lang :

a:link:hover:lang(de) { color: gray; }

Pseudo-classes structurelles

:root

Sélectionne l'élément racine du document, équivalent à html pour les documents HTML :

:root { } /* équivaut à html { } */

:empty

Sélectionne un élément sans enfant (aucun nœud, y compris les nœuds de texte) :

p:empty { }

Exemple :

<p></p> ✓
<p> </p>    ✗ (contient un espace)
<p>          ✗ (contient du texte)
<p><!-- commentaire --></p> ✓

Note : :empty est le seul sélecteur CSS qui prend en compte les nœuds de texte lors du matching (jusqu'en 2017).

:only-child

Sélectionne un élément qui est le seul enfant de son parent (les nœuds de texte ne sont pas considérés) :

a[href] img:only-child { border: 1px solid black; }

Exemple :

<a href="http://w3.org"><img src="w3.png" alt="w3C" /></a> ✓
<a href="http://w3.org"><img src="w3.png" alt="w3C" /> Texte </a> ✓
<a href="http://w3.org"><img src="w3.png" alt="w3C" /><em>Texte</em></a> ✗

:only-of-type

Sélectionne un élément s'il est le seul de son type parmi ses frères :

a img:only-of-type { }

Exemple :

<a href="">
    <b>·</b><img /> ✓
</a>
<a href="">
    <b>·</b><img /><img /> ✗
</a>

Note : p:first-of-type:last-of-type est équivalent à p:only-of-type, car les pseudo-classes s'appliquent à l'élément lui-même.

:first-child et :last-child

Sélectionne le premier ou le dernier enfant de son parent :

p:first-child { }

Exemple :

<div>
    <p>Premier paragraphe</p> ✓
    <ul>
        <li>Clé</li>
    </ul>
    <p>Deuxième paragraphe</p>
</div>

:first-of-type et :last-of-type

Sélectionne le premier ou le dernier élément d'un type donné parmi ses frères :

td:first-of-type { }

Exemple :

<table>
    <tr>
        <th>Compte</th><td>7</td>✓<td></td>
    </tr>
    <tr>
        <td>Compte</td><td>7</td>✓<td></td>
    </tr>
</table>

:nth-child()

Permet de cibler le n-ième enfant :

p:nth-child(1) /* Équivalent à p:first-child */

Exemples d'alternance de couleur :

/* Lignes paires */
ul > li:nth-child(2n+1) { background-color: red; }
/* Toutes les 3 lignes */
ul > li:nth-child(3n+1) { background-color: red; }

Sélectionner à partir de la 9e ligne :

tr:nth-child(n+9) { }
tr:nth-child(8) ~ tr { } /* Équivalent */

Sélectionner en partant de la fin :

tr:nth-last-child() { }

Astuce : déterminer le nombre d'enfants

/* Un seul enfant */
li:only-child { width: 100%; }
/* Deux enfants : premier et deuxième */
li:nth-child(1):nth-last-child(2),
li:nth-child(2):nth-last-child(1) { width: 50%; }

:nth-of-type() et :nth-last-of-type()

Sélectionne le n-ième élément d'un type donné :

:nth-of-type(1):nth-last-of-type(1) /* Équivalent à :only-of-type */

Pseudo-classes dynamiques

Ces pseudo-classes réagissent à l'interaction de l'utilisateur :

:link { } /* Lien non visité */
:visited { } /* Lien visité */
a.external:link { }
a.external:visited { }

Pseudo-classe Description
:focus Élément qui a le focus (saisie clavier)
:hover Élément survolé par la souris
:active Élément en cours d'activaiton (clic)

Ordre recommandé : :link, :visited, :hover, :focus, :active. L'ordre est important pour éviter que les styles ne se chevauchetn incorrectement.

Pseudo-classes d'état d'interface utilisateur (UI)

Ces pseudo-classes ciblent les éléments de formulaire en fonction de leur état :

Pseudo-classe Description
:enabled Élément activé (accepte les entrées)
:disabled Élément désactivé
:checked Case à cocher ou bouton radio coché

:target

Cible l'élément dont l'id correspond au fragment d'URL (#).

:lang()

Cible les éléments basés sur la langue définie via l'attribut lang ou par héritage.

:not() (pseudo-classe de négation)

Exclut les éléments correspondant au sélecteur passé en argument.

Pseudo-éléments

Section en cours de rédaction.

Étiquettes: sélecteurs CSS pseudo-classes pseudo-elements CSS3 selecteurs d'attribut

Publié le 11 juillet à 01h14