CSS :has(), partie 2

Introduction Introduction

Voici la suite de l’article sur les possibilités avec le :has(), pour voir la première partie, vous pouvez cliquer le lien de la partie 1 de l’article

La sélection par quantité La sélection par quantité

Ciblage par index Ciblage par index

En CSS, le sélecteur :nth-child() permet de cibler un enfant en fonction de son index, autrement dit selon sa position en tant qu’enfant.

Pour approfondir vos connaissances sur :nth-child(), vous pouvez lire l’article sur :nth-child()

Voici quelques exemples :

/* Ciblage par index */
span:nth-child(3) {
}
/* Ciblage à partir d'un index */
span:nth-child(n + 3) {
}
/* Idem en partant de la fin */
span:nth-last-child(n + 3) {
}

Ciblage en fonction du nombre d’éléments Ciblage en fonction du nombre d’éléments

Il est possible d’appliquer un style à un élément en fonction du nombre de ses enfants :

/* dès que 5 enfants et plus */
ul:has(> *:nth-child(5n)) {
}
/* avec nth-last-child */
article:has(section > span:nth-last-child(n + 3)) {
}

Prenons un exemple concret et imaginons que nous ayons un conteneur d’éléments qui doit passer à l’orange dès que le nombre de burgers est supérieur à 3 puis au rouge dès que l’on dépasse 6 burgers. On va aussi dynamiser l’affichage d’un message en fonction de ces dépassements.

🍔
Voir sur Codepen

La sélection par attribut La sélection par attribut

Les sélecteurs d’attributs sont également très utiles pour cibler certains de nos éléments. On peut aller assez loin dans les patterns de sélection avec un peu d’expressions régulières.

Appliquer du style selon la valeur de l’attribut Appliquer du style selon la valeur de l’attribut

Par exemple, on peut appliquer un certain style sur un lien qui serait externe au site :

a:is([href^="https://"],[href^="http://"])
{
}

Imaginons maintenant que nous souhaitions personnaliser un encart contenant un lien de téléchargement en fonction du type fichier. En combinant le :has() et un sélecteur d’attribut, c’est tout à fait possible :

Voir sur Codepen

Autres cas avec has Autres cas avec has

Cibler les éléments adjacents autres que l’élément survolé Cibler les éléments adjacents autres que l’élément survolé

Dis comme ça, on ne voit pas quel serait l’intérêt d’un tel ciblage.

Imaginons maintenant une galerie d’images sur laquelle, lorsque je survole une image, les autres seraient mises en retrait.

On pourrait essayer le faire depuis le hover du parent mais ce n’est pas tout à fait ce que l’on souhaite car cette solution déclenche l’effet dès que l’on survole le parent.

Ce qu’on souhaite ici, c’est déclencher l’effet uniquement au survol d’un enfant. En combinant le :has() et le :not(), voici ce que cela donne :

Voir sur Codepen

Elément vide Elément vide

Il était déjà possible d’appliquer du style sur un élément dont le contenu est vide. Cet article détaille ce que signifie un élément vide exactement (attention aux whitespaces 😉)

On peut donc le combiner avec un :has() pour appliquer du style sur un élément dont tous les enfants sont vides.

/* ici, on vérifie les enfants directs */
.card:has(> *:empty) {
}
Voir sur Codepen

Sur un menu, les liens de premier niveau peuvent potentiellement avoir un sous-menu. Généralement, on indique à l’utilisateur, l’existence de ce sous-menu à l’aide d’une petite flèche.

/* ici, on vérifie les enfants directs */
nav li:has(ul) a:after {
  content: '▼';
}

C’est la fin de cet article, on se rend compte des possibilités qu’offre la pseudo-classe :has(). Il y a également pas mal de cas d’usage autour des formulaires, c’est pour cette raison que j’ai dédié un article sur les formulaires et le has

Retour à la liste des articles
Github de Samuel Gomez Linkedin de Samuel Gomez Twitter de Samuel Gomez Instagram de Samuel Gomez
Allez en haut