Les requêtes de style et de conteneur en CSS
Introduction
Il ne faut pas confondre les requêtes multimédias (media queries) qui permettent de changer l’état d’un élément en fonction de la taille du viewport (la fenêtre du navigateur) et les requêtes de conteneur dont la fonction est de changer l’état d'un élément selon la taille de son conteneur.
Les requêtes de conteneur sont particulièrement pratiques pour la conception réactive et les composants réutilisables.
Nous verrons dans cet article comment mettre en oeuvre ces requêtes et comment elles peuvent être utiles dans certains cas.
Fonctionnement des requêtes de conteneur
Il nous faut aborder deux notions essentielles pour parler du fonctionnement des requêtes de conteneur.
Propriété container
Tout d'abord, nous devons mettre en place un contexte de confinement (containment context) sur un conteneur avec la propriété container. Celle-ci est le raccourci pour les propriétés container-name et container-type, réciproquement pour le nom du conteneur et le type de changement.
En ce qui concerne le nom, il est optionnel. En effet, par défaut, une requête de conteneur recherche le conteneur ancêtre le plus proche du type approprié . Cependant, si vous souhaitez mettre en place plusieurs requêtes différentes, dans ce cas, il vous faudra déclarer des noms.
En ce qui concerne le type, il existe trois valeurs :
- -
size: La requête est interrogée sur les dimensions en ligne et en bloc du conteneur. On peut changer la mise en page, le style ainsi que la taille du conteneur. - -
inline-size: La requête est interrogée sur les dimensions en ligne du conteneur. On peut changer la mise en page, le style ainsi que la taille en ligne du conteneur. - -
normal: L'élément n'est pas un conteneur de requêtes pour les requêtes de taille de conteneur, mais reste un conteneur de requêtes pour les requêtes de style conteneur.
Voici ce que cela donne en terme de code :
.votre-classe {
container-name: votre-nom;
container-type: inline-size;
}
/* ou */
.votre-classe {
container: votre-nom / inline-size;
}
Règle@ @container
Parlons maintenant de la seconde notion pour définir une requête de conteneur, la règle @container qui va permettre d'appliquer des styles dans le contexte de confinement.
Ces styles seront effectifs une fois le changement de taille effectué. Le code se présente ainsi :
@container (max-width: 600px) {
h2 {
font-size: 2rem;
}
}
/* ou */
@container (width <= 600px) {
h2 {
font-size: 2rem;
}
}
Unités de longueur de requête de conteneur
Les requêtes de conteneur possèdent leurs propres unités. Elles fonctionnent de la même manière que les unités de requêtes multimédias ( vw, vh, vmin, ...), mais si celles-ci se trouvent à l'intérieur d'un conteneur de taille, elles utiliseront les dimensions du conteneur au lieu des dimensions de la fenêtre.
Ci-dessous, la liste des unités disponibles :
cqw: correspond à 1% de la largeur d'un conteneur de requête.cqh: correspond à 1% de la hauteur d'un conteneur de requête.cqi: correspond à 1% de la taille en ligne d'un conteneur de requête.cqb: correspond à 1% de la taille de bloc d'un conteneur de requête.cqmin: correspond à la plus petite valeur decqioucqbcqmax: correspond à la plus grande valeur decqioucqb
Vous pouvez vérifier la prise en charge des navigateurs concernant ces unités.
h2 {
font-size: clamp(2rem, 8cqi, 4rem);
}
Les requêtes de style
Par défaut, tous les éléments sont des conteneurs de style. C'est d'ailleurs pour cette raison que l'on spécifie une valeur de taille lorsque l'on souhaite modifier la taille d'un conteneur avec une requête.
Il s'agit donc du même principe. Vous pouvez interroger le style calculé d'un élément de parent direct ou indirect à l'aide de requêtes de style. Ces requêtes permettent d'interroger le style de n'importe quel élément parent d'une page et d'appliquer des styles à ses enfants en fonction des styles de son parent.
Il suffit simplement de le déclarer comme ceci :
/* accepte toute déclaration de style valide*/
@container style(){
...
}
Si vous souhaitez interroger les styles d'un élément qui n'est pas un parent direct, vous devez attribuer un nom à cet élément.
Cas d'utilisation de requêtes de conteneur
Changement de taille (largeur) sur une carte
Voici un exemple simple, celui d'une carte, avec une photo et du texte. L'objectif est de changer la taille de la carte sur la largeur lorsque celle-ci atteint une largeur définie via la requête (ici 400px), afin de créer deux colonnes.
Ci-dessous, un exemple similaire avec, en plus, l'utilisation des sous-grilles CSS (subgrid CSS) :
voir CSS container queries et subgrid CSSChangement de taille (hauteur) sur une fenêtre
L'objectif dans cet exemple est de faire en sorte que l'en-tête devienne collant lorsque le contenu de la fenêtre est suffisamment long. Nous allons utiliser pour ce faire le positionnement CSS avec la valeur sticky.
Pagination
Un autre cas qui peut s'avérer intéressant est celui d'une pagination. En version mobile, nous avons deux boutons suivant et précédent. Puis, une fois que la taille laisse un espace suffisant, nous voyons apparaître une liste de liens tandis que les deux boutons disparaissent.
voir pagination CSS container queriesResponsive bouton
Dans cet exemple, nous allons faire en sorte que le bouton "Ajouter au panier" s'adapte à la taille du conteneur.
Exemple responsive bouton CSS container queriesCas d'utilisation de requêtes de style
Nous pouvons légitimement nous interroger sur l'intérêt d'utiliser les requêtes de style. En effet, pourquoi ne pas utiliser une classe tout simplement pour appliquer un style particulier à un élément ?
L'objectif des requêtes de style est de rendre le CSS plus lisible et plus facile à modifier. Les requêtes de style vise également à réduire la spécificité que l'on obtient en utilisant une classe spécifique ou encore en stylisant des attributs HTML (tel que data-), qui n'est pas une bonne pratique.
En théorie, nous devrions pouvoir faire ceci, à savoir que lorsqu'un élément contient une couleur noire, l'arrière-plan est blanc :
@container style(color: black) {
.class {
background: white;
}
}
En pratique, ce n'est toujours pas possible (octobre 2025). Le seul moyen est d'utiliser des propriétés personnalisées.
Tableau de prix
Pour commencer, un exemple simple. Nous allons ajouter une couleur d'arrière plan sur un élément afin de le mettre en valeur avec une requête de style.
voir Tableau de prix style queries
Mode nuit
Voir dark mode style queriesContenu généré CSS
Il est également possible de viser les pseudo-éléments (autrement dit du contenu généré) avec les requêtes de style. Ainsi allons-nous pouvoir définir le style et la position de la flèche d'une infobulle.
voir Contenu généré CSS style queries
Requêtes de conteneur d'état de défilement
Tout comme une requête de conteneur classique, il est necéssaire de déclarer le type de conteneur et d'utiliser la règle @container.
Il existe pour l'instant trois types d'état de défilement :
- État bloqué (
stuck) : possibilité de changer le style lorsqu'un élément est collé à un bord. - État ancré (
snapped) : Déclenche des modifications de style lorsqu'un élément est aligné sur un axe. - État de défilement (
scrollable) :Déclenche des changements de style lorsqu'un élément déborde.
C'est assez simple à mettre en place.
.conteneur {
container-type: scroll-state
}
@container scroll-state(/*ici l'état à appliquer*/) {
.contenu {
...
}
}
Menu collant
Dans le cas suivant, celui d'une requête d'état bloqué, pour parvenir à coller notre menu en haut d'une page, nous allons utiliser la valeur scroll-state de la propriété container-type dans le conteneur.
Puis, nous allons déclarer la règle@ @container à l'intérieur de laquelle se situera l'élément collant, notre menu. On ajoute les changements de style à appliquer au défilement et éventuellement des transitions. En somme, rien de compliqué.
Haut de page (back to top)
Voir haut de page (back to top)Carrousel
En ce qui concerne les requêtes d'état ancré, nous allons avoir besoin d'utiliser le module CSS Scroll-Snap (article).
État de défilement : Tableau responsive sticky position avec ombrage au scroll
Voir Tableau ombrage au scrollSources, inspirations, ressources :
Source originale exemple CSS container height
Source originale Source exemple pagination
Article (EN) style queries
Article (EN) container queries
Un excellent article(EN) sur les requêtes de conteneur et de style
Source originale exemple infobulle