@container et :has(): deux nouvelles API responsives performantes arrivent dans Chromium 105

Les requêtes de conteneur et :has() forment une correspondance parfaite. Heureusement, ces deux fonctionnalités seront disponibles simultanément dans Chromium 105. Cette version majeure comprend deux fonctionnalités très demandées pour les interfaces responsives.

Requêtes de conteneur: un bref résumé

Les requêtes de conteneur permettent aux développeurs d'interroger un sélecteur parent pour obtenir des informations sur sa taille et son style. Cela permet à un élément enfant de posséder sa logique de style responsif, quel que soit l'emplacement sur une page Web.

Au lieu de s'appuyer sur la fenêtre d'affichage pour obtenir des informations de style telles que l'espace disponible, les développeurs peuvent désormais également interroger la taille des éléments de la page. Cette fonctionnalité signifie qu'un composant est propriétaire de sa logique de stylisation responsive. Le composant est ainsi beaucoup plus résilient, car la logique de style lui est associé, quel que soit l'endroit où il apparaît sur la page.

Utiliser des requêtes de conteneur

Pour compiler avec des requêtes de conteneur, vous devez d'abord définir la structuration sur un élément parent. Pour ce faire, définissez un container-type sur le conteneur parent. Voici un exemple de fiche avec une image et du texte:

Carte unique à deux colonnes.

Pour créer une requête de conteneur, définissez container-type sur le conteneur de la fiche:

.card-container {
  container-type: inline-size;
}

Définir container-type sur inline-size interroge la taille de la direction en ligne du parent. Dans les langues latines comme l'anglais, il s'agit de la largeur de la fiche, car le texte s'affiche en ligne de gauche à droite.

Nous pouvons maintenant utiliser ce conteneur pour appliquer des styles à tous ses enfants à l'aide de @container:

.card {
  display: grid;
  grid-template-columns: 1fr 1fr;
}

@container (max-width: 400px) {
  .card {
    grid-template-columns: 1fr;
  }
}

Sélecteur parent :has()

La pseudo-classe CSS :has() permet aux développeurs de vérifier si un élément parent contient des enfants avec des paramètres spécifiques.

Par exemple, p:has(span) indique un sélecteur de paragraphe (p) contenant un span. Vous pouvez l'utiliser pour appliquer un style au paragraphe parent ou à n'importe quel élément qu'il contient. figure:has(figcaption) permet par exemple d'appliquer un style à un élément figure contenant une légende. Pour en savoir plus sur :has(), consultez cet article de Jhey Tompkins.

Requêtes de conteneur et :has()

Vous pouvez combiner les capacités de sélection des parents de :has() avec les capacités de requête des parents des requêtes de conteneur pour créer des styles intrinsèques vraiment dynamiques.

Développons le premier exemple avec la fiche de fusée. Que faire si vous avez une carte sans image ? Vous pouvez augmenter la taille du titre et ajuster la mise en page en grille à une seule colonne pour que l'ensemble soit plus intentionnel sans image.

Texte plus grand sur la carte sans image. Il s'affiche dans une colonne.

Dans cet exemple, la fiche avec une image utilise un modèle de grille à deux colonnes, tandis que la fiche sans image utilise une mise en page à une seule colonne. De plus, la fiche sans image comporte un titre plus grand. Pour écrire cela à l'aide de :has(), utilisez le CSS suivant.

.card:has(.visual) {
  grid-template-columns: 1fr 1fr;
}

Vous recherchez un élément avec une classe de visual pour appliquer le style à deux colonnes ci-dessus. La fonction :not() est une autre fonction CSS intéressante. Il fait partie de la même spécification que :has(), mais existe depuis bien plus longtemps et est plus compatible avec les navigateurs. Vous pouvez même combiner :has() et :not(), comme suit:

.card:not(:has(.visual)) h1 {
  font-size: 4rem;
}

Dans le code ci-dessus, vous écrivez un sélecteur qui applique un style à un h1 dans une carte qui ne contient pas de classe visual. C'est ainsi que vous pouvez ajuster très clairement la taille de la police.

Synthèse

La démonstration ci-dessus montre une combinaison de :has(), :not() et @container, mais les requêtes de conteneur sont particulièrement utiles lorsque le même élément est utilisé à plusieurs endroits. Apportons une touche de style en présentant ces cartes sous forme de grille l'une à côté de l'autre.

Vous pouvez maintenant vraiment constater la puissance du CSS moderne. Nous pouvons écrire des styles clairs à l'aide de styles ciblés qui créent une logique sur la logique et des composants vraiment robustes. Avec ces deux fonctionnalités puissantes disponibles dans Chromium 105 et la progression de la compatibilité multinavigateur, c'est un moment passionnant pour être développeur d'UI !