Les couches (layer) et la directive @layer
.
Résumé des caractéristiques de la directive @layer
Description de la directive @layer
.
La directive @layer
définit les couches de cascades (layers), et surtout organise leurs priorités.
Un tutoriel sur les couches de cascade est présenté un peu plus loin sur cette page.
En gros, les couches de cascade permettent de modifier les règles de priorité habituelles du CSS.
Pour réviser les règles de priorité habituelles du CSS, reportez-vous à la page Les priorités.
Syntaxes de la directive @layer
.
- @layer couche-1, couche-2, ... couche-n;
Cette écriture, généralement positionnée au début de la feuille de styles, définit une série de couches de cascade. Il suffit d'énumérer les noms de ces couches en les séparant par des virgules. Les noms choisis doivent commencer par une lettre et peuvent comporter des lettres, des chiffres, des tirets et des tirets bas. Mais autant conserver les bonnes habitudes de CSS et adopter une écriture en
kebab-case
:layer-1
plutôt quelayer_1
.La priorité de ces couches entre elles est également définie par l'ordre dans lequel elles sont énumérées : dans notre exemple
couche-1
est la moins prioritaire, etcouche-n
est celle qui a la priorité la plus haute.Une fois qu'elles sont définies, ces priorités ne pourront pas changer, même si une deuxième directive
@layer
apparaît ensuite. Ainsi, dans l'exemple ci-dessous,couche-1
reste la couche avec la plus faible priorité :@layer couche-1, couche-2, couche-3; @layer couche-3, couche-2, couche-1;
Mais il est possible de définir de nouvelles couches. Dans ce cas, étant déclarées après, ces nouvelles couches auront une priorité plus grande. Dans ce deuxième exemple, une couche
couche-4
est créée avec une priorité supérieure à toutes les autres couches déjà existantes. Les priorités des couches de 1 à 3 ne changent pas.@layer couche-1, couche-2, couche-3; @layer couche-4, couche-3, couche-2;
- @layer couche-1 { <selecteur> { <propriété>: <valeur>; <propriété>: <valeur>; } }
Dans cette deuxième syntaxe,
@layer
est utilisée pour associer des propriétés CSS à une couche de cascade. La priorité de ces propriétés sera modifiée par la priorité de la couche de cascade.Si le nom spécifié pour la couche et déjà existant, la priorité de cette couche ne sera pas modifiée. Si le nom n'a pas encore été défini, une nouvelle couche est créée avec ce nom, et avec la priorité la plus forte.
Toutes les syntaxes CSS peuvent être insérées dans une couche de cascade, sauf :
- La directive
@charset
. En effet, cette directive doit être unique et figurer au tout début de la feuille de styles. - La directive
@namespace
qui définit un espace de noms. Cette directive est surtout utilisée lorsque les styles sont appliqués à un document XML. - La directive
@import
. Voir la syntaxe plus loin pour importer des styles dans une couche de cascade.
- La directive
- @import url("feuille.css") layer(couche-1);
Une syntaxe complémentaire, qui n'utilise pas la directive
@layer
mais la directive@import
. Elle permet de charger une feuille de styles externe directement dans la couche de cascade spécifiée.Reportez-vous à la directive
@import
pour des précisions complémentaires.Pour information, la balise HTML link permet également de préciser le nom de la couche de cascade dans laquelle les styles doivent être insérés :
<link rel="stylesheet" href="styles.css" layer="nom-couche">
Tutoriel sur les couches de cascade.
Rappel : les priorités en CSS.
CSS applique des règles très particulières pour résoudre les conflits entre plusieurs règles dont les sélecteurs pointent sur des éléments identiques. Prenons l'exemple ci-dessous, qui présente un fragment de code HTML et quelques styles. Les trois règles CSS s'appliquent au paragraphe de l'exemple, mais en utilisant des sélecteurs différents.
<p id="intro" class="edito">...</p>
<style>
#intro {color:red;}
.edito {color:blue;}
p {color:black;}
</style>
Les règles de priorité classiques définissent que le paragraphe doit s'afficher en rouge, et donc que la deuxième et la troisième règle doivent être ignorées. En effet, la priorité de chacune des règles est fonction du type du sélecteur :
Sélecteur par identifiant | ⟵ Priorité la plus forte |
Sélecteur par classe | |
Sélecteur par balise | |
Sélecteur * (étoile) | ⟵ Priorité la plus faible |
Pour des explications plus détaillées, consultez la page sur Les priorités en CSS.
En quoi ce fonctionnement pose-t-il un problème ?
Soyons clair : ce mécanisme des priorités est pratiquement toujours très efficace et pose rarement des problèmes.
Cependant des composants sont souvent intégrés à un site web, et certains d'entre eux sont accompagnés d'une feuille de styles. Pour que l'intégration visuelle soit correcte, le développeur souhaite souvent surcharger les styles livrés avec le composant. Si ces derniers utilisent des sélecteurs par identifiant, il ont d'ores et déjà une priorité forte et seront difficiles à surcharger.
L'option !important
.
Lorsque le développeur souhaite surcharger une règle déjà existante et qui comporte un sélecteur de forte priorité, il peut ajouter l'option
!important
à la fin de la nouvelle règle. Les règles comportant cette option deviennent prioritaires sur toutes les autres.
.edito {color: blue !important;}
On devine cependant que cette solution manque de subtilité : elle détruit le mécanisme habituel des priorités qui est malgré tout,
dans la plupart des cas, très pratique et nécessaire.
Et si on doit surcharger une règle qui comporte déjà l'option !important
, il faudra remettre cette option sur le nouvelle
règle. On constate souvent qu'après avoir détruit une fois le mécanisme des priorités, on est obligé de mettre !important
de partout.
Les couches de cascade.
Les couches de cascade permettent une gestion beaucoup plus fine des priorités : il est possible de définir autant de couches que nécessaire et de définir leur priorité les unes par rapport aux autres. Les règles CSS associées à chacune des couches prennent la priorité de leur couche. Le mieux est de prendre un exemple.
/* On définit 3 couches dans l'ordre de priorité croissant */
/* base à la priorité la plus faible, special a la priorité la plus haute */
@layer base, theme, special;
/* Des règles sont ensuite associées aux couches */
@layer base {
.classe {color: black;} /* faible priorité */
}
@layer special {
.classe {color: red;} /* forte priorité */
}
A l'intérieur d'une même couche, les priorités sont gérées par le mécanisme habituel : le type de sélecteur définit la priorité.
Note : les règles CSS qui ne sont pas associées à une couche restent prioritaires sur celles qui sont associées à une couche.
Imbrication des couches de cascade.
Des directives @layer
peuvent être imbriquées les unes dans les autres. Cela permet de définir des couches de cascade
à plusieurs niveaux.
@layer groupe-1 {
@layer couche-1 {
...
}
@layer couche-2 {
...
}
}
Mais il est souvent plus simple d'utiliser une notation pointée pour décrire l'imbrication des couches :
@layer groupe-1.couche-1, groupe-1.couche-2;
@layer groupe-1.couche-1 {
...
}
@layer groupe-1.couche-2 {
...
}
La valeur revert-layer
.
Cette nouvelle valeur, introduite dans le niveau 5 du module de standardisation "CSS Cascading and Inheritance", annule les modifications apportées à la valeur d'une propriété dans la même couche de cascade. les modifications apportées dans une autre couche de cascade sont maintenues.
Reportez vous à la page revert-layer
pour des précisions complémentaires.
Compatibilité des navigateurs avec la directive @layer
.
Les couches de cascade sont maintenant bien gérées par les navigateurs. Il est donc très intéressant de les utiliser, surtout pour les gros sites, ou les sites qui utilisent des composants créés par des tiers et qui comportent leurs propres styles
@layer
, qui définit des couches de cascade.de cascade
@layer
Navigateurs sur ordinateurs :
Navigateurs sur mobiles :
Navigateurs obsolètes ou marginaux :

Internet Explorer

QQ Browser

Safari sur IOS

Firefox pour Androïd

Opéra Mobile

Baidu Browser

KaiOS Browser

UC Browser pour Androïd

Opéra

Safari

Firefox

Chrome pour Androïd

Samsung Internet

Chrome

Edge

Androïd Brower

Opéra mini
Évolution de la directive @layer
.
-
Module CSS - Cascade et héritage - Niveau 5
Introduction des couches de cascade et de la directive@layer
.19 Janvier 2021Document de travail.13 Janvier 2022Candidat à la recommandation.
Voir aussi, au sujet de l'organisation des feuilles de styles.
La spécification "Module CSS - Cascade et héritage" (CSS Cascading and Inheritance) regroupe les outils disponibles pour organiser les styles dans les cas complexes (nombreuses feuilles de styles, cascade d'héritages volumineuse, etc.