Sélecteurs d'imbrication &
Baseline
Large disponibilité
*
Cette fonctionnalité est bien établie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis décembre 2023.
* Certaines parties de cette fonctionnalité peuvent bénéficier de prise en charge variables.
Le sélecteur d'imbrication CSS & indique explicitement la relation entre les règles parentes et enfants lors de l'utilisation de l'imbrication CSS. Il rend les sélecteurs de règles enfants imbriquées relatifs à l'élément parent. Sans le sélecteur d'imbrication &, le sélecteur de règle enfant cible les éléments enfants. Les sélecteurs de règles enfants ont le même poids de spécificité que s'ils étaient dans :is().
Note :
Règle enfant ne signifie pas sélecteur d'élément enfant. Une règle enfant peut cibler l'élément parent ou les éléments enfants selon l'utilisation du sélecteur d'imbrication &.
Si le sélecteur d'imbrication & n'est pas utilisé dans une règle de style imbriquée, il représente la racine de portée.
Syntaxe
parentRule {
/* propriétés de style de la règle parente */
& childRule {
/* propriétés de style de la règle enfant */
}
}
Sélecteur d'imbrication & et espaces
Considérez le code suivant où l'imbrication est réalisée sans le sélecteur d'imbrication &.
.parent-rule {
/* propriétés de style de la règle parente */
.child-rule {
/* propriétés de style de la règle enfant */
}
}
Lorsque le navigateur analyse les sélecteurs imbriqués, il ajoute automatiquement un espace entre les sélecteurs pour créer une nouvelle règle CSS. Le code suivant montre l'équivalent sans imbrication :
.parent-rule {
/* propriétés de style de la règle parente */
}
.parent-rule .child-rule {
/* propriétés de style pour les descendants .child-rule des ancêtres .parent-rule */
}
Lorsque la règle imbriquée doit être attachée (sans espace) à la règle parente, par exemple lors de l'utilisation d'une pseudo-classe ou de la création de sélecteurs composés, le sélecteur d'imbrication & doit être immédiatement préfixé pour obtenir l'effet souhaité.
Prenons un exemple où l'on souhaite styliser un élément, en fournissant des styles à appliquer en permanence, et en imbriquant certains styles à appliquer uniquement au survol. Si le sélecteur d'imbrication & n'est pas inclus, un espace est ajouté et on obtient un ensemble de règles qui applique les styles imbriqués à tout descendant survolé du sélecteur de la règle parente. Ce n'est cependant pas le comportement souhaité.
.parent-rule {
/* propriétés de style de la règle parente */
:hover {
/* propriétés de style de la règle enfant */
}
}
/* le navigateur analyse les règles imbriquées ci-dessus comme indiqué ci-dessous */
.parent-rule {
/* propriétés de style de la règle parente */
}
.parent-rule *:hover {
/* propriétés de style de la règle enfant */
}
Avec le sélecteur d'imbrication & ajouté sans espace, les éléments correspondant à la règle parente seront stylisés lors du survol.
.parent-rule {
/* propriétés de style de la règle parente */
&:hover {
/* propriétés de style de la règle enfant */
}
}
/* le navigateur analyse les règles imbriquées ci-dessus comme indiqué ci-dessous */
.parent-rule {
/* propriétés de style de la règle parente */
}
.parent-rule:hover {
/* propriétés de style de la règle enfant */
}
Ajouter le sélecteur d'imbrication &
Le sélecteur d'imbrication & peut aussi être ajouté à la fin pour inverser le contexte des règles.
.card {
/* .card styles */
.featured & {
/* .featured .card styles */
}
}
/* le navigateur analyse les règles imbriquées ci-dessus comme indiqué ci-dessous */
.card {
/* .card styles */
}
.featured .card {
/* .featured .card styles */
}
Le sélecteur d'imbrication & peut être placé plusieurs fois :
.card {
/* .card styles */
.featured & & & {
/* .featured .card .card .card styles */
}
}
/* le navigateur analyse les règles imbriquées ci-dessus comme indiqué ci-dessous */
.card {
/* .card styles */
}
.featured .card .card .card {
/* .featured .card .card .card styles */
}
Impossible de représenter les pseudo-éléments
Le sélecteur & est équivalent au sélecteur :is() et possède la même limitation que celui-ci, il ne peut pas représenter les pseudo-éléments.
Par exemple, avec la règle de style suivante, aucun contenu généré ne sera coloré en rouge, même lorsqu'il est imbriqué dans <div class="important">, car .important :is(.foo::before) ne peut rien cibler.
.foo::before {
content: "Hello";
.important & {
color: red;
}
}
Cette limitation s'applique également aux règles imbriquées, dont les propriétés sont implicitement englobées dans un sélecteur &. Par exemple, avec la règle suivante, aucun contenu généré ne sera coloré en rouge, même sur un petit écran, car la propriété color: red est implicitement englobée dans un sélecteur &, qui correspond ici à :is(.foo::before).
.foo::before {
content: "Hello";
@media (width < 600px) {
color: red;
}
}
Examples
Les deux exemples suivants produisent le même résultat. Le premier utilise des styles CSS classiques et le second utilise le sélecteur d'imbrication &.
Utiliser des styles CSS classiques
Cet exemple utilise des styles CSS classiques.
HTML
<p class="example">
Ce paragraphe <a href="#">contient un lien</a>, essayez de le survoler ou de
le sélectionner.
</p>
CSS
.example {
font-family: system-ui;
font-size: 1.2rem;
}
.example > a {
color: tomato;
}
.example > a:hover,
.example > a:focus {
color: ivory;
background-color: tomato;
}
Résultat
Utiliser & dans des styles CSS imbriqués
Cet exemple utilise des styles CSS imbriqués.
HTML
<p class="example">
Ce paragraphe <a href="#">contient un lien</a>, essayez de le survoler ou de
le sélectionner.
</p>
CSS
.example {
font-family: system-ui;
font-size: 1.2rem;
& > a {
color: tomato;
&:hover,
&:focus {
color: ivory;
background-color: tomato;
}
}
}
Résultat
Utiliser & en dehors d'une règle imbriquée
Si le sélecteur d'imbrication & n'est pas utilisé dans une règle de style imbriquée, il représente la racine de portée.
<p>
Passez le curseur sur la boîte de sortie pour changer la couleur
d'arrière-plan du document.
</p>
& {
color: blue;
font-weight: bold;
}
&:hover {
background-color: wheat;
}
Résultat
Dans ce cas, tous les styles s'appliquent au document.
Spécifications
| Spécification |
|---|
| CSS Nesting Module Level 1> # nest-selector> |
Compatibilité des navigateurs
Voir aussi
- Utiliser l'imbrication CSS
- Le module d'imbrication CSS
- Le module des sélecteurs CSS