Sélecteurs et classes¶
Les sélecteurs sont la manière dont CSS cible les éléments à styliser. Un sélecteur de classe cible les éléments avec un nom de classe spécifique ; les pseudo-classes ciblent les éléments dans des états spécifiques (comme :hover) ; les combinateurs ciblent les éléments en fonction de leur position dans l'arborescence. Maîtrisez les sélecteurs et vous contrôlez ce qui est stylisé et quand.
Silex utilise le nommage de classes BEM et le plugin Advanced Selectors pour vous permettre d'écrire des sélecteurs CSS visuellement. Au lieu de coder .card:hover { ... } à la main, vous choisissez la classe, l'état et l'effet -- l'éditeur génère le sélecteur pour vous.

Note : Silex prend actuellement en charge les sélecteurs jusqu'à la complexité des sélecteurs composés et des combinateurs. Pour une composition de sélecteurs avancée au-delà de BEM et des pseudo-classes de base, la fonctionnalité Tailwind CSS Support sur la feuille de route pourrait éventuellement fournir des raccourcis par classes utilitaires.
Comprendre les sélecteurs CSS¶
Un sélecteur CSS est un motif qui correspond à des éléments dans le HTML. Le plus simple est un sélecteur d'élément (par ex., p stylise tous les paragraphes). Mais le plus flexible est un sélecteur de classe (par ex., .button stylise tous les éléments avec class="button").
Silex encourage les sélecteurs de classe car ils sont réutilisables et ne dépendent pas de la structure HTML. Un sélecteur d'élément comme div styliserait chaque div, ce qui est trop large et fragile.
Nommer les classes avec BEM¶
BEM (Block, Element, Modifier) est une convention de nommage qui rend les noms de classes sémantiques et réutilisables. C'est simple :
- Block : un composant autonome (par ex.,
.card,.button,.navbar) - Element : une partie d'un block (par ex.,
.card__title,.button__icon) - Modifier : une variante d'un block ou d'un element (par ex.,
.button--primary,.card--featured)
Exemple :
.card { /* le block */ }
.card__title { /* titre à l'intérieur d'une carte */ }
.card__description { /* description à l'intérieur d'une carte */ }
.card--featured { /* une variante spéciale */ }
.card--featured .card__title { /* titre à l'intérieur d'une carte mise en avant */ }
Cette structure rend les classes auto-documentées. Quiconque lit .button--large sait qu'il s'agit d'une variante large d'un bouton. Cela évite aussi les conflits de nommage -- vous n'aurez pas accidentellement deux composants différents avec la même classe .title.
Appliquez BEM en nommant les classes dans Silex :
1. Sélectionnez un élément
2. Dans la zone de sélecteur en haut du panneau droit, cliquez sur + Add a new selector
3. Nommez-la selon BEM : .block, .block__element ou .block--modifier
Styliser les éléments dans différents états¶
Les éléments ont des états -- quand l'utilisateur survole, donne le focus, clique ou a déjà visité. Les pseudo-classes vous permettent de styliser en fonction de l'état.
Le plugin Advanced Selectors dans Silex expose de nombreuses pseudo-classes visuellement. Au lieu de taper :hover, vous le choisissez dans une liste déroulante.
Pseudo-classes courantes :
- :hover -- quand l'utilisateur survole l'élément
- :active -- quand l'utilisateur clique dessus
- :focus -- quand l'élément a le focus clavier
- :visited -- pour les liens que l'utilisateur a déjà visités
- :first-child -- le premier enfant de son parent
- :last-child -- le dernier enfant de son parent
Exemple : Styliser l'arrière-plan d'un bouton au survol :
- Sélectionnez l'élément bouton
- Dans le Style Manager, cliquez sur le bouton + Selector (ou utilisez la liste déroulante Advanced Selectors)
- Ajoutez
.button:hover - Définissez la couleur d'arrière-plan pour cet état
Le bouton change maintenant de couleur quand vous le survolez, et reste normal autrement.
La barre d'outils du sélecteur¶
La barre du sélecteur se trouve en haut à droite du Style Manager. Elle affiche le sélecteur courant (nom de classe ou sélecteur composé), un nombre de spécificité qui se met à jour dynamiquement lorsque vous construisez le sélecteur, et une rangée de boutons d'action :
| Bouton | Icône | Action |
|---|---|---|
| Modifier | Crayon | Renommer ou modifier le sélecteur courant |
| Copier | Presse-papiers | Copier les styles de l'élément courant dans le presse-papiers (pour les coller sur un autre élément) |
| Coller | Coller | Appliquer les styles précédemment copiés à l'élément sélectionné |
| Effacer | Balai | Supprimer tous les styles du sélecteur courant |
| Aide | Point d'interrogation | Ouvrir la documentation sur les sélecteurs |
Les classes sont affichées avec un préfixe en forme de puce (par ex., * my-class), tandis que les ID sont affichés avec un préfixe dièse (# my-id).
Sous le nom du sélecteur, vous voyez trois boutons pour étendre le sélecteur :
- « + Add a new selector » -- ajoute une autre classe ou un autre ID au sélecteur courant.
- « Pseudo Class » -- ouvre une liste déroulante avec toutes les pseudo-classes et pseudo-éléments disponibles (voir le tableau de référence ci-dessous). Chaque entrée dans la liste inclut un lien vers sa page de documentation MDN et un bouton de suppression pour le retirer.
- « Relation » -- ouvre une liste déroulante pour ajouter un combinateur (descendant, enfant, frère adjacent ou frère général) au sélecteur.
Flux de travail copier/coller de styles : Pour appliquer les styles d'un élément à un autre, sélectionnez l'élément source, cliquez sur Copier dans la barre d'outils du sélecteur, puis sélectionnez l'élément cible et cliquez sur Coller. Cela copie toutes les déclarations de style du sélecteur source vers la cible.


Cibler les éléments par position¶
Les pseudo-classes peuvent aussi sélectionner en fonction de la position :
:nth-child(n)-- chaque nième enfant (par ex.,:nth-child(2)est le deuxième enfant,:nth-child(2n)est chaque enfant pair):nth-of-type(n)-- chaque nième élément de ce type de balise:only-child-- un élément sans aucun frère/soeur
Cas d'usage : Styliser une ligne sur deux dans un tableau avec un arrière-plan clair pour la lisibilité. Utilisez :nth-child(2n) pour sélectionner chaque deuxième ligne.
Utiliser les combinateurs pour cibler les éléments liés¶
Les combinateurs vous permettent de sélectionner des éléments en fonction de leur relation avec d'autres éléments. Le plugin Advanced Selectors prend en charge quatre combinateurs :
| Combinateur | Syntaxe | Signification | MDN |
|---|---|---|---|
| Descendant | .parent .child |
Tout .child à l'intérieur de .parent (à n'importe quelle profondeur) |
lien |
| Enfant | .parent > .child |
Uniquement les .child directs de .parent (un seul niveau) |
lien |
| Frère adjacent | .item + .item |
Un .item immédiatement après un autre .item |
lien |
| Frère général | .item ~ .item |
Tout .item qui suit un autre .item (à n'importe quelle distance) |
lien |
Exemples :
Combinateur descendant : .card .title -- stylise tous les titres à l'intérieur des cartes (à n'importe quelle profondeur).
Combinateur enfant : .navbar > .item -- stylise les éléments qui sont des enfants directs de la barre de navigation (pas imbriqués plus profondément).
Frère adjacent : .input + .error -- stylise un message d'erreur qui suit immédiatement un champ de saisie.
Frère général : .item ~ .item -- stylise les éléments qui suivent un autre élément de la même classe (utile pour ajouter de l'espacement entre les frères).
Créer des sélecteurs complexes visuellement¶
Le plugin Advanced Selectors vous permet de construire des sélecteurs complexes sans code :
- Sélectionnez un élément, puis regardez la zone de sélecteur en haut du panneau droit
- Choisissez une classe de base (par ex.,
.button) - Ajoutez des pseudo-classes (par ex.,
:hover) - Ajoutez des combinateurs et des classes cibles si nécessaire (par ex.,
. > .icon)
L'interface génère le sélecteur complet pour vous : .button:hover > .icon.
Exemple étape par étape : styliser un lien après une icône
- Sélectionnez l'élément lien
- Cliquez sur + Selector
- Ajoutez la classe
.nav-link - Ajoutez le combinateur frère adjacent (
+) - Ajoutez la classe cible
.nav-icon - Définissez le style (par ex., margin, color)
Résultat : le sélecteur devient .nav-link + .nav-icon, qui cible l'icône de navigation immédiatement après un lien de navigation.
Exemple pratique : styliser un effet de survol sur une carte¶
Scénario : Vous avez des cartes avec une image, un titre et un bouton. Au survol, l'arrière-plan s'assombrit et le bouton apparaît.
- Créez un block de carte avec des classes BEM :
.card(le block).card__image(image à l'intérieur)-
.card__button(bouton à l'intérieur) -
Stylisez le bouton pour qu'il soit masqué par défaut :
- Sélectionnez
.card__button -
Définissez Opacity sur
0ou Display surnone -
Ajoutez un état de survol pour la carte :
- Sélectionnez la carte
- Ajoutez le sélecteur
.card:hover -
Définissez Background-color sur une teinte plus foncée
-
Ajoutez un état de survol pour le bouton :
- Sélectionnez le bouton
- Ajoutez le sélecteur
.card:hover .card__button - Définissez Opacity sur
1ou Display surflex(le rendant visible au survol)
Résultat : quand vous survolez la carte, l'arrière-plan change et le bouton apparaît en fondu -- tout en sélecteurs CSS, sans JavaScript nécessaire.
Éviter les pièges courants des sélecteurs¶
Utilisez des classes, pas des ID : Ne stylez pas par ID d'élément (#my-button). Les ID sont uniques et ne peuvent pas être réutilisés. Les classes sont réutilisables et sont l'outil approprié pour le CSS.
Évitez les sélecteurs descendants pour tout : .card .title .text sélectionne des éléments profondément imbriqués. C'est fragile -- si vous déplacez .text vers un autre parent, le sélecteur ne fonctionne plus. Utilisez les combinateurs de manière réfléchie et gardez les sélecteurs aussi courts que possible.
Ne sur-qualifiez pas les sélecteurs : .card.card--featured est redondant ; utilisez simplement .card--featured. La sur-qualification augmente la spécificité et rend le sélecteur plus difficile à surcharger par la suite.
Souvenez-vous de la spécificité : La spécificité d'un sélecteur détermine quelle règle l'emporte quand des styles entrent en conflit. Les sélecteurs de classe (.button) ont une spécificité inférieure aux sélecteurs d'attribut ([data-state="active"]). En général, gardez une spécificité basse et cohérente.
Erreurs courantes¶
- Nommer les classes sans convention. Évitez les noms aléatoires comme
.blue-box-thing. Utilisez BEM ou une autre convention pour que les classes soient prévisibles. - Appliquer les pseudo-classes au mauvais élément.
:hoversur un enfant ne se déclenche pas au survol du parent. Utilisez les combinateurs pour styliser les éléments associés. - Oublier que CSS est en cascade. Les règles ultérieures remplacent les précédentes si la spécificité est égale. Placez les sélecteurs plus spécifiques en dernier dans votre feuille de style.
- Utiliser les sélecteurs d'éléments pour le style.
p { color: red; }stylise tous les paragraphes. C'est trop large. Utilisez des classes à la place. - Mélanger les classes BEM de manière incohérente. Si vous utilisez BEM pour certains composants et des noms aléatoires pour d'autres, votre base de code devient difficile à maintenir.
En savoir plus¶
- MDN : Sélecteurs CSS -- référence complète
- MDN : Pseudo-classes -- toutes les pseudo-classes disponibles
- MDN : Combinateurs -- référence détaillée des combinateurs
- Méthodologie BEM -- documentation officielle BEM
- MDN : Spécificité -- comment CSS décide quelle règle l'emporte
- Tailwind CSS Support -- votez pour des alternatives par classes utilitaires
- Couleurs et arrière-plans -- là où les sélecteurs sont le plus souvent utilisés
- Positionnement -- utiliser les pseudo-éléments comme
::beforeet::after
Avancé : pseudo-éléments et sélecteurs imbriqués
Pseudo-éléments : ::before et ::after¶
Les pseudo-éléments créent du contenu qui n'est pas dans le HTML. Les deux plus courants sont :
::before-- insère du contenu avant le contenu de l'élément::after-- insère du contenu après le contenu de l'élément
Vous devez définir la propriété content sur une chaîne ou none. Usages courants :
- Icônes ou formes décoratives avant/après le texte
- Guillemets autour des citations
- Soulignements ou mises en évidence sur les titres
Exemple : Ajouter une ligne décorative avant un titre :
Dans Silex, les pseudo-éléments apparaissent comme des sélecteurs (comme les pseudo-classes) et la propriété Content n'apparaît que lorsque vous sélectionnez un pseudo-élément.
Pseudo-classes relationnelles : :has, :is, :not, :where¶
Le CSS moderne inclut des pseudo-classes relationnelles qui simplifient les sélecteurs complexes :
:has()-- correspond à un élément qui a un descendant correspondant au sélecteur:is()-- correspond à un élément qui correspond à l'un des sélecteurs:not()-- correspond à un élément qui ne correspond pas au sélecteur:where()-- comme:is()mais avec une spécificité nulle
Le plugin Advanced Selectors les prend en charge. Utilisez-les pour écrire des sélecteurs plus propres et plus puissants sans imbrication profonde.
Exemple : Styliser tous les éléments de liste sauf le dernier :
Sélecteurs imbriqués (fonctionnalité future)¶
CSS Nesting (une fonctionnalité plus récente) vous permet d'écrire des sélecteurs dans une structure imbriquée, similaire à SCSS. Silex pourrait prendre cela en charge dans de futures versions, mais pour l'instant, écrivez des sélecteurs individuels pour chaque état ou relation.
Référence : toutes les pseudo-classes prises en charge dans Silex
| Pseudo-classe | Signification | Support navigateur |
|---|---|---|
:hover |
L'utilisateur survole l'élément | Tous |
:active |
L'utilisateur clique/appuie activement sur l'élément | Tous |
:focus |
L'élément a le focus clavier | Tous |
:focus-within |
L'élément ou l'un de ses descendants a le focus | Tous |
:focus-visible |
A le focus clavier et l'indicateur de focus est visible | Navigateurs modernes |
:visited |
Le lien a été visité | Tous (style limité pour la sécurité) |
:link |
Le lien n'a pas été visité | Tous |
:any-link |
Tout lien (visité ou non) | Navigateurs modernes |
:first-child |
Premier enfant du parent | Tous |
:last-child |
Dernier enfant du parent | Tous |
:nth-child(n) |
Nième enfant du parent | Tous |
:nth-last-child(n) |
Nième enfant depuis la fin | Tous |
:only-child |
Seul enfant du parent | Tous |
:first-of-type |
Premier élément de son type parmi les frères | Tous |
:last-of-type |
Dernier élément de son type parmi les frères | Tous |
:nth-of-type(n) |
Nième élément de ce type | Tous |
:nth-last-of-type(n) |
Nième élément de ce type depuis la fin | Tous |
:only-of-type |
Seul élément de son type parmi les frères | Tous |
:empty |
N'a pas d'enfants | Tous |
:root |
L'élément racine du document | Tous |
:scope |
L'élément de portée (généralement la racine) | Navigateurs modernes |
:target |
Élément ciblé par un fragment d'URL (#) | Tous |
:enabled |
L'élément de formulaire est activé | Tous |
:disabled |
L'élément de formulaire est désactivé | Tous |
:checked |
La case à cocher ou le bouton radio est coché | Tous |
:indeterminate |
Case à cocher ou bouton radio dans un état indéterminé | Tous |
:required |
Élément de formulaire avec l'attribut required | Tous |
:optional |
Élément de formulaire sans l'attribut required | Tous |
:lang() |
Élément avec une langue spécifique | Tous |
:dir() |
Élément avec une direction de texte spécifique (ltr/rtl) | Navigateurs modernes |
| Pseudo-élément | Signification | Support navigateur |
|---|---|---|
::before |
Insère du contenu avant le contenu de l'élément | Tous |
::after |
Insère du contenu après le contenu de l'élément | Tous |
::first-letter |
Stylise uniquement la première lettre | Tous |
::first-line |
Stylise uniquement la première ligne | Tous |
::selection |
Stylise le texte sélectionné (surligné) | Tous |
Quiz¶
Q1 : Vous voulez styliser un élément bouton que vous utiliserez sur tout votre site. Quel est le meilleur sélecteur ?
- A)
button(sélecteur d'élément) - B)
#my-button(sélecteur d'ID) - C)
.button(sélecteur de classe) - D)
.button-element-primary(nom de classe long)
Réponse
C) .button (sélecteur de classe) -- les classes sont réutilisables et ne dépendent pas de la structure HTML. Les sélecteurs d'éléments sont trop larges ; les ID ne peuvent être utilisés qu'une seule fois et ne sont pas réutilisables.
Q2 : En suivant le nommage BEM, comment appelleriez-vous le titre à l'intérieur d'une carte ?
- A)
.card-title - B)
.card__title - C)
.card--title - D)
.card.title
Réponse
B) .card__title -- BEM utilise des doubles underscores (__) pour les elements (parties d'un block) et des doubles tirets (--) pour les modifiers (variantes).
Q3 : Vous voulez styliser la couleur d'arrière-plan d'un bouton quand l'utilisateur le survole. Quel sélecteur devez-vous créer ?
- A)
.button - B)
.button:hover - C)
.button > .button:hover - D)
.button + :hover
Réponse
B) .button:hover -- la pseudo-classe :hover sélectionne le bouton quand l'utilisateur le survole. Les combinateurs connectent plusieurs sélecteurs ; vous n'en avez pas besoin ici.
Q4 : Vous avez une liste d'éléments et voulez ajouter un border-bottom à tous les éléments sauf le dernier. Quel sélecteur est le meilleur ?
- A)
.item - B)
.item:not(:last-child) - C)
.item:last-child - D)
.item ~ .item
Réponse
B) .item:not(:last-child) -- la pseudo-classe :not() exclut le dernier enfant. C'est plus propre qu'écrire des règles séparées pour .item et surcharger la dernière.
Q5 : Quelle est la différence entre le combinateur descendant (espace) et le combinateur enfant (>) ?
- A) Ils font la même chose ; > est juste plus récent
- B) L'espace sélectionne tout descendant ; > sélectionne uniquement les enfants directs
- C) > sélectionne à n'importe quelle profondeur ; l'espace sélectionne un seul niveau
- D) Il n'y a pas de différence dans le CSS moderne
Réponse
B) L'espace sélectionne tout descendant ; > sélectionne uniquement les enfants directs -- .card .title correspond à tout .title à l'intérieur de .card à n'importe quelle profondeur. .card > .title correspond uniquement aux éléments .title qui sont des enfants directs de .card.