veilletech.fr
22 août Feed du jour
#08 CSS Article

CSS : le sélecteur de préfixe est adopté

Adopté dans la spécification ne veut pas dire utilisable demain matin.

Le CSS Working Group a formellement adopté le sélecteur de préfixe de classe, .prefix-*, proposé par Lea Verou en 2024, et l'a ajouté au brouillon de Selectors Level 5. Il remplace les sélecteurs de sous-chaîne, verbeux et coûteux, par une syntaxe lisible de spécificité (0,1,0).

3 min de lecturevidéo 1:24
Partager
Sommaire6 sections
  1. Ce qui se passe
  2. Le problème
  3. La nouvelle syntaxe
  4. La vraie réserve
  5. Ce que ça change en pratique
  6. À retenir

Ce qui se passe

Le CSS Working Group a formellement adopté la proposition de sélecteur de préfixe de classe, et l'a ajoutée au brouillon de Selectors Level 5.

La proposition n'est pas neuve : Lea Verou l'avait publiée en 2024 et la défend depuis. Ce qui est nouveau, c'est son adoption officielle et son entrée dans la spécification.

Le problème

Le cas d'usage tient en quatre lignes. Vous avez une classe de base et ses variantes :

CSS
/* La classe de base */
.btn {
  padding: 0.5rem 1rem;
  border-radius: 4px;
}

Pour appliquer le même socle à .btn-primary, .btn-secondary, .btn-danger — et aux suivantes — trois options aujourd'hui, aucune satisfaisante.

Tout lister, et maintenir la liste à chaque nouvelle variante :

CSS
.btn-primary,
.btn-secondary,
.btn-danger { /* … */ }

Les sélecteurs de sous-chaîne, qu'il faut doubler pour couvrir les éléments portant plusieurs classes, et dont les performances sont mauvaises :

CSS
[class^="btn-"],
[class*=" btn-"] { /* … */ }

Les attributs data-, qui imposent en plus de modifier le HTML, sans être moins verbeux pour autant.

La nouvelle syntaxe

CSS
.btn-* {
  padding: 0.5rem 1rem;
  border-radius: 4px;
}

Quelques points de spécification à connaître :

La vraie réserve

Elle n'est pas syntaxique, elle est temporelle. Ce sélecteur n'est pas une amélioration progressive.

Étendre une fonction de couleur, comme le passage de rgba() à la notation rgb(… / …), est rétrocompatible : l'ancienne écriture continue de fonctionner, et rien ne casse pendant la transition. Ici, un navigateur qui ne connaît pas la règle l'ignore purement et simplement — et vos variantes perdent leur style.

Il faudra donc l'envelopper :

CSS
@supports selector(.prefix-*) {
  /* … */
}

…le temps que l'implémentation devienne courante et entre dans Baseline. Et c'est là que l'argument se retourne : si l'ergonomie est le principal atout de la proposition, elle est précisément ce qu'on perd pendant l'attente.

Les sélecteurs de sous-chaîne ne deviennent pas obsolètes pour autant : ils conservent leurs autres cas d'usage.

Ce que ça change en pratique

Rien tout de suite. Aucun navigateur n'implémente encore la fonctionnalité — l'adoption concerne la spécification, pas les moteurs de rendu.

Mais la décision compte pour quiconque conçoit une convention de nommage. Les systèmes qui préfixent leurs variantes — BEM, bibliothèques de composants, classes utilitaires — gagnent une façon de cibler une famille entière sans la lister ni payer le coût des sélecteurs d'attribut. C'est le genre de décision qui oriente une architecture CSS pour plusieurs années.