quelle est ma couleur ?
plus c'est haut, plus c'est violent
opérateurs (* > + ~ espace)
éléments (+ pseudo-éléments)
.class (+ pseudo-classes) + attribut
#id
style=""
!important
:not()
:where()
:has()
!important + specificity + nesting
Fil rouge
!important, transitions, animations
styles navigateur, styles utilisateur, styles du développeur
règles de spécificité (poids) des sélecteurs
ordre d'affichage (le dernier écrase le précédent)
La spécificité des sélecteurs :
a { color: salmon }
a:hover, a:focus { color: purple }quelle couleur l'emporte ?
reset.css
ul#navigation > a { color: salmon }
ul#navigation li a { color: pink } /* TODO: à changer ASAP ! */
#navigation a.link { color: olive }
body ul#navigation li a { color: tomato }
body nav ul li a.link:first-child { color: chocolate }legacy-2010.css
ul#navigation li a { color: hotpink }navigation.css
c'était "olive"
spoiler : non
.navigation-link { color: pink }
.navigation-link:first-child { color: chocolate }legacy-2010.css
.navigation-link { color: hotpink !important }navigation.css
!important surclasse tous les poids de sélecteurs et complique la maintenance future des styles.
bootstrap.min.css (1043x !important)
.navigation-link { color: pink }
.navigation-link:first-child { color: chocolate }legacy-2010.css
.navigation-link { color: hotpink }navigation.css
Cibler uniquement avec des classes permet de modifier facilement quand le contexte change
ouais enfin quand c'est possible hein
wait, what?
confère une spécificité de zéro !
spécificité = 1, 1, 1
...
#navigation a.link { color: olive }
...legacy-2010.css
ul#navigation li a { color: hotpink }navigation.css
spécificité = 1, 0, 3 😥
spécificité = 1, 0, 0
...
#navigation :where(a.link) { color: olive }
...legacy-2010.css
ul#navigation li a { color: hotpink }navigation.css
spécificité = 1, 0, 3 💪
wait, what encore?
isole les couches de spécificités de CSS
...
#navigation a.link { color: olive }
...legacy-2010.css
ul#navigation li a { color: hotpink }navigation.css
je gagne
je gagne
legacy-2010.css
je place les styles dans une couche que j'appelle "legacy"
@layer legacy {
#navigation a.link { color: olive }
}.link { color: hotpink }navigation.css
les styles hors layers sont prioritaires 💪
importer dans un layer
On peut importer des feuilles de styles au sein de Layers
(oui oui, ça marche avec bootstrap.css aussi)
@import "legacy-2010.css" layer(legacy);
.link { color: hotpink }styles.css
je gagne
je gagne
On peut même importer des feuilles de styles au sein de Layers anonymes
@import "legacy-2010.css" layer;
.link { color: hotpink }styles.css
l'ordre des couches
styles.css
/* L'ordre des layers définit la priorité des styles */
/* Chaque layer écrase le précédent si conflit */
@layer config, base, components, utilities;
/* Config */
@import "reset.css" layer(config);
@import "theme.css" layer(config);
@import "theme-tokens.css" layer(config);
@import "layouts.css" layer(config);
@import "natives.css" layer(config);
/* Base */
@import "styles.css" layer(base);
/* Components */
/* Ici un @import dans le layer(components) */
/* Utilities */
/* Ici un @import dans le layer(utilities) */Cascade