@layer
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since March 2022.
La règle @ CSS @layer
est utilisée pour déclarer une couche de cascade et peut également être utilisée afin de définir l'ordre de précédence lorsqu'il y a plusieurs couches de cascade.
Syntaxe
@layer nom-couche {regles}
@layer nom-couche;
@layer nom-couche, nom-couche, nom-couche;
@layer {regles}
où :
nom-couche
-
Est le nom de la couche de cascade.
regles
-
Est l'ensemble de règle CSS de la couche de cascade.
Description
Les règles d'une même couche de cascade suivent la cascade ensemble, permettant un contrôle plus fin. Tous les styles qui n'appartiennent pas à une couche donnée sont placées dans une unique couche anonyme qui arrive après les couches déclarées, nommées et anonymes. Cela signifie que les styles déclarés en dehors d'une couche surchargeront les styles déclarés dans une couche, quelle que soit la spécificité.
La règle @layer
permet de créer une couche de cascade de trois façons différentes.
La première façon consiste à créer une couche de cascade nommée et qui contient les règles CSS pour cette couche, comme ceci :
@layer utilities {
.padding-sm {
padding: 0.5rem;
}
.padding-lg {
padding: 0.8rem;
}
}
La seconde méthode consiste à créer une couche de cascade nommée sans lui affecter de styles. Il peut s'agir d'une seule couche :
@layer utilities;
Comme il peut s'agir de plusieurs couches :
@layer theme, layout, utilities;
Comme l'ordre initial dans lequel sont déclarés les couches indique la précédence entre les couches, il est utile d'en déclarer plusieurs ainsi. Comme pour les déclarations, c'est la dernière couche listée qui l'emporte si les mêmes déclarations sont trouvées dans plusieurs couches. Ainsi, dans l'exemple précédent, si une règle était à la fois trouvée dans theme
et dans utilities
, ce serait celle de utilities
qui l'emporterait et qui s'appliquerait.
Une règle présente dans utilities
s'appliquerait même si sa spécificité est inférieure à celle de la règle dans theme
. En effet, dès lors que l'ordre des couches a été établi, la spécificité et l'ordre d'apparence sont ignorés. Cela permet la création de sélecteurs CSS plus simples, car il n'est pas nécessaire de s'assurer qu'un sélecteur a une spécificité suffisamment élevée pour l'emporter sur les autres règles, il suffit de s'assurer qu'il apparaît dans une couche qui arrive après.
Note : Lorsque les noms des couches sont déclarées, leur ordre est défini. On peut ensuite ajouter des règles CSS aux couches en redéclarant leur nom. Les styles sont ainsi ajoutés à la couche et l'ordre des couches reste inchangé.
La troisième façon consiste à créer une couche de cascade sans nom, par exemple :
@layer {
p {
margin-block: 1rem;
}
}
Cela crée une couche de cascade anonyme. Cette couche fonctionne de façon analogue aux couches nommées. Toutefois, il n'est pas possible d'y affecter des règles après la déclaration. L'ordre de précédence des couches anonymes est l'ordre dans lequel les couches sont déclarées, qu'elles soient nommées ou non. La précédence d'une couche anonyme a une précédence inférieure aux styles déclarés en dehors d'une couche.
Une autre façon pour créer une couche de cascade consiste à utiliser @import
. Dans ce cas, les règles associées proviendraient de la feuille de style importée.
Attention : La règle @ @import
doit précéder tous les autres types de règles, à l'exception des règles @charset
.
@import "theme.css" layer(utilities);
Couches imbriquées
Les couches peuvent être imbriquées, on peut par exemple avoir :
@layer framework {
@layer layout {
}
}
Pour ajouter des règles à la couche layout
située à l'intérieur de framework
, on concaténera les deux noms avec un point .
.
@layer framework.layout {
p {
margin-block: 1rem;
}
}
Syntaxe formelle
@layer [ <layer-name># | <layer-name>? { <stylesheet> } ]
Exemples
Exemple simple
Dans l'exemple suivant, deux règles CSS sont créées. Une pour les éléments <p>
en dehors de toute couche et une pour ceux qui sont situés dans une couche intitulée type
pour .box p
.
Sans couche, le sélecteur .box p
aurait la plus haute spécificité et le texte Coucou le monde !
serait alors affiché en vert. La couche type
arrivant avant la couche anonyme pour gérer le contenu qui n'est pas affecté à une couche, le texte sera en violet.
On fera attention à l'ordre, bien que le style qui n'est pas affecté à une couche soit déclaré en premier, il est bien appliqué après les styles des couches.
HTML
<div class="box">
<p>Coucou le monde !</p>
</div>
CSS
p {
color: rebeccapurple;
}
@layer type {
.box p {
font-weight: bold;
font-size: 1.3em;
color: green;
}
}
Résultat
Affecter des règles à des couches existantes
Dans l'exemple qui suit, on crée deux couches sans leur affecter de règle puis les règles CSS sont appliquées aux deux couches. La couche base
définit des valeurs pour les propriétés color
, border
, font-size
, et padding
. La couche special
définit une couleur différente. special
arrivant en dernier lors de la définition des couches, c'est la couleur qu'elle fournit qui est utilisée et le texte est affiché avec la couleur rebeccapurple
. Toutes les autres règles de base
continuent de s'appliquer.
HTML
<div class="item">
Je m'affiche avec <code>color: rebeccapurple</code> car la couche
<code>special</code> arrive après <code>base</code> dans les déclarations. Ma
bordure verte, la taille du texte et le remplissage viennent de la couche
<code>base</code>.
</div>
CSS
@layer base, special;
@layer special {
.item {
color: rebeccapurple;
}
}
@layer base {
.item {
color: green;
border: 5px solid green;
font-size: 1.3em;
padding: 0.5em;
}
}
Résultat
Spécifications
Specification |
---|
CSS Cascading and Inheritance Level 5 # layering |
Compatibilité des navigateurs
BCD tables only load in the browser