@container - Directive CSS
Résumé des caractéristiques de la directive @container
Description de la directive @container.
La directive @container introduit la possibilité d'écrire des styles conditionnels en fonction des dimensions d'un élément.
Le terme anglais est container query.
De même que les media queries (voir la directive @media) permettent d'adapter les styles en fonction des caractéristiques du terminal :
dimensions du viewport, orientation de l'écran, etc. les container queries considèrent les caractéristiques d'un élément de la page (le conteneur)
pour appliquer ou non des styles à ses éléments enfants.
Remarque : une requête container queries ne peut appliquer des styles que aux enfants de l'élément qui a été déclaré comme le conteneur. Ce dernier, le conteneur lui même, ne peut pas être stylé dans une requête container queries le concernant.
Dans ce premier exemple, le logo de Firefox est une image flottante sur la gauche, ce qui permet d'avoir la description à côté de l'image.Mais si la largeur du conteneur est insuffisante, les lignes de texte situées à côté de l'image vont être très courtes, rendant la lecture difficile.
La largeur du conteneur peut être contrainte par la mise en page : par exemple ce conteneur peut être dans une cellule de grille contenant d'autres éléments et dont la largeur des colonnes est dynamique.
Pour les besoins de la démonstration, nous avons rendu la largeur du conteneur ajustable avec la souris.
Dans ce deuxième exemple, une requête container query a été utilisée pour rendre l'image non flottante lorsque la largeur du conteneur est
insuffisante (inférieure à 200 pixels).Comme ci-dessus, vous pouvez ajuster la largeur du conteneur avec la souris pour simuler une contrainte due à la mise en page.
Éléments de syntaxe :
Tout débord il faut définir quel élément est le conteneur, et de quel type de conteneur il s'agit. Cela peut se faire avec les propriétés container-name
et container-type ou plus simplement avec la propriété résumée container.
Pour l'exemple ci-dessus, nous avons défini que le nom du container est demo et qu'il agit suivant l'axe des lignes. L'image est également
déclarée flottante à gauche par défaut.
#description1b {
container-name: demo;
container-type: inline-size;
}
#description1b img {
float:left;
margin-right:10px;
}
Remarque : l'identifiant du conteneur peut être défini sur une classe, donc pas forcément pour un élément unique.
Il faut ensuite écrire la requête container query proprement dite. Celle-ci ne peut faire référence que à des éléments enfants du conteneur. Ici nous déclarons que l'image n'est plus flottante si la largeur du conteneur est inférieure à 200 pixels.
@container demo (width < 200px) {
#description1b img {
float:none;
margin-right:200px;
}
}
Autres exemples.
On sait que le texte justifié n'est pas très esthétique sur des lignes courtes : cela provoque des espaces exagérément grands entre les mots. Une requête container query a été utilisée pour aligner le texte à gauche lorsque la largeur du conteneur est inférieure à 300 pixels.
Ici la direction d'écriture s'adapte en fonction de la forme du conteneur : s'il est plus large que haut, l'écriture est horizontale, et verticale s'il est plus haut que large.
Unités spécifiques aux container queries.
Plusieurs unités ont été créées pour exprimer des dimensions en fonction des dimensions de l'élément conteneur. Reportez-vous à la page sur les unités de dimension relatives au conteneur.
Avantages des requêtes container queries.
Le principal avantage des container queries est de permettre la mise en forme d'un élément indépendamment du reste de la page. C'est particulièrement utile pour des composants, qui peuvent être insérés dans une page dont la mise en page est inconnue.
Les requêtes type scroll-state. ⚠
Ces requêtes permettent de s'informer sur l'état de défilement du container : peut-il défiler encore dans une direction ou une autre ?
S'agit-il d'un container avec accrochage (défilement avec accrochages) ? Et enfin, pour les container en position sticky, est-ce que
le container est bloqué à une extrémité de l'écran, et laquelle ?
Les requêtes style container queries. ⚠
Cette évolution des container queries permet de tester n'importe quelle propriété de l'élément conteneur. C'est la valeur calculée de la propriété
qui est prise en compte.
Mais cette fonctionnalité est encore peu prise en charge.
Exemples de syntaxes pour @container.
- @container id (width > 200px) and (width < 400px) { ... }
Ceci est la syntaxe de base d'une requête container query.
idest un identifiant facultatif. Il aura été défini par le propriétécontainer-nameoucontainersur un ou plusieurs des éléments de la page.
S'il n'est pas renseigné, la requête s'applique à tous les conteneurs de la page.(width > 200px)est une condition faisant intervenir une propriété et une valeur. C'est la valeur calculée de la propriété qui est prise en compte.and,orounotsont des opérateurs permettant de combiner plusieurs conditions, chacune des conditions étant inscrites entre parenthèses.
Les propriétés utilisables dans les conditions sont :
widthetheight: largeur ou hauteur de l'élément conteneur.inline-sizeetblock-size: dimension de l'élément conteneur dans la direction des lignes, ou dans la direction des blocs.aspect-ratio: ratio correspondant à la largeur de l'élément conteneur divisé par sa hauteur.orientation: prend la valeurlandscapesi la largeur de l'élément conteneur est plus grande que sa hauteur, et la valeurportraitdans le cas contraire.
Les tests sur la hauteur (
height), la dimension dans la direction des blocs (block-size), le ratio et l'orientation ne sont prises en charge que sur les conteneurs de typesize(voircontainer-type).Ce texte passe en rouge dès que la largeur est inférieure à 150 pixels.Ce texte passe en rouge dès que son orientation est en portrait. Nous avons écritnot(orientation:landscape)Ce qui renvient au même. Changez ses dimensions pour constater.Ce texte passe en rouge dès que sa largeur est inférieure à sa hauteur. Changer ses dimensions pour le constater.
Les navigateurs reconnaissent en principe une autre syntaxe, héritée du passé, et qui est moins lisible que la précédente. Voici cette ancienne syntaxe, avec les équivalences.@container id ((min-width: 200px) and (max-width: 400px)) { sélecteur { propriétés CSS } }min-width: valeur⇔width > valeurmax-width: valeur⇔width < valeurmin-height: valeur⇔height > valeurmax-height: valeur⇔height < valeur - @container id scroll-state(stuck:top) { ... }
Le descripteur
stuckn'est actif que sur les éléments dont la propriétépositioneststicky. Utilisé avec la fonctionscroll-state(), il s'active lorsque l'élément conteneur est "collé" par l'un de ses bords :none: l'élémentstuckne joue aucun rôle.top: l'élément est collé au bord supérieur.right: l'élément est collé au bord droit.bottom: l'élément est collé au bord inférieur.left: l'élément est collé au bord gauche.block-start: l'élément est collé au bord correspondant au début des blocs.block-end: l'élément est collé au bord correspondant à la fin des blocs.inline-start: l'élément est collé au bord correspondant au début des lignes.inline-end: l'élément est collé au bord correspondant à la fin des lignes.
Le type de container (
container-type) doit êtrescroll-state.L'exemple ci-dessous est composé d'un bloc de confinement (id=stuck-container), qui contient un élément de texte (id=stuck-element). Le bloc de confinement est
position:sticky, il reçoit les propriétéscontainer-type, fixée àscroll-state, et un identifiant définir parcontainer-name. L'élément reçoit la couleur rouge lorsquesticky:bottom.
Faites défiler la page vers le haut pour coller le bloc au bas de l'écran.⚠ Cela ne marche pas sur tous les navigateurs.
Ce texte passe en rouge dès qu'il est collé par son bord inférieur. - @container id scroll-state(scrollable: top) { ... }
Le descripteur
scrollables'active lorsque le conteneur peut faire l'objet d'un défilement (présence d'une barre de défilement et contenu dépassant la taille du conteneur).none: l'élémentscrollablene joue aucun rôle.top: l'élément eut être défilé vers le haut.right: l'élément peut être défilé vers la droite.bottom: l'élément peut être défilé vers le bas.left: l'élément peut être défilé vers la gauche.x: l'élément peut être défilé dans le sens horizontal.y: l'élément peut être défilé dans le sens vertical.block-start: l'élément est collé au bord correspondant au début des blocs.block-end: l'élément est collé au bord correspondant à la fin des blocs.inline-start: l'élément est collé au bord correspondant au début des lignes.inline-end: l'élément est collé au bord correspondant à la fin des lignes.block: l'élément peut être défilé ans le sens des blocs.inline: l'élément peut être défilé dans le sens des lignes.
Ici aussi, le type de container doit être
scroll-state.L'élément principal est le conteneur de confinement (id=scroll-container). Il contient un élément (id=scroll-element) avec un texte assez long pour nécessiter un défilement. Deux requêtes container query affichent l'élément bleu lorsque le défilement vers le haut n'est plus possible, et en rouge lorsque le défilement vers le bas n'est plus possible. Rappelons que ces requêtes ne peuvent agir que sur un descendant du conteneur de confinement.
⚠ Cela ne marche pas sur tous les navigateurs.
Ce texte passe en bleu lorsqu'il n'est plus possible de le faire défiler vers le haut, et en rouge dès qu'il n'est plus possible de le faire défiler vers le bas. Cela a nécessité deux requêtes container query.
- @container id scroll-state(snapped: block) { ... }
Le descripteur
snappedpermet de tester si le conteneur de confinement est ancré. Il faut donc qu'il se trouve dans un conteneur avec un ancrage sur le défilement.none: l'élémentsnappedne joue aucun rôle.x: le conteneur est un élément avec accrochage suivant X.y: le conteneur est un élément avec accrochage suivant Y.block: le conteneur est un élément avec accrochage suivant l'axe des blocks..inline: le conteneur est un élément avec accrochage suivant l'axe des lignes.both: le conteneur est un élément avec accrochage suivant les deux axes.
Ici le conteneur de confinement est multiple. Il a la capacité de s'ancrer lors du défilement (
scroll-snap-align:center). Il reçoit bien sûr les propriétécontainer-nameetcontainer-typequi en font un conteneur de confinement, plus quelques autres propriétés de mise en forme.
Au dessus, se trouve le conteneur de défilement avec ancrage (id=container) avec la propriétéscroll-snap-type:y mandatory.
Si nécessaire, reportez-vous au tutoriel sur défilements avec accrochages.En utilisant la barre de défilement, vous ancrez successivement chacun des éléments. Celui qui est ancré prend un fond coloré.
⚠ Cela ne marche pas sur tous les navigateurs.
1
2
3
4
- @container id style(propriété:valeur) { ⚠ ... }
La fonction
style()permet de tester la présence d'une propriété qui serait appliquée au conteneur, directement ou par le biais d'un héritage. Pour l'instant (2025) cela ne marche que avec des propriétés personnalisées.⚠ Cela ne marche pratiquement sur aucun navigateurs.
Ce texte passe en rouge dès que son alignement centré.Ce deuxième paragraphe n'est pas centré.
Les exemples très simples donnés ici sont constitués d'un élément conteneur qui sert au confinement, et d'un élément interne sur lequel les propriétés sont ajustées. Il n'est pas possible en effet de changer les propriétés du conteneur lui-même.
Prise en charge par les navigateurs (compatibilité).
La directive @container est bien reconnue pour ce qui est des tests sur les dimensions du conteneur, mais pas encore pour les tests de défilement
avec scroll-state(), ni sur les tests de styles avec styles().
@container qui facilite beaucoup l'écriture de composants.scroll-state() avec la directive @container.style() dans la syntaxe de la directive @container.@containerscroll-state()dans
@containerstyle()dans
@containerNavigateurs sur ordinateurs :
Navigateurs sur mobiles :
Navigateurs obsolètes ou marginaux :

Internet Explorer

UC Browser pour Androïd

Safari

Safari sur IOS

Opéra Mobile

QQ Browser

Baidu Browser

Chrome

Edge

Firefox

Opéra

Chrome pour Androïd

Samsung Internet

Androïd Brower

Firefox pour Androïd

KaiOS Browser

Opéra mini
Évolution de la directive @container.
-
Module CSS - Confinement - Niveau 3
Introduction des techniques de "confinement" et de la directive@container.21 Décembre 2021Document de travail.
Voir aussi, à propos des techniques de confinement.
Les propriétés et autres notions concernant le confinement sont décrites dans la spécification CSS Containment Module.



