@property: donner des superpouvoirs aux variables CSS

CSS Houdini est un terme générique qui désigne un ensemble d'API de bas niveau qui exposent certaines parties du moteur de rendu CSS et permettent aux développeurs d'accéder au modèle CSS Object Model. Il s'agit d'un changement important pour l'écosystème CSS, car il permet aux développeurs d'indiquer au navigateur comment lire et analyser le code CSS personnalisé sans attendre que les fournisseurs de navigateurs fournissent une compatibilité intégrée pour ces fonctionnalités. C'est génial !

L'API Properties and Values est l'un des ajouts les plus intéressants au CSS dans le cadre de Houdini.

Cette API optimise vos propriétés personnalisées CSS (également appelées variables CSS) en leur donnant une signification sémantique (définie par une syntaxe) et même des valeurs de remplacement, ce qui permet de réaliser des tests CSS.

Écrire des propriétés personnalisées Houdini

Voici un exemple de définition d'une propriété personnalisée (par exemple, une variable CSS), mais avec une syntaxe (type), une valeur initiale (remplacement) et une valeur booléenne d'héritage (hérite-t-elle ou non de la valeur de son parent ?). La méthode actuelle consiste à utiliser CSS.registerProperty() en JavaScript, mais dans les navigateurs compatibles, vous pouvez utiliser @property:

Fichier JavaScript distinct (Chromium 78)
CSS.registerProperty({
  name: '--colorPrimary',
  syntax: '',
  initialValue: 'magenta',
  inherits: false
});
Inclus dans le fichier CSS (Chromium 85)
@property --colorPrimary {
  syntax: '';
  initial-value: magenta;
  inherits: false;
}

Vous pouvez désormais accéder à --colorPrimary comme toute autre propriété personnalisée CSS via var(--colorPrimary). Cependant, la différence ici est que --colorPrimary n'est pas simplement lu comme une chaîne. Il contient des données !

Valeurs de remplacement

Comme pour toute autre propriété personnalisée, vous pouvez obtenir (en utilisant var) ou définir (écrire/réécrire), mais avec les propriétés personnalisées Houdini, si vous définissez une valeur "false" lors de son remplacement, le moteur de rendu CSS enverra la valeur initiale (sa valeur de remplacement) au lieu d'ignorer la ligne.

Prenons l'exemple ci-dessous. La variable --colorPrimary présente une valeur initial-value de magenta. Cependant, le développeur lui a attribué la valeur non valide : "23". Sans @property, l'analyseur CSS ignore le code non valide. L'analyseur revient maintenant à magenta. Cela permet de véritables remplacements et de tests dans le CSS. Excellent !

.card {
  background-color: var(--colorPrimary); /* magenta */
}

.highlight-card {
  --colorPrimary: yellow;
  background-color: var(--colorPrimary); /* yellow */
}

.another-card {
  --colorPrimary: 23;
  background-color: var(--colorPrimary); /* magenta */
}

Syntaxe

Avec la fonctionnalité syntaxique, vous pouvez maintenant écrire du code CSS sémantique en spécifiant un type. Les types actuellement autorisés sont les suivants:

  • length
  • number
  • percentage
  • length-percentage
  • color
  • image
  • url
  • integer
  • angle
  • time
  • resolution
  • transform-list
  • transform-function
  • custom-ident (chaîne d'identifiant personnalisée)

La définition d'une syntaxe permet au navigateur de vérifier le type des propriétés personnalisées. Cela présente de nombreux avantages.

Pour illustrer ce point, je vais vous montrer comment animer un dégradé. Actuellement, il n'existe aucun moyen d'animer (ou d'interpoler) de manière fluide entre les valeurs de gradient, car chaque déclaration de gradient est analysée en tant que chaîne.

À l'aide d'une propriété personnalisée avec une syntaxe de type "nombre", le dégradé de gauche montre une transition en douceur entre les valeurs des arrêts. Le dégradé de droite utilise une propriété personnalisée par défaut (aucune syntaxe définie) et montre une transition brusque.

Dans cet exemple, le pourcentage d'arrêt du gradient est animé d'une valeur de départ de 40% à une valeur de fin de 100% via une interaction de survol. Vous devriez constater une transition en douceur de cette couleur de dégradé supérieur vers le bas.

Le navigateur de gauche est compatible avec l'API Houdini Properties and Values, ce qui permet une transition en douceur des arrêts de dégradé. Le navigateur de droite ne la suit pas. Le navigateur non compatible ne peut comprendre cette modification que sous la forme d'une chaîne allant d'un point A au point B. Il n'est pas possible d'interpoler les valeurs, et la transition ne devrait donc pas être fluide.

Toutefois, si vous déclarez le type de syntaxe lors de l'écriture de propriétés personnalisées et que vous utilisez ces propriétés personnalisées pour activer l'animation, la transition s'affichera. Vous pouvez instancier la propriété personnalisée --gradPoint comme suit:

/* Check for Houdini support & register property */
@supports (background: paint(something)) {
  @property --gradPoint {
    syntax: '<percentage>';
    inherits: false;
    initial-value: 40%;
  }
}

Ensuite, au moment de l'animer, vous pouvez remplacer la valeur de l'élément 40% initial par 100%:

@supports (background: paint(something)) {
  .post:hover,
  .post:focus {
    --gradPoint: 100%;
  }
}

La transition en dégradé est ainsi fluide.

Bordures de dégradé à transition fluide. Voir la démonstration sur Glitch

Conclusion

La règle @property rend une technologie intéressante encore plus accessible en vous permettant d'écrire du code CSS pertinent d'un point de vue sémantique dans le CSS lui-même. Pour en savoir plus sur le CSS Houdini et l'API Properties and Values, consultez ces ressources:

Photo de Cristian Escobar sur Unsplash.