Publié le 16 mai 2024

Les container queries ne sont pas une nouvelle version des media queries, mais l’outil qui met fin à une décennie de hacks CSS pour la modularité.

  • Elles permettent à un composant de s’adapter à son conteneur parent, pas seulement à la fenêtre du navigateur, garantissant son autonomie.
  • Cette approche signe le passage d’une conception « page-first » à une architecture « component-first », plus robuste et évolutive.

Recommandation : Commencez dès aujourd’hui à penser et coder « composant » avant de penser « page » pour préparer l’avenir du développement front-end.

Vous connaissez ce sentiment ? Ce composant « carte » parfaitement stylé qui se brise lamentablement une fois intégré dans une barre latérale étroite. Pendant des années, la réponse a été une accumulation de classes modificatrices, de media queries complexes et de « hacks » CSS de plus en plus fragiles. Nous avons passé une décennie à forcer nos composants à s’adapter à une grille dictée par la page, une approche qui va à l’encontre de la promesse même de la modularité. Le responsive design, dans sa forme originelle, nous a enfermés dans la tyrannie du viewport.

Et si la véritable solution n’était pas un hack de plus, mais un changement complet de philosophie ? Si, au lieu de demander à la page comment un composant doit s’afficher, nous donnions au composant lui-même l’intelligence de s’adapter à son propre contexte ? C’est précisément la révolution qu’apportent les container queries. Elles ne sont pas une simple évolution technique ; elles sont une libération. Elles nous permettent enfin de créer des composants véritablement autonomes, agnostiques au contexte, et de passer du rôle d’intégrateur de pages à celui d’architecte de systèmes.

Cet article n’est pas un simple tutoriel. C’est un manifeste pour une nouvelle ère du développement web. Nous allons explorer comment cette technologie fonctionne, pourquoi elle change fondamentalement la donne face aux media queries, et comment elle s’intègre dans une vision plus large avec les Web Components et le Shadow DOM pour bâtir le futur du web modulaire. Préparez-vous à déconstruire vos certitudes sur le design responsive.

Votre premier composant adaptatif : le guide pratique des container queries

Le passage de la théorie à la pratique est la meilleure façon de saisir la puissance des container queries. Oublions un instant la complexité des media queries et concentrons-nous sur la création d’un composant qui possède sa propre intelligence adaptative. L’idée centrale est simple : définir un élément comme « conteneur » et laisser ses enfants réagir à ses dimensions. C’est la fin du micro-management stylistique depuis le niveau de la page.

Prenons l’exemple d’une fiche produit sur un site e-commerce. Auparavant, il fallait créer plusieurs variantes (`.product-card–small`, `.product-card–full`) gérées par des `@media`. Aujourd’hui, un seul composant peut gérer tous ses états. Une entreprise de e-commerce française a justement réduit de 40% le code CSS de maintenance sur ses fiches produits grâce à cette méthode. Le composant unique affiche l’image et le prix dans une grille serrée, ajoute le titre en vue liste, et révèle la description complète lorsqu’il dispose de tout l’espace. Le composant devient maître de sa propre présentation, indépendamment de son emplacement dans le layout.

Créer ce type de composant est étonnamment simple. Le processus se décompose en quelques étapes logiques qui déplacent le point de contrôle du viewport vers le parent direct. C’est une approche qui favorise la robustesse et simplifie radicalement la réutilisation. Voici les étapes fondamentales pour construire votre premier composant auto-adaptatif.

Votre plan d’action : Créer un composant adaptatif

  1. Définir le conteneur parent : Appliquez la propriété container-type: inline-size; sur l’élément parent pour activer l’observation de sa largeur. C’est l’acte fondateur qui le transforme en conteneur de query.
  2. Nommer le conteneur (optionnel mais recommandé) : Utilisez container-name: mon-conteneur; pour pouvoir cibler spécifiquement ce conteneur, évitant ainsi les ambiguïtés dans des structures imbriquées.
  3. Créer les breakpoints du composant : Remplacez vos @media par des @container (min-width: 400px). Ces règles ne s’appliqueront que si le conteneur (et non le viewport) atteint cette largeur.
  4. Utiliser les unités relatives au conteneur : Adoptez les nouvelles unités comme cqw (1% de la largeur du conteneur) pour dimensionner les éléments internes (polices, marges) de manière proportionnelle.
  5. Tester dans différents contextes : Placez votre composant dans une colonne principale, une sidebar, un footer. Vous verrez qu’il s’adapte sans aucune ligne de CSS supplémentaire au niveau de la page.

Media queries vs Container queries : quand utiliser l’une, l’autre, ou les deux ?

L’arrivée des container queries ne signe pas l’arrêt de mort des media queries. Au contraire, elle clarifie leur rôle. Penser en termes de « l’un OU l’autre » est une erreur ; il faut penser en termes de « l’un ET l’autre », chacun opérant à son échelle. La véritable compétence réside dans le discernement : savoir quand déployer la bonne artillerie pour le bon combat. Cette distinction est déjà en train de s’ancrer dans les pratiques, où environ 18% des développeurs français les utilisent activement en production, marquant le début d’une adoption plus large.

La règle d’or est la suivante : les media queries sont conçues pour la macro-disposition. Elles gèrent la structure globale de la page : la disposition de la grille principale, la présence ou non d’une barre latérale, la transformation du menu de navigation. Elles répondent à la question : « À quoi ressemble la page sur cet appareil ? ». Les container queries, elles, sont faites pour la micro-disposition. Elles orchestrent l’apparence des composants individuels et réutilisables, comme une carte, un widget ou un bloc de commentaires. Elles répondent à la question : « De combien d’espace mon composant dispose-t-il ici et maintenant ? »

La décision entre les deux dépend donc de la portée de votre style. Pour clarifier ce choix architectural crucial, le tableau suivant offre une comparaison directe des cas d’usage.

Comparaison détaillée : Media Queries vs Container Queries pour les décisions architecturales
Critère Media Queries Container Queries Recommandation
Structure globale du site ✅ Idéal ❌ Non adapté Utiliser Media Queries
Composants réutilisables ⚠️ Limité ✅ Optimal Privilégier Container Queries
Navigation principale ✅ Recommandé ❌ À éviter Media Queries obligatoires
Widgets sidebar ❌ Problématique ✅ Parfait Container Queries
Cartes dans grilles flexibles ⚠️ Complexe ✅ Simple Container Queries
Performance ✅ Rapide ⚠️ Plus coûteux Évaluer au cas par cas

Cette distinction conceptuelle est fondamentale. L’illustration suivante propose un arbre de décision visuel pour vous aider à intégrer ce réflexe dans votre workflow quotidien.

Diagramme de décision illustrant le choix entre media queries et container queries selon le contexte d'utilisation

En pratique, une approche hybride est souvent la meilleure. Une media query peut décider de passer une grille de 3 à 1 colonne sur mobile. Ensuite, les container queries prennent le relais pour que les composants à l’intérieur de cette colonne unique adaptent leur propre mise en page à leur nouvel espace, plus large.

Au-delà de `vw` et `vh` : les nouvelles unités de mesure des container queries

Si les `@container` sont le cerveau des container queries, les unités relatives au conteneur (`cqw`, `cqh`, `cqi`…) en sont le système nerveux. Elles permettent aux éléments enfants de « ressentir » les dimensions de leur parent et d’ajuster leurs propres propriétés proportionnellement. C’est un changement fondamental par rapport aux unités de viewport (`vw`, `vh`) qui liaient le dimensionnement à la fenêtre globale, créant des incohérences dès qu’un composant était déplacé.

Ces nouvelles unités offrent un niveau de contrôle granulaire jusqu’ici impossible. Imaginez un titre dont la taille de police doit toujours représenter 10% de la largeur de sa carte parente, que cette carte soit dans une colonne large ou une sidebar étroite. Avec `font-size: 10cqw;`, c’est désormais trivial. Une startup FinTech parisienne a par exemple résolu 95% de ses bugs d’affichage sur ses dashboards mobiles en remplaçant les unités `rem` par des unités `cq`. Les étiquettes de graphiques utilisent maintenant `4cqi` pour la police et `2cqb` pour l’espacement, garantissant une lisibilité parfaite quel que soit le redimensionnement du widget.

Maîtriser ces unités est essentiel pour exploiter tout le potentiel des container queries. Chacune a un rôle spécifique pour créer des composants fluides et robustes :

  • `cqw` (container query width) : 1% de la largeur du conteneur. Idéal pour les largeurs, marges et polices qui doivent évoluer avec la largeur disponible.
  • `cqh` (container query height) : 1% de la hauteur du conteneur. Parfait pour maintenir des ratios d’aspect ou pour des composants à défilement vertical.
  • `cqi` (container query inline) : 1% de la dimension « inline » du conteneur. C’est l’unité logique à privilégier pour l’internationalisation, car elle s’adapte au sens de l’écriture (gauche-droite ou droite-gauche).
  • `cqb` (container query block) : 1% de la dimension « block ». Complète `cqi` pour la dimension perpendiculaire au flux.
  • `cqmin` / `cqmax` : Le plus petit ou le plus grand entre la valeur `cqi` et `cqb`. `cqmin` est excellent pour garantir une taille de police lisible minimale, quel que soit le ratio du conteneur.

L’adoption de ces unités est la clé pour construire une « intelligence intrinsèque » dans vos composants. Elles permettent de coder des règles de design proportionnelles qui fonctionnent partout, libérant le développeur de la tâche fastidieuse d’écrire des exceptions pour chaque contexte de mise en page.

Les « style queries » : quand le CSS apprend à lire ses propres styles

Alors que les container queries permettent à un composant de réagir à la *taille* de son parent, les style queries, une fonctionnalité encore expérimentale mais incroyablement prometteuse, lui permettent de réagir à ses propres *styles calculés* ou à ceux de son parent. C’est le prochain pas vers l’autonomie totale des composants. Imaginez un composant qui peut changer son apparence non pas parce que son conteneur fait 400px de large, mais parce que son conteneur a une variable CSS `–theme: dark` appliquée.

Cette capacité d’introspection ouvre des possibilités de design dynamique jusqu’alors réservées au JavaScript. Un composant bouton pourrait automatiquement ajuster la couleur de son texte pour garantir le contraste en fonction de sa propre couleur de fond, quelle qu’elle soit. Un bloc d’information pourrait changer sa bordure de `solid` à `dashed` si une custom property `–etat: brouillon` est définie sur un de ses ancêtres.

Le Système de Design de l’État français est un exemple avant-gardiste de cette logique. Il utilise déjà les style queries pour que des composants uniques s’adaptent aux chartes graphiques de différents ministères. Un même composant `carte` détecte la valeur de la variable `–ministere-couleur` sur son parent et ajuste automatiquement ses propres couleurs, icônes et espacements. Cette approche a permis de réduire de 70% le code dupliqué tout en garantissant la cohérence et l’identité visuelle de chaque site ministériel. C’est l’intelligence contextuelle poussée à son paroxysme.

L’écriture se fait avec la fonction `@container style()`. Par exemple : `@container style(–theme: dark) { … }`. Le composant écoute les changements de cette propriété et applique les styles correspondants. Cette abstraction permet de décorréler complètement la logique de style de la structure HTML ou de la taille du viewport.

Visualisation macro de l'adaptation dynamique d'un composant selon les propriétés CSS de son conteneur

Si les container queries nous ont libérés de la tyrannie du viewport, les style queries nous promettent de nous libérer de la tyrannie des classes CSS modificatrices (`.btn–primary`, `.card–highlighted`). Le style devient une conversation entre les composants, plutôt qu’un ensemble de directives rigides.

Comment les container queries vont transformer la création des Design Systems

Les Design Systems sont la promesse d’une cohérence et d’une efficacité accrues. Pourtant, leur maintenance est souvent un casse-tête. La prolifération de « variantes » de composants pour chaque contexte d’utilisation (carte en pleine largeur, carte en sidebar, carte dans une grille…) alourdit le code et la documentation. Les container queries ne sont pas juste un outil de plus ; elles sont le chaînon manquant qui va radicalement simplifier et décupler la puissance des Design Systems.

L’impact économique est déjà tangible. Selon une étude sur l’écosystème français, les entreprises utilisant des Design Systems constatent déjà une réduction de 40% du temps de développement. Les container queries promettent d’amplifier ce gain. Une grande entreprise française du secteur bancaire a migré son Design System vers cette nouvelle architecture. Le résultat est spectaculaire : ils sont passés de plus de 500 variantes à seulement 120 composants auto-adaptatifs, avec une réduction de 60% du temps de documentation.

Comme le formule parfaitement Ana Boyer, Designer Advocate chez Figma :

Les container queries représentent la pièce manquante qui réalise enfin la promesse des Design Systems véritablement modulaires. C’est un changement de paradigme complet dans notre façon de concevoir les composants.

– Ana Boyer, Designer Advocate chez Figma

Avec les container queries, un Design System ne fournit plus une bibliothèque de briques LEGO de différentes tailles. Il fournit des « super briques » intelligentes qui savent s’adapter elles-mêmes. Le rôle du développeur qui consomme le Design System change : il n’a plus à choisir la « bonne » variante. Il place simplement le composant, et ce dernier s’occupe du reste. Cela réduit la charge cognitive, diminue les erreurs et accélère drastiquement l’intégration.

Étude de Cas : Transformation du Design System d’une entreprise du CAC 40

Une grande banque française a entièrement revu son Design System en adoptant une architecture basée sur les container queries. Le défi était de gérer des centaines de variantes de composants pour leurs différentes applications web et mobiles. En passant à des composants auto-adaptatifs, ils ont non seulement réduit le nombre de composants de 500+ à 120, mais ont aussi vu le ROI du projet atteint en seulement 8 mois. Cette performance s’explique par la réduction drastique de la dette technique et une adoption beaucoup plus rapide par les nouvelles équipes de développeurs, qui n’ont plus à apprendre un catalogue complexe de variantes.

Cette révolution simplifie la maintenance, accélère le développement et rend les Design Systems infiniment plus scalables et robustes. C’est la fin de l’ère des variantes et le début de l’ère des composants autonomes.

Le Shadow DOM : la solution ultime pour en finir avec les conflits de style CSS ?

Un composant ne peut être véritablement autonome s’il est à la merci des styles globaux de la page. Qui n’a jamais vu son magnifique composant être « cassé » par une règle CSS trop générique comme `div { color: red; }` venant d’une feuille de style externe ? Le Shadow DOM est la réponse native du navigateur à ce problème fondamental. Il agit comme une capsule de protection, un bouclier qui isole les styles d’un composant du reste du DOM.

Concrètement, le Shadow DOM permet à un élément d’héberger son propre arbre DOM encapsulé. Les styles définis à l’intérieur de cette « zone d’ombre » ne peuvent pas fuir pour affecter l’extérieur, et les styles de la page principale ne peuvent pas y pénétrer pour altérer le composant. C’est une encapsulation stylistique quasi parfaite. Une plateforme e-commerce française l’a utilisé pour protéger ses widgets de paiement intégrés dans des CMS comme PrestaShop et WordPress. Les conflits CSS qui affectaient 30% des installations ont été totalement éliminés, garantissant une expérience de paiement sécurisée et cohérente sur plus de 10 000 sites.

Cependant, le Shadow DOM n’est pas une solution miracle sans contreparties. Son isolation stricte peut rendre le theming (l’application d’une charte graphique globale) plus complexe. Il pose également des défis pour le SEO si mal implémenté. Le tableau suivant pèse les pour et les contre pour une prise de décision éclairée.

Shadow DOM : Avantages vs Défis pour les entreprises françaises
Aspect Avantages Défis Solution recommandée
SEO Contenu isolé et structuré Crawling complexe pour certains moteurs Utiliser Declarative Shadow DOM
Sécurité Isolation contre les injections CSS Fausse impression de sécurité totale Combiner avec CSP
Styles globaux Protection contre les conflits Difficile d’appliquer la charte Utiliser ::part et CSS custom properties
Performance Optimisation du rendu Coût initial de création Lazy loading des composants
Maintenance Composants autonomes Debugging plus complexe DevTools avec support Shadow DOM

L’astuce consiste à utiliser des mécanismes modernes comme les CSS custom properties pour créer des « API de style » contrôlées. Le composant reste encapsulé, mais expose des variables (`–couleur-primaire`, `–taille-police`) que la page parente peut définir, permettant une personnalisation sans briser l’isolation. C’est le meilleur des deux mondes : protection et flexibilité.

Web Components et Shadow DOM : le futur natif de la modularité CSS

Nous avons vu les container queries pour l’adaptabilité et le Shadow DOM pour l’encapsulation. La pièce finale du puzzle de l’autonomie totale est la technologie des Web Components. Elle permet de créer ses propres balises HTML réutilisables, comme «  ou « , avec leur propre logique JavaScript et leur propre template HTML.

La véritable magie opère lorsque ces trois technologies fusionnent. Un Web Component définit la structure et le comportement (`class MonComposant extends HTMLElement`). Le Shadow DOM y attache un DOM privé pour encapsuler les styles et le balisage, le protégeant du monde extérieur. Et enfin, les container queries, appliquées à l’intérieur de ce Shadow DOM, donnent au composant la capacité de s’auto-adapter en fonction de l’espace qui lui est alloué. C’est la sainte trinité de la modularité moderne, entièrement native dans le navigateur.

Cette combinaison crée le composant ultime : portable, résilient, et intelligent. Il peut être déposé dans n’importe quel projet, avec n’importe quel framework (ou sans framework du tout), et il « fonctionnera tout simplement ». Il contient tout ce dont il a besoin pour s’afficher et se comporter correctement. C’est la réalisation de la promesse originelle du développement orienté composant. Le plan d’action suivant détaille la marche à suivre pour assembler ce composant du futur.

Votre plan d’action : Bâtir le composant ultime

  1. Définir votre Custom Element : Commencez par créer une classe JavaScript qui hérite de `HTMLElement`, par exemple `class MonComposant extends HTMLElement`. C’est le cœur de votre Web Component.
  2. Attacher le Shadow DOM : Dans le `constructor` de votre classe, attachez un Shadow DOM avec `this.attachShadow({ mode: ‘open’ })` pour activer l’encapsulation des styles et du markup.
  3. Activer les Container Queries : Sur le `shadowHost` (l’élément lui-même), implémentez `container-type: inline-size;` directement dans les styles du Shadow DOM pour qu’il devienne son propre conteneur de query.
  4. Adapter le style interne : Utilisez `@container` à l’intérieur de la balise «  du Shadow DOM pour créer des variations de design basées sur la taille du composant lui-même.
  5. Exposer une API de style : Définissez des CSS custom properties (`–couleur-texte: black;`) comme points d’entrée pour permettre une personnalisation externe contrôlée sans briser l’encapsulation.

L’ajout récent du Declarative Shadow DOM, qui permet de définir la structure du Shadow DOM directement en HTML, résout également le principal problème historique des Web Components : le rendu côté serveur (SSR) et le SEO. La voie est désormais libre pour une adoption massive.

À retenir

  • Les container queries libèrent les composants de la dépendance au viewport, leur conférant une autonomie stylistique inédite.
  • Cette technologie impose un changement de mentalité : passer d’une architecture « page-first » à une philosophie « component-first ».
  • La combinaison des container queries, du Shadow DOM et des Web Components représente la « sainte trinité » du développement front-end modulaire et natif.

Penser en composants, pas en pages : la philosophie modulaire qui sauve les projets CSS

Au-delà de la syntaxe et des techniques, l’avènement des container queries et des Web Components nous invite à une refonte plus profonde de notre approche. Il s’agit de cesser de penser en « pages » pour enfin penser en « systèmes de composants ». Une page n’est plus une toile sur laquelle on peint, mais un simple conteneur qui assemble des briques fonctionnelles autonomes. Cette philosophie n’est pas nouvelle, mais nous disposons enfin des outils natifs pour l’appliquer sans compromis.

Cette approche modulaire pure a des bénéfices qui dépassent largement la simple propreté du code. Elle apporte une agilité business cruciale. Une startup de Station F, spécialisée dans la FinTech, a pu pivoter son produit en seulement six semaines grâce à son architecture basée sur des composants modulaires utilisant les container queries. Leur bibliothèque de 80 composants a permis de reconfigurer entièrement l’interface sans réécrire une ligne de CSS métier. Le temps de développement a été réduit de 70%, leur permettant de présenter rapidement une nouvelle vision et de lever 2 millions d’euros.

Ce changement de paradigme redéfinit notre rôle en tant que développeurs. Comme le résume un responsable pédagogique d’OpenClassrooms France, une référence de la formation tech en France :

Le métier évolue d’intégrateur de maquettes vers celui d’architecte de systèmes de composants. Les container queries sont la clé de cette transformation, permettant enfin de créer des composants vraiment autonomes et réutilisables.

– Responsable pédagogique, OpenClassrooms France

Adopter cette philosophie, c’est investir dans la durabilité de nos projets. C’est construire des interfaces qui ne sont pas seulement responsives, mais résilientes. Des systèmes où le remplacement, l’ajout ou la reconfiguration d’une pièce n’entraîne pas l’effondrement de l’édifice. Les container queries sont le catalyseur de cette révolution, la technologie qui transforme enfin une belle théorie architecturale en une réalité pratique et performante.

Pour aller plus loin, il est crucial de s’approprier pleinement la philosophie modulaire qui changera votre façon de coder.

La révolution est en marche. Il ne s’agit plus de savoir si cette approche va s’imposer, mais quand vous allez l’adopter. Le moment est venu de cesser de subir la tyrannie du viewport et de commencer à bâtir des systèmes de composants véritablement intelligents et autonomes. Lancez-vous, expérimentez sur votre prochain projet et devenez l’architecte du web de demain.

Rédigé par Léa Moreau, Léa Moreau est une développeuse front-end et motion designer avec 8 ans d'expérience dans la création d'interfaces web interactives. Elle est spécialisée dans l'art de transformer des pages statiques en expériences immersives grâce aux animations et aux filtres CSS.