:has() en CSS, quand vos styles s’adaptent au contenu
Vendredi 16 Fevrier 2024 08:30

:has() en CSS, quand vos styles s’adaptent au contenu

Alors j’étais complètement passé à côté, mais cette fois ça y est, depuis le 19 Décembre dernier, Firefox accepte enfin la propriété CSS .has()!
Etrangement, les autres principaux browsers avaient déjà fait le pas mais firefox et c’est +/-8% de part de marché n’avait pas encore suivit le mouvement.

Si certain avait décidé de déjà l’utiliser, je préférais attendre les 8% manquant histoire d’avoir quelque chose de bien similaire partout.

Et ça fait quoi?

La propriété :has() permet de sélectionner un élément en fonction de son contenu.

En d’autres termes, si vous souhaitez sélectionner toutes les balises <li> qui contiennent une balise <a> vous pouvez le faire directement en css sans devoir appliquer de javascript qui va vite devenir contraignant. 

Mais comment ça marche ?

Reprenons notre exemple de liste qui pourrait être un menu

<ul>
    <li><a href=”#”>Menu01</a></li>
    <li><a href=”#” class=”active”>Menu02</a></li>
    <li>No link</li>
</ul>

Si vous désirez appliquez un style sur chaque <li> qui contient une balise <a>, il vous suffit de faire ceci:

li:has(a) {
    backgroung: red;
}

Vous pouvez évidemment être encore plus précis en imbriquant les sélecteurs

li:has(a.active) {
    backgroung: green;
}

Conclusion

Cette propriété va simplifier la vie de pas mal de monde car les cas pratiques sont infini: cibler un parent d'élément actif dans un menu, stylisé des conteneurs en fonction du contenu, appliquer des styles conditionnels dans des formulaires, identifier et modifier des éléments contenant des sous-menus, ou encore gérer des interactions complexes sans recourir au JavaScript.