CSSContainer QueriesResponsive DesignFrontendPerformance WebComposants

CSS Container Queries : ne les utilisez plus comme des media queries

94% de support navigateur, mais seulement 41% des devs les utilisent. Les container queries ne sont pas des media queries améliorées — elles répondent à un problème différent : le composant, pas le viewport.

21 septembre 2026
CSS Container Queries : ne les utilisez plus comme des media queries

En bref

  • 1Les CSS Container Queries ont 94% de support navigateur (Chrome, Firefox, Safari, Edge) mais State of CSS 2025 révèle que seulement 41,4% des développeurs les utilisent. Le problème n'est pas la connaissance — c'est la compréhension : beaucoup les traitent comme des media queries alors qu'elles répondent à un paradigme différent.
  • 2Media queries regardent le viewport (macro-layout : structure de page, header, footer). Container queries regardent le parent direct (micro-layout : cartes, formulaires, widgets). La différence ? Une carte dans une sidebar n'a pas les mêmes contraintes qu'une carte en plein écran — les media queries ne peuvent pas le savoir.
  • 3Pour adopter les container queries dès aujourd'hui : déclarez container-type: inline-size sur le parent, remplacez @media par @container sur les composants réutilisables, et utilisez les unités cqi/cqw pour le typo fluide. Gardez les media queries pour la structure de page.

Close-up of HTML and CSS code on a dark screen — CSS Container Queries en pratique

CSS Container Queries : ne les utilisez plus comme des media queries

Le plus gros malentendu CSS de 2026

En février 2023, les CSS Container Queries arrivaient enfin dans tous les navigateurs majeurs : Chrome 105, Edge 105 et Safari 16 les avaient livrées dès l'automne 2022, Firefox 110 a fermé la marche. En 2026, elles affichent 94% de support et sont passées Baseline « Widely available » en août 2025 — le palier à partir duquel on peut les poser sans filet.

Pourtant, le State of CSS 2025 raconte une histoire gênante : 86% des développeurs connaissent la fonctionnalité, mais seulement 41,4% l'utilisent.

Kevin Powell le résumait parfaitement à SmashingConf Amsterdam 2026 : "Container Queries adoption has been terrible."

Le problème ? Pas la connaissance. La compréhension. Parce que @container ressemble furieusement à @media, on les utilise pareil. C'est une erreur.

Le constat de départ et plusieurs des exemples qui suivent viennent de « Stop Treating CSS Container Queries Like Traditional Media Queries », publié par Victor Ayomipo sur Smashing Magazine le 16 septembre 2026.

Media queries regardent dehors, container queries regardent dedans

Quand vous écrivez @media (min-width: 1024px), vous demandez au navigateur : "Combien mesure l'écran ?"

C'est utile pour la structure de page. Mais qu'arrive-t-il à votre carte .card quand elle est placée dans une grille de 300px de large sur un écran 1920px ?

La media query s'en fiche. Pour elle, l'écran fait toujours 1920px. Les styles "desktop" s'appliquent, et votre carte déborde ou s'écrase.

/* Media query : regarde le viewport */
@media (min-width: 1024px) {
  .card {
    display: flex;
  }
}

La container query, elle, demande : "Combien d'espace mon parent me donne-t-il, là, maintenant ?"

/* Déclarer le conteneur */
.card-wrapper {
  container-type: inline-size;
}

/* Container query : regarde le parent */
@container (min-width: 450px) {
  .card {
    display: flex;
    flex-direction: row;
  }
}

La carte passe en horizontal quand son conteneur atteint 450px — pas quand l'écran dépasse 1024px. C'est plus précis, plus résilient, et ça marche dans une sidebar comme en plein écran.

Macro-layout vs micro-layout

La distinction est simple :

TypeOutilScopeExemples
Macro-layout@mediaStructure de pageHeader, footer, grille principale, prefers-color-scheme
Micro-layout@containerComposants réutilisablesCartes, formulaires, widgets, navigation, listes

Règle : Un composant utilisé dans plus d'un contexte → container query. Un élément qui existe uniquement au niveau page → media query.

Le saviez-vous ? Il y a plus de 2 300 tailles de viewport uniques sur le web moderne. Essayer de toutes les couvrir avec des media queries est une illusion. Les container queries rendent vos composants intrinsèquement adaptatifs — ils s'ajustent à la taille réelle qu'on leur donne.

Exemple concret : typo fluide dans un composant

