Que fait Système de Grille Masonry ?
Objectif
Le système de grille Masonry fournit un framework de conception standardisé et réactif pour afficher des cartes de contenu non uniformes de hauteurs variables (comme les portfolios de photographie, les flux de contenu généré par l'utilisateur, les cartes médias mixtes ou les tableaux d'inspiration éditoriaux). Les grilles CSS standard imposent un alignement vertical des lignes, créant des espaces blancs verticaux gênants lorsque les éléments ont des ratios d'aspect ou des longueurs de texte variables.
Concevoir une grille masonry efficace nécessite de résoudre le défi spatial du remplissage dynamique des éléments dans des colonnes verticales parallèles, d'empêcher le décalage de mise en page cumulatif (Cumulative Layout Shift - CLS) lors du chargement des médias, d'assurer une dégradation gracieuse des colonnes sur mobile et, surtout, d'empêcher la disposition visuelle de casser l'ordre de lecture logique du DOM et la séquence de navigation au clavier (WCAG 2.1 SC 1.3.2 et SC 2.1.1).
Cas d'Utilisation
- Portfolios de Photographie et Médias Visuels : Afficher des galeries d'images avec des ratios d'aspect natifs variés (portrait, paysage, carré, panorama) dans une grille serrée et sans trous.
- Flux d'Activité Sociaux et UGC : Organiser des cartes sociales mixtes contenant de courtes mises à jour textuelles, des articles complets, des images intégrées et des bandes-annonces vidéo.
- Murs d'Avis et UGC E-Commerce : Présenter des photos d'avis clients, des publications Instagram taguées et des extraits de produits phares dans une vitrine de découverte dynamique.
- Tableaux d'Inspiration Éditoriale et Pinboards : Construire des moodboards, des gestionnaires de favoris et des flux d'inspiration où les cartes contiennent divers éléments de contenu avec des empreintes verticales variables.
Quand NE PAS Utiliser
- Grilles à Ratio d'Aspect Uniforme : Si tous les éléments partagent des ratios d'aspect identiques (par exemple, cartes vidéo standard 16:9 ou catalogues de produits 1:1), utilisez
responsive-grid-systemoucard-ui-system. - Mises en Avant Asymétriques 2D Structurées : Pour les sections héros organisées avec des règles explicites de chevauchement rectangulaire 2D (par exemple, une fonctionnalité principale 2x2 accompagnée de blocs de statistiques 1x1), utilisez
bento-grid-layout-system. - Données Tabulaires ou Alignées Strictes : Lorsque les utilisateurs doivent comparer des valeurs sur des lignes horizontales (par exemple, tableaux de prix ou métriques financières), utilisez
data-table-ui-systemoucomparison-matrix-system. - Narration Séquentielle et Articles : Pour les récits linéaires où l'ordre de lecture doit suivre strictement un seul flux vertical, utilisez
article-layout-systemousection-composition-system.
Entrées
- Inventaire du Contenu et Ratios d'Aspect : Types de contenu média et texte (images, vidéos, extraits de texte, cartes d'action) et leur spectre de ratios d'aspect (du portrait 3:4 au paysage 16:9).
- Exigences d'Architecture des Colonnes : Nombres de colonnes cibles selon la taille d'écran (par exemple, 4 colonnes sur grand écran, 3 sur écran de bureau, 2 sur tablette, 1 sur mobile).
- Exigences d'Interactivité et de Focus : Éléments interactifs à l'intérieur des cartes (boutons, lightboxes, toggles en ligne, liens) nécessitant une accessibilité au clavier.
- Jetons d'Espacement et de Thème : Gouttières de colonnes fluides et espaces entre les lignes (
gap: clamp(12px, 2vw, 24px)), remplissages de fond de carte, rayons de bordure et jetons d'anneau de focus (provenant defluid-spacing-systemetfocus-indicator-design-system).
Sorties
- Spécification de l'Architecture de Disposition Masonry : Choix stratégique et plan technique entre le flux multi-colonnes CSS pur, le chevauchement de lignes de grille CSS (
grid-auto-rows) et le remplissage par colonne la plus courte en JavaScript. - Matrice de Mise à l'Échelle Réactive des Colonnes : Définition des points de rupture pour des transitions fluides du nombre de colonnes et la mise à l'échelle des espaces.
- Carte de l'Ordre de Lecture du DOM et du Focus Clavier : Architecture garantissant que la navigation clavier (
Tab/Shift+Tab) suit l'ordre de lecture visuel naturel sans sauts de colonne chaotiques. - Règles de Stabilité de la Disposition et de Préservation du Ratio d'Aspect : Architecture CSS empêchant le décalage de mise en page cumulatif (CLS) lors du chargement des images et des médias.
Flux de Travail
1. Sélectionner la Stratégie Architecturale
Choisir la technique de disposition appropriée en fonction de l'interactivité et des exigences d'ordre de lecture :
- Option A : Disposition Multi-Colonnes CSS Pure (
column-count)- Idéal pour : Galeries statiques, flux d'images lourds ou cartes non interactives où l'ordre du flux peut être vertical dans la colonne 1, puis la colonne 2, etc.
- Implémentation :
column-count: 4; column-gap: var(--space-m);. Définirbreak-inside: avoid; margin-bottom: var(--space-m);sur les cartes enfants. - Compromis : L'ordre vertical de la source (de haut en bas dans les colonnes) peut dérouter les utilisateurs du clavier si les cartes contiennent des contrôles interactifs.
- Option B : Grille CSS avec Chevauchement de Lignes (
grid-auto-rows&grid-row: span X)- Idéal pour : Grilles semi-statiques où les hauteurs de carte peuvent être quantifiées en unités de piste de ligne fixes (par exemple, pistes de base de
10px). - Implémentation :
display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); grid-auto-rows: 10px; gap: 16px;. JavaScript calcule la hauteur du contenu et appliquegrid-row: span Math.ceil(height / trackHeight). - Compromis : L'ordre DOM horizontal natif est préservé, mais nécessite des calculs de hauteur JavaScript mineurs ou des requêtes de conteneur.
- Idéal pour : Grilles semi-statiques où les hauteurs de carte peuvent être quantifiées en unités de piste de ligne fixes (par exemple, pistes de base de
- Option C : Distribution par Conteneur de Colonne la Plus Courte en JavaScript
- Idéal pour : Flux de médias mixtes hautement interactifs où l'ordre de lecture de gauche à droite est primordial et où les cartes contiennent des liens, des boutons et des contrôles de formulaire.
- Implémentation : Créer $N$ conteneurs de colonnes flex (
display: flex; flex-direction: column; gap: var(--space-m);). Ajouter les nouvelles cartes à la colonne dont la hauteur totale rendue est actuellement la plus courte. - Compromis : Nécessite une gestion côté client des conteneurs DOM, mais garantit un flux de focus DOM parfait de gauche à droite et zéro espace vertical visuel.
2. Définir le Rythme Spatial et les Gouttières de Colonnes
Établir des jetons d'espacement cohérents sur toutes les colonnes et le remplissage intérieur des cartes :
- Gouttières de Colonnes : Utiliser un espacement fluide des espaces (par exemple,
gap: clamp(16px, 2.5vw, 28px)). S'assurer que les espaces verticaux entre les cartes empilées sont égaux aux espaces horizontaux des colonnes pour maintenir une densité spatiale uniforme. - Remplissage des Cartes et Alignement Intérieur : Standardiser le remplissage interne des cartes à l'aide de jetons fluides (
padding: var(--space-m)). Pour les cartes uniquement média (par exemple, déclencheurs de lightbox), permettre aux images de déborder bord à bord (padding: 0; overflow: hidden;). - Synchronisation du Rayon de Coin : Appliquer un rayon de bordure cohérent aux conteneurs de carte externes (par exemple,
12pxà16px). S'assurer que les éléments internes (par exemple, les images du haut) héritent de rayons de coin concentriques (border-top-left-radius: calc(var(--card-radius) - 1px)).
3. Empêcher le Décalage de Mise en Page (CLS) et les Distorsions d'Image
Les grilles masonry sont très sensibles au décalage de mise en page cumulatif lors du chargement des images :
- Boîtes de Ratio d'Aspect : Déclarer explicitement
aspect-ratiosur les conteneurs d'images (aspect-ratio: 4 / 5; object-fit: cover; width: 100%; display: block;) ou calculer les ratios de remplissage en ligne avant la résolution des médias. - Placeholders Squelette : Rendre des impulsions de fond squelette stylisées (
background: var(--surface-subtle); animation: pulse 1.5s infinite;) correspondant au ratio d'aspect attendu de la carte pendant le chargement des ressources distantes. - Écouteurs de Chargement d'Image : Si vous utilisez des calculs de hauteur JS, lier
ResizeObserverou des écouteurs d'événementloadd'image pour recalculer les allocations de hauteur de colonne une fois que les images ont fini de s'afficher.
4. Concilier l'Ordre de Lecture du DOM et la Gestion du Focus
Assurer la conformité avec WCAG 1.3.2 (Séquence Significative) et 2.1.1 (Clavier) :
- Éviter les Déconnexions Visuelles-DOM : Si vous utilisez des colonnes CSS où la disposition visuelle s'écoule verticalement dans les colonnes, assurez-vous que les indicateurs de focus clavier restent distincts et logiques. Si les cartes contiennent des contrôles interactifs, préférez la distribution par colonne la plus courte en JavaScript ou le chevauchement de lignes de grille CSS pour maintenir une séquence de tabulation naturelle de gauche à droite et de haut en bas (ordre de la touche
Tab). - Visibilité de l'Indicateur de Focus : Standardiser des indicateurs de focus à contraste élevé et non coupés (
outline: 3px solid var(--focus-ring-color); outline-offset: 3px;). Éviteroverflow: hiddensur les cartes sans ajouter un espacement suffisant pour l'indicateur de focus à l'intérieur des limites de coupe. - Raccourcis Clavier pour Lightboxes / Modales : Si cliquer sur une carte masonry ouvre une superposition modale ou une lightbox, piéger le focus clavier dans la superposition (
focus-trap) et ramener le focus sur le déclencheur de la carte d'origine lors de la fermeture (toucheEscape).
5. Implémenter la Mise à l'Échelle Réactive des Colonnes
Concevoir des points de rupture pour faire évoluer gracieusement le nombre de colonnes sans casser l'équilibre du contenu :
- Grand Écran (≥ 1440px) : 4 Colonnes (
column-count: 4ou 4 pistes de colonnes flex). - Bureau Standard (1024px – 1439px) : 3 Colonnes (
column-count: 3ou 3 pistes de colonnes flex). - Tablette / Petit Écran (640px – 1023px) : 2 Colonnes (
column-count: 2ou 2 pistes de colonnes flex). - Mobile (< 640px) : 1 Colonne (
column-count: 1ou pile verticale unique). Tous les éléments s'empilent naturellement avec un espacement vertical standard.
Règles de Décision
Matrice de Sélection Architecturale
| Type de Contenu et d'Interaction | Stratégie Architecturale Recommandée | Justification |
|---|---|---|
| Galerie d'Images Pure (Déclencheurs Lightbox) | Multi-Colonnes CSS (column-count) | Zéro empreinte JS, performances natives multi-colonnes du navigateur, masonry d'images vertical propre. |
| Cartes Interactives (Boutons, Champs, Liens) | Distribution Flex par Colonne la Plus Courte en JS | Préserve strictement l'ordre de tabulation DOM de gauche à droite, empêchant les sauts de focus du lecteur d'écran et du clavier. |
| Flux de Chargement Dynamique (Défilement Infini) | Grille CSS avec Chevauchement de Lignes ou Distribution par Colonne JS | Permet d'ajouter de nouvelles cartes en douceur à la colonne la plus courte sans refluer toute la mise en page. |
| Tableau d'Inspiration Éditorial à Contenu Textuel Lourd | Grille CSS avec Chevauchement de Lignes (grid-auto-rows: 10px) | Maintient l'ordre de lecture horizontal tout en s'adaptant avec précision aux longueurs de texte variables. |
Contraintes
- Accessibilité (Conformité WCAG 2.1 AA) :
- SC 1.3.2 Séquence Significative : La disposition visuelle des cartes interactives doit s'aligner logiquement avec l'ordre de navigation par tabulation du clavier (flux de focus
tabindex="0"). - SC 1.4.3 Contraste (Minimum) : Le texte rendu sur les surfaces des cartes ou les superpositions d'images doit satisfaire un rapport de contraste minimum de 4,5:1. Des superpositions de fond sombre (
background: linear-gradient(to top, rgba(0,0,0,0.8), transparent)) doivent être utilisées pour le texte placé directement sur les images. - SC 2.1.1 Clavier : Tous les éléments interactifs des cartes (comme les boutons, les déclencheurs de favoris, les liens externes) doivent être entièrement actionnables via les touches
EspaceetEntrée. - SC 2.4.7 Focus Visible : Les cartes et déclencheurs interactifs doivent afficher un anneau de focus distinct qui n'est pas coupé par les propriétés
overflow: hiddende la carte parente. - SC 2.5.8 Taille de Cible : Toutes les cibles tactiles à l'intérieur des cartes masonry doivent maintenir une zone interactive minimale de 24x24px (minimum 44x44px sur les fenêtres tactiles/mobiles).
- SC 1.3.2 Séquence Significative : La disposition visuelle des cartes interactives doit s'aligner logiquement avec l'ordre de navigation par tabulation du clavier (flux de focus
- Performance de Décalage de Mise en Page : Les images à l'intérieur des cartes masonry doivent avoir des ratios d'aspect intrinsèques ou des réservations de dimensions explicitement définis pour garantir que le CLS reste inférieur à 0,1.
Schémas d'Échec Courants
- Le Brouhaha de la Tabulation Clavier : Utiliser
column-countCSS pour des cartes interactives, ce qui fait que la toucheTabdu clavier se déplace verticalement dans toute la première colonne (de l'élément 1 à l'élément 10) avant de revenir en haut de la colonne 2. - Le Chaos du Décalage de Mise en Page Cumulatif (CLS) : Insérer des images sans style de ratio d'aspect ni squelettes de chargement, ce qui provoque le reflussage et les sauts répétés des colonnes masonry à mesure que chaque image se charge.
- Les Anneaux de Focus Coupés : Définir
overflow: hiddensur les cartes masonry pour imposer des coins d'image arrondis, ce qui coupe l'anneau de focus de contour standard des éléments interactifs internes. - Hauteurs de Colonnes Non Contraintes sur Mobile : Ne pas réduire les grilles masonry à une seule colonne sur les appareils mobiles, ce qui donne des cartes multi-colonnes ultra-étroites et écrasées avec un habillage de texte illisible.
- Totaux de Colonnes Inégaux : Ajouter de nouveaux éléments dans des flux dynamiques de manière séquentielle dans les colonnes (1, 2, 3, 1, 2, 3) plutôt que de vérifier les hauteurs des colonnes, créant ainsi de grands espaces blancs verticaux en bas des colonnes les plus courtes.
Critères de Validation
- Alignement Architectural : La stratégie sélectionnée (Colonnes CSS vs. Chevauchement de Lignes de Grille CSS vs. Colonne la Plus Courte JS) correspond aux exigences d'interactivité des cartes.
- Zéro Espace Vertical Non Désiré : Les cartes se regroupent sans espaces blancs d'alignement de ligne horizontale.
- Navigation par Tabulation Clavier : Les cartes interactives suivent une séquence de tabulation visuelle logique (de gauche à droite, de haut en bas).
- Prévention du Décalage de Mise en Page : Les ratios d'aspect ou les conteneurs squelette empêchent le CLS (<0,1) lors du chargement des médias distants.
- Adaptation aux Points de Rupture Réactifs : La grille évolue en douceur de 4 colonnes sur grand écran à 1 seule colonne verticale sur mobile (<640px).
- Conformité WCAG AA : Tout le texte respecte un contraste ≥4,5:1, les cibles tactiles respectent ≥24x24px (≥44x44px sur mobile) et les anneaux de focus ne sont pas coupés et sont clairement visibles.