CSS Grid est un outil fantastique pour créer des dispositions réactives avec un code minimal, éliminant souvent le besoin de requêtes multimédias. Je suis à l'aise de l'utiliser pour diverses dispositions, priorisant le HTML propre. Cependant, un défi d'interface utilisateur récent a présenté un problème unique: l'élargissement d'une cellule de grille à pleine largeur lorsqu'un bouton a été cliqué, tout en maintenant la structure et la réactivité de la grille d'origine.
L'exigence était que la cellule élargie:
La solution, étonnamment élégante, n'utilise que quelques lignes de grille CSS. Cet article détaille trois techniques de grille CSS simples pour y parvenir sans JavaScript.
Voici un exemple simplifié de la tâche d'interface utilisateur: notre bibliothèque de composants de contes présente une grille de cartes de produits. Chaque carte avait besoin d'un bouton "View rapide" pour révéler une carte plus grande et pleine largeur avec des informations détaillées sur le produit. Cette expansion devait:
Au départ, j'ai supposé que JavaScript serait nécessaire pour repositionner les cartes. Les recherches en ligne pour les implémentations de «vue rapide» ont principalement donné des solutions modales ou de superposition. Les modaux sont communs pour le contenu ciblé, mais je voulais une solution qui s'intégrait de manière transparente dans la grille.
La solution est venue de la combinaison de plusieurs puissantes caractéristiques de la grille CSS.
Mon système de grille existant a déjà utilisé cette technique:
.grille { Affichage: grille; Écart: 1rem; grille-template-colonnes: répéter (auto-fit, 20rem); }
grid-template-columns: repeat(auto-fit, 20rem);
Crée des colonnes (20rem de large ici) qui s'adaptent automatiquement à l'espace disponible, enveloppant les nouvelles lignes au besoin. L'explication de Sara Soueidan sur auto-fit
vs auto-fill
est excellente. Pour plus de simplicité, j'ai utilisé des largeurs de colonne fixes.
Pour accueillir la carte élargie:
.fullwidth { grille-colonne: 1 / -1; }
Puisque l'astuce n ° 1 crée une grille explicite, grid-column: 1 / -1;
s'étend sur toute la largeur (de la colonne 1 à la dernière).
Cependant, cela laisse des lacunes au-dessus de la carte pleine largeur.
Le remplissage de ces lacunes utilise une approche en fausse maçonnerie:
.grille { Grid-Auto-Flow: dense; }
grid-auto-flow: dense;
optimise le placement automatique, remplissant les lacunes plus tôt dans la grille. Cela fonctionne efficacement lorsque:
minmax()
pour des largeurs flexibles).align-items: stretch
fait implicitement les cellules remplir la hauteur des lignes).L'ordre DOM d'origine est conservé, crucial pour l'accessibilité. MDN fournit une explication complète du placement automatique du réseau CSS.
Ces trois techniques créent une disposition simple et efficace avec un CSS minimal, pas de requêtes multimédias et pas de JavaScript pour les calculs de disposition.
JavaScript reste nécessaire, mais uniquement pour les fonctionnalités: gérer les événements de clic, concentrer et afficher la carte injectée. Dans le prototype, les cartes pleine largeur sont codées en dur; JavaScript bascule leur visibilité.
Dans un environnement de production, la carte serait probablement récupérée dynamiquement et insérée. Pour éviter de faire gonfler le DOM, le contenu injecté doit être considéré comme une amélioration progressive; Si JavaScript échoue, les utilisateurs sont redirigés vers la page Détails du produit.
Priorization HTML sémantique, attributs Aria et navigation au clavier:
<ul> pour une clarté sémantique.</ul>
<li> Éléments avec des titres appropriés.</li>
<li> L'ordre DOM est conservé pour l'ordre d'onglet naturel.</li>
<li> La gestion de la mise au point assure une bonne navigation au clavier. (D'autres améliorations pourraient inclure des étiquettes explicites pour la carte injectée, la liaison des clés <kbd>ESC</kbd> pour la fermeture et le défilement de la fenêtre pour assurer la visibilité).</li>
Cette approche offre une alternative propre aux modaux, révélant un contenu supplémentaire sans masquer la page. Il pourrait être utile pour divers scénarios, tels que les légendes d'image ou le texte d'assistance, potentiellement remplacer <details>/<summary></summary></details>
Dans certains cas. J'ai hâte d'entendre vos pensées et vos approches alternatives.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!