Avec les media queries, on utilise vw pour le typo responsive :

.card-title {
  font-size: clamp(100%, 1rem + 2vw, 24px);
}

Ça marche... jusqu'à ce que la carte soit dans un sidebar. Là, 2vw sur un écran large donne un texte trop grand pour l'espace disponible.

Avec les container queries et leurs unités dédiées (cqi, cqw) :

.card-title {
  font-size: clamp(1rem, 0.5rem + 3cqi, 2rem);
}

3cqi = 3% de la taille du conteneur, pas du viewport. Le texte s'adapte à l'espace réellement disponible. C'est la différence entre un design qui "marche en desktop" et un design qui marche partout.

Détection de wrap Flexbox sans JavaScript

Un cas où les container queries brillent : détecter quand des éléments flex wrap sur une nouvelle ligne.

/* Parent flex */
.flex-layout {
  display: flex;
  flex-wrap: wrap;
}

/* Chaque item est aussi un conteneur */
.flex-item {
  container-type: inline-size;
  flex: 1 1 390px;
}

/* État "wrap" : l'item a soudain plus de largeur */
@container (min-width: 600px) {
  .card {
    display: flex;
    flex-direction: row;
  }
}

Quand l'item est seul sur sa ligne (wrap), son conteneur s'élargit — la container query détecte ce changement et réorganise le layout. Impossible à faire avec une media query, qui ne "voit" que l'écran.

Les pièges à éviter

1. Déclarer le conteneur trop haut dans l'arbre DOM

Plus le conteneur est haut, plus il englobe d'enfants. Déclarez container-type sur le wrapper direct du composant que vous voulez adapter.

2. Utiliser size au lieu de inline-size

container-type: size applique la contrainte sur les deux axes (inline + block). Dans 90% des cas, inline-size suffit et évite des comportements de hauteur inattendus.

3. Noms de conteneur en conflit

Si vous utilisez container-name, assurez-vous que les noms sont uniques dans le scope. Sans nom, @container cible le conteneur ancêtre le plus proche — ce qui est souvent ce que vous voulez.

4. Variables CSS dans les container queries

Les @container ne peuvent pas utiliser de variables CSS personnalisées dans la condition de taille :

/* NE MARCHE PAS */
@container (min-width: var(--breakpoint)) {
  .card { ... }
}

Utilisez des valeurs littérales dans les conditions de container query.

Quand les garder en production aujourd'hui

La checklist pour adopter les container queries dans votre prochain projet :

  • Déclarez container-type: inline-size sur les wrappers de composants réutilisables
  • Remplacez les media queries des composants par des @container
  • Utilisez cqi/cqw pour le typo fluide dans les composants
  • Gardez @media pour la macro-structure (header, footer, grilles)
  • Ajoutez des styles fallback hors des blocs @container pour les vieux navigateurs
  • Testez avec le même composant dans deux contextes de largeur différente

Les container queries ne remplacent pas les media queries — elles les complètent. Mais les traiter comme des media queries revient à utiliser un scalpel comme un marteau. L'outil est différent, le problème est différent, et le résultat est bien meilleur quand on les utilise correctement.

Questions fréquentes

Une media query (@media) interroge la taille du viewport (la fenêtre du navigateur). Une container query (@container) interroge la taille d'un parent spécifique que vous avez déclaré comme conteneur. Concrètement : avec @media, un composant change de layout quand l'écran rétrécit, même s'il est dans un espace déjà étroit. Avec @container, il change quand SON espace disponible rétrécit — indépendamment du viewport.

Utilisez @container quand un composant est réutilisable dans plusieurs contextes de layout : une carte qui peut apparaître en grille pleine largeur ou en sidebar, un formulaire qui s'adapte à son conteneur, des widgets de dashboard. Gardez @media pour la macro-structure : header, footer, grille de page principale, préférences système (prefers-color-scheme). La règle simple : page layout = @media, component layout = @container.

Oui. Les container size queries sont supportées à 94% par tous les navigateurs modernes (Chrome 105+, Firefox 110+, Safari 16+, Edge 105+). Utilisez container-type: inline-size pour la largeur, les unités cqi/cqw pour le typo fluide, et la fonction clamp() pour des tailles responsive sans media queries. Pour la compatibilité ascendante, prévoyez des styles de fallback hors du bloc @container — les navigateurs qui ne supportent pas la feature ignorent simplement le bloc.

Articles connexes

Vous avez aimé cet article ?