Le WordPress d'aujourd'hui, décodé pour les développeurs

E-commerce

Adapter la taille d’un badge de promotion produit à son emplacement avec les container queries

Le même badge de promotion s'affiche sur une fiche produit, dans une grille et dans le mini-panier. Les container queries évitent de multiplier les media queries fragiles.

Par WordPress Développement • 25 avril 2023 • 4 min de lecture • Aucun commentaire
Adapter la taille d'un badge de promotion produit à son emplacement avec les container queries

Un badge de promotion produit affiché en pleine largeur sur une fiche produit devient illisible une fois recopié tel quel dans une grille catalogue à quatre colonnes, ou pire, dans le mini-panier réduit à moins de deux cents pixels. La solution la plus courante, empiler des media queries ciblant chaque emplacement, tient rarement plus de quelques mois avant qu’un nouveau gabarit ne vienne tout casser.

La raison est simple à énoncer une fois qu’on l’a identifiée : une media query réagit à la largeur de la fenêtre du navigateur, pas à celle du conteneur réel dans lequel le badge est affiché. Un badge peut donc se trouver dans un conteneur étroit sur un grand écran, par exemple dans une colonne latérale, sans qu’aucune media query classique ne le sache.

Ce que changent réellement les container queries

Les container queries CSS, via la règle @container, réagissent à la largeur (ou à la hauteur) du conteneur parent défini explicitement, indépendamment de la taille de la fenêtre. Il suffit de déclarer ce conteneur avec la propriété container-type, puis d’écrire des règles conditionnelles qui s’appliquent uniquement à l’intérieur de ce contexte.

.badge-promo-conteneur {
    container-type: inline-size;
    container-name: badge-promo;
}

.badge-promo {
    font-size: 0.9rem;
    padding: 0.4rem 0.6rem;
}

@container badge-promo (max-width: 200px) {
    .badge-promo {
        font-size: 0.7rem;
        padding: 0.2rem 0.4rem;
    }
}

@container badge-promo (min-width: 400px) {
    .badge-promo {
        font-size: 1.1rem;
        padding: 0.6rem 1rem;
    }
}

Un seul composant, trois emplacements

L'essentiel à retenir : @container réagit à la largeur du parent, pas de la fenêtre ; Un seul jeu de règles couvre fiche produit, grille et mini-panier ; container-type: inline-size suffit pour la majorité des besoins de largeur

Le badge de promotion, dans ce projet, s’affiche à trois endroits distincts d’une même boutique WooCommerce : sur la fiche produit en pleine largeur, dans chaque carte de la grille catalogue, et dans le mini-panier ouvert en superposition. Avant le passage aux container queries, trois classes CSS distinctes existaient pour ce même composant, une par emplacement, avec des valeurs dupliquées et déjà légèrement désynchronisées entre elles.

Avec container-type: inline-size posé sur le conteneur direct de chaque emplacement, le badge lui-même n’a plus qu’un seul jeu de règles à maintenir :

  • Dans la grille catalogue, chaque carte produit devient elle-même le conteneur nommé, ce qui adapte le badge à la largeur réelle de la colonne, variable selon le nombre de colonnes affichées.
  • Dans le mini-panier, le conteneur correspond à la largeur du panneau glissant, généralement plus étroit qu’une carte de grille.
  • Sur la fiche produit, le conteneur correspond à la zone d’affichage du prix, plus large que les deux autres cas.

Le piège de container-type sur le mauvais élément

Une erreur fréquente consiste à poser container-type directement sur l’élément du badge plutôt que sur son parent : un élément déclaré comme conteneur ne peut pas, par construction, interroger sa propre taille dans une @container qui le cible lui-même. Le conteneur doit toujours être un ancêtre de l’élément stylé par la règle conditionnelle.

Nommer ses conteneurs plutôt que les laisser anonymes

Sur un thème qui empile plusieurs niveaux de conteneurs imbriqués, une règle @container sans nom cible le conteneur le plus proche, ce qui devient vite ambigu. Nommer explicitement chaque conteneur avec container-name, comme dans l’exemple ci-dessus, évite qu’une règle destinée au badge n’interfère accidentellement avec un autre composant partageant la même hiérarchie de conteneurs.

Je recommande de nommer systématiquement les conteneurs dès qu’un composant est réutilisé à plus de deux emplacements différents : le gain de lisibilité, au moment de reprendre le code six mois plus tard, dépasse largement l’effort de nommage initial.

Ce que les container queries ne remplacent pas

La mise en page générale de la grille produit, avec son nombre de colonnes selon la largeur de l’écran, continue de relever des media queries classiques ou d’une grille CSS fondée sur auto-fit et minmax(). Les container queries interviennent à un niveau plus local : l’adaptation d’un composant à l’espace réellement disponible autour de lui, une fois la mise en page générale déjà déterminée.

Notre verdict

Pour un composant réutilisé dans des contextes de largeur variable comme un badge promotionnel, les container queries suppriment la duplication de règles et la désynchronisation qui l’accompagne presque toujours à terme. La contrainte principale reste de bien identifier, pour chaque emplacement, quel élément doit porter container-type, sous peine de règles conditionnelles qui ne se déclenchent jamais.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi