@container
Baseline
Widely available
*
This feature is well established and works across many devices and browser versions. It’s been available across browsers since février 2023.
* Some parts of this feature may have varying levels of support.
La règle @ CSS @container
est une règle conditionnelle de groupe qui applique des styles à un contexte de conteneur.
Les déclarations de style sont filtrées par une condition et appliquées au conteneur si la condition est vraie.
La condition est évaluée lorsque la taille du conteneur interrogé, le <style-feature>
ou l'état de défilement changent.
La propriété container-name
spécifie une liste de noms de conteneurs de requête. Ces noms peuvent être utilisés par les règles @container
pour filtrer les conteneurs ciblés. Le <container-name>
optionnel et sensible à la casse filtre les conteneurs ciblés par la requête.
Une fois qu'un conteneur de requête éligible a été sélectionné pour un élément, chaque fonctionnalité de conteneur dans le <container-condition>
est évaluée par rapport à ce conteneur.
Syntaxe
/* Avec une <size-query> */
@container (width > 400px) {
h2 {
font-size: 1.5em;
}
}
/* Avec un <container-name> optionnel */
@container tall (height > 30rem) {
p {
line-height: 1.6;
}
}
/* Avec un <scroll-state> */
@container scroll-state(scrollable: top) {
.back-to-top-link {
visibility: visible;
}
}
/* Avec un <container-name> et un <scroll-state> */
@container sticky-heading scroll-state(stuck: top) {
h2 {
background: purple;
color: white;
}
}
/* Multiple requêtes dans une seule condition */
@container (width > 400px) and style(--responsive: true) {
h2 {
font-size: 1.5em;
}
}
/* Liste de conditions */
@container card (width > 400px), style(--responsive: true), scroll-state(stuck: top) {
h2 {
font-size: 1.5em;
}
}
Paramètres
<container-condition>
-
Un
<container-name>
optionnel et un<container-query>
. Les styles définis dans la<stylesheet>
sont appliqués si la condition est vraie.<container-name>
-
Optionnel. Le nom du conteneur auquel les styles seront appliqués lorsque la requête est vraie, spécifié comme un
<ident>
. <container-query>
-
Un ensemble de fonctionnalités évaluées sur le conteneur interrogé lorsque la taille, le
<style-feature>
ou l'état de défilement du conteneur changent.
Mots-clés logiques dans les requêtes de conteneur
Des mots-clés logiques peuvent être utilisés pour définir la condition du conteneur :
and
combine deux conditions ou plus.or
combine deux conditions ou plus.not
nie la condition. Un seul « not » est autorisé par requête de conteneur et il ne peut pas être utilisé avec les mots-clésand
ouor
.
@container (width > 400px) and (height > 400px) {
/* <stylesheet> */
}
@container (width > 400px) or (height > 400px) {
/* <stylesheet> */
}
@container not (width < 400px) {
/* <stylesheet> */
}
Contextes de conteneur nommés
Un contexte de conteneur peut être nommé à l'aide de la propriété container-name
.
.post {
container-name: sidebar;
container-type: inline-size;
}
La syntaxe raccourcie consiste à utiliser container
sous la forme container: <name> / <type>
, par exemple :
.post {
container: sidebar / inline-size;
}
Dans les requêtes de conteneur, la propriété container-name
permet de filtrer l'ensemble des conteneurs pour ne garder que ceux dont le nom correspond à la requête :
@container sidebar (width > 400px) {
/* <stylesheet> */
}
Les détails sur l'utilisation et les restrictions de nommage sont décrits dans la page container-name
.
Descripteurs
Les requêtes <container-condition>
incluent les descripteurs de conteneur size et scroll-state.
Descripteurs de taille de conteneur
Le <container-condition>
peut inclure une ou plusieurs requêtes booléennes de taille, chacune entre parenthèses. Une requête de taille inclut un descripteur de taille, une valeur et — selon le descripteur — un opérateur de comparaison. Les requêtes mesurent toujours la boîte de contenu pour la comparaison. La syntaxe pour inclure plusieurs conditions est la même que pour les requêtes de fonctionnalités de taille @media
.
@container (min-width: 400px) {
/* … */
}
@container (orientation: landscape) and (width > 400px) {
/* … */
}
@container (15em <= block-size <= 30em) {
/* … */
}
aspect-ratio
-
Le
aspect-ratio
du conteneur, calculé comme le rapport largeur/hauteur du conteneur, exprimé en<ratio>
. block-size
-
Le
block-size
du conteneur, exprimé en<length>
. height
-
La hauteur du conteneur, exprimée en
<length>
. inline-size
-
Le
inline-size
du conteneur, exprimé en<length>
. orientation
-
L'orientation du conteneur, soit
landscape
, soitportrait
. width
-
La largeur du conteneur, exprimée en
<length>
.
Descripteurs d'état de défilement du conteneur
Les descripteurs d'état de défilement sont spécifiés dans le <container-condition>
entre parenthèses après le mot-clé scroll-state
, par exemple :
@container scroll-state(scrollable: top) {
/* … */
}
@container scroll-state(stuck: inline-end) {
/* … */
}
@container scroll-state(snapped: both) {
/* … */
}
Les mots-clés pris en charge pour les descripteurs d'état de défilement incluent les valeurs physiques et les valeurs relatives de flux.
scrollable
-
Vérifie si le conteneur peut être défilé dans la direction donnée par une action de l'utilisateur·ice (barre de défilement, geste tactile, etc.). Autrement dit, y a-t-il du contenu débordant dans la direction donnée qui peut être atteint par défilement ? Les valeurs valides pour
scrollable
incluent :none
-
Le conteneur n'est pas un scroll container ou ne peut pas être défilé dans aucune direction.
top
-
Le conteneur peut être défilé vers son bord supérieur.
right
-
Le conteneur peut être défilé vers son bord droit.
bottom
-
Le conteneur peut être défilé vers son bord inférieur.
left
-
Le conteneur peut être défilé vers son bord gauche.
x
-
Le conteneur peut être défilé horizontalement vers la gauche, la droite ou les deux.
y
-
Le conteneur peut être défilé verticalement vers le haut, le bas ou les deux.
block-start
-
Le conteneur peut être défilé vers le début du bloc.
block-end
-
Le conteneur peut être défilé vers la fin du bloc.
inline-start
-
Le conteneur peut être défilé vers le début de la ligne.
inline-end
-
Le conteneur peut être défilé vers la fin de la ligne.
block
-
Le conteneur peut être défilé dans la direction du bloc vers le début, la fin ou les deux.
inline
-
Le conteneur peut être défilé dans la direction de la ligne vers le début, la fin ou les deux.
Si le test est réussi, les règles à l'intérieur du bloc
@container
sont appliquées aux descendants du conteneur défilant.Pour vérifier si un conteneur est défilable, sans se soucier de la direction, utilisez la valeur
none
avec l'opérateurnot
:css@container not scroll-state(scrollable: none) { /* … */ }
snapped
-
Vérifie si le conteneur va être aligné (« snapped ») sur un conteneur parent de type scroll snap selon l'axe donné. Les valeurs valides pour
snapped
incluent :none
-
Le conteneur n'est pas une cible d'accrochage pour son conteneur parent. Si on utilise
snapped: none
, les conteneurs qui sont des cibles d'accrochage n'auront pas les styles@container
, tandis que les non-cibles les auront. x
-
Le conteneur est une cible d'accrochage horizontale pour son conteneur parent.
y
-
Le conteneur est une cible d'accrochage verticale pour son conteneur parent.
block
-
Le conteneur est une cible d'accrochage sur l'axe du bloc pour son conteneur parent.
inline
-
Le conteneur est une cible d'accrochage sur l'axe de la ligne pour son conteneur parent.
both
-
Le conteneur est à la fois une cible d'accrochage horizontale et verticale pour son conteneur parent. Il ne correspondra pas si l'accrochage ne se fait que sur un seul axe.
Pour vérifier un conteneur avec une requête
snapped
différente denone
, il doit avoir un conteneur parent avec une valeurscroll-snap-type
différente denone
. Une requêtesnapped: none
correspondra même s'il n'y a pas de conteneur parent de type scroll snap.L'évaluation a lieu lors des événements
scrollsnapchanging
sur le conteneur scroll snap. Si le test est réussi, les règles à l'intérieur du bloc@container
sont appliquées aux descendants du conteneur.Pour vérifier si un conteneur est une cible d'accrochage, sans se soucier de la direction, utilisez la valeur
none
avec l'opérateurnot
:css@container not scroll-state(snapped: none) { /* … */ }
stuck
-
Vérifie si un conteneur avec la propriété
position
àsticky
est collé à un bord de son conteneur parent défilant. Les valeurs valides pourstuck
incluent :none
-
Le conteneur n'est collé à aucun bord. À noter que les requêtes
none
correspondent même si le conteneur n'a pasposition: sticky
. top
-
Le conteneur est collé au bord supérieur de son conteneur.
right
-
Le conteneur est collé au bord droit de son conteneur.
bottom
-
Le conteneur est collé au bord inférieur de son conteneur.
left
-
Le conteneur est collé au bord gauche de son conteneur.
block-start
-
Le conteneur est collé au début du bloc de son conteneur.
block-end
-
Le conteneur est collé à la fin du bloc de son conteneur.
inline-start
-
Le conteneur est collé au début de la ligne de son conteneur.
inline-end
-
Le conteneur est collé à la fin de la ligne de son conteneur.
Pour vérifier un conteneur avec une requête
stuck
différente denone
, il doit avoirposition: sticky
et être dans un conteneur défilant. Si le test est réussi, les règles à l'intérieur du bloc@container
sont appliquées aux descendants du conteneur sticky.Il est possible que deux valeurs d'axes opposés correspondent en même temps :
css@container scroll-state((stuck: top) and (stuck: left)) { /* … */ }
Cependant, deux valeurs de bords opposés ne correspondront jamais en même temps :
css@container scroll-state((stuck: left) and (stuck: right)) { /* … */ }
Pour vérifier si un conteneur est collé, sans se soucier de la direction, utilisez la valeur
none
avec l'opérateurnot
:css@container not scroll-state(stuck: none) { /* … */ }
Syntaxe formelle
@container =
@container <container-condition># { <block-contents> }
<container-condition> =
[ <container-name>? <container-query>? ]!
<container-name> =
<custom-ident>
<container-query> =
not <query-in-parens> |
<query-in-parens> [ [ and <query-in-parens> ]* | [ or <query-in-parens> ]* ]
<query-in-parens> =
( <container-query> ) |
( <size-feature> ) |
style( <style-query> ) |
scroll-state( <scroll-state-query> ) |
<general-enclosed>
<style-query> =
not <style-in-parens> |
<style-in-parens> [ [ and <style-in-parens> ]* | [ or <style-in-parens> ]* ] |
<style-feature>
<scroll-state-query> =
not <scroll-state-in-parens> |
<scroll-state-in-parens> [ [ and <scroll-state-in-parens> ]* | [ or <scroll-state-in-parens> ]* ] |
<scroll-state-feature>
<general-enclosed> =
[ <function-token> <any-value>? ) ] |
[ ( <any-value>? ) ]
<style-in-parens> =
( <style-query> ) |
( <style-feature> ) |
<general-enclosed>
<style-feature> =
<style-feature-plain> |
<style-feature-boolean> |
<style-range>
<scroll-state-in-parens> =
( <scroll-state-query> ) |
( <scroll-state-feature> ) |
<general-enclosed>
<style-feature-plain> =
<style-feature-name> : <style-feature-value>
<style-feature-boolean> =
<style-feature-name>
<style-range> =
<style-range-value> <mf-comparison> <style-range-value> |
<style-range-value> <mf-lt> <style-range-value> <mf-lt> <style-range-value> |
<style-range-value> <mf-gt> <style-range-value> <mf-gt> <style-range-value>
<style-range-value> =
<custom-property-name> |
<style-feature-value>
<mf-comparison> =
<mf-lt> |
<mf-gt> |
<mf-eq>
<mf-lt> =
'<' '='?
<mf-gt> =
'>' '='?
<mf-eq> =
'='
Exemples
>Appliquer des styles selon la taille d'un conteneur
Considérez l'exemple suivant d'un composant carte avec un titre et du texte :
<div class="post">
<div class="card">
<h2>Titre de la carte</h2>
<p>Contenu de la carte</p>
</div>
</div>
Un contexte de conteneur peut être créé avec la propriété container-type
, ici avec la valeur inline-size
sur la classe .post
.
Vous pouvez ensuite utiliser la règle @container
pour appliquer des styles à l'élément .card
dans un conteneur de moins de 650px
de large.
/* Un contexte de conteneur basé sur la taille en ligne */
.post {
container-type: inline-size;
}
/* Appliquer des styles si le conteneur fait moins de 650px */
@container (width < 650px) {
.card {
width: 50%;
background-color: lightgray;
font-size: 1em;
}
}
Créer des contextes de conteneur nommés
Prenons l'exemple HTML suivant, un composant carte avec un titre et du texte :
<div class="post">
<div class="card">
<h2>Titre de la carte</h2>
<p>Contenu de la carte</p>
</div>
</div>
Commencez par créer un contexte de conteneur avec les propriétés container-type
et container-name
.
La syntaxe raccourcie pour cette déclaration est décrite dans la page container
.
.post {
container-type: inline-size;
container-name: summary;
}
Ciblez ensuite ce conteneur en ajoutant le nom à la requête de conteneur :
@container summary (width >= 400px) {
.card {
font-size: 1.5em;
}
}
Requêtes de conteneur imbriquées
Il n'est pas possible de cibler plusieurs conteneurs dans une seule requête de conteneur. Il est possible d'imbriquer des requêtes de conteneur pour obtenir le même effet.
La requête suivante s'applique si le conteneur nommé summary
fait plus de 400px
de large et possède un conteneur ancêtre de plus de 800px
de large :
@container summary (width > 400px) {
@container (width > 800px) {
/* <stylesheet> */
}
}
Requêtes de style de conteneur
Les requêtes de conteneur peuvent aussi évaluer le style calculé de l'élément conteneur. Une requête de style de conteneur est une requête @container
qui utilise une ou plusieurs notations fonctionnelles style()
. La syntaxe booléenne et la logique de combinaison des fonctionnalités de style dans une requête de style sont les mêmes que pour les requêtes de fonctionnalités CSS.
@container style(<style-feature>),
not style(<style-feature>),
style(<style-feature>) and style(<style-feature>),
style(<style-feature>) or style(<style-feature>) {
/* <stylesheet> */
}
Le paramètre de chaque style()
est un seul <style-feature>
. Un <style-feature>
est une déclaration CSS valide, une propriété CSS ou un <custom-property-name>
.
@container style(--themeBackground),
not style(background-color: red),
style(color: green) and style(background-color: transparent),
style(--themeColor: blue) or style(--themeColor: purple) {
/* <stylesheet> */
}
Une fonctionnalité de style sans valeur est vraie si la valeur calculée est différente de la valeur initiale pour la propriété donnée.
Si le <style-feature>
passé en argument à la fonction style()
est une déclaration, la requête de style est vraie si la valeur de la déclaration est identique à la valeur calculée de cette propriété pour le conteneur interrogé. Sinon, elle est fausse.
La requête suivante vérifie si la valeur calculée de la propriété --accent-color
du conteneur est blue
:
@container style(--accent-color: blue) {
/* <stylesheet> */
}
Note :
Si une propriété personnalisée a pour valeur blue
, le code hexadécimal équivalent #0000ff
ne correspondra pas, sauf si la propriété a été définie comme une couleur avec @property
pour que le navigateur puisse comparer correctement les valeurs calculées.
Les fonctionnalités de style qui interrogent une propriété raccourcie sont vraies si les valeurs calculées correspondent pour chacune de ses propriétés longues, et fausses sinon. Par exemple, @container style(border: 2px solid red)
sera vrai si les 12 propriétés longues qui composent ce raccourci (border-bottom-style
, etc.) sont toutes vraies.
Les valeurs globales revert
et revert-layer
sont invalides dans un <style-feature>
et rendent la requête de style de conteneur fausse.
Requêtes d'état de défilement
Voir Utiliser les requêtes d'état de défilement de conteneur pour des exemples détaillés.
Spécifications
Specification |
---|
CSS Conditional Rules Module Level 5> # container-rule> |
Compatibilité des navigateurs
Loading…