Comprendre la grille CSS : zones de modèle de grille

Publié: 2022-03-10
Résumé rapide ↬ Dans une nouvelle série, Rachel Andrew décompose la spécification CSS Grid Layout. Cette fois, nous examinons comment utiliser grid-template-areas pour placer des éléments.

Lorsque vous utilisez CSS Grid Layout, vous pouvez toujours placer des éléments d'une ligne de grille à une autre. Cependant, il existe une autre façon de décrire votre mise en page, celle qui est de nature visuelle. Dans cet article, nous allons apprendre à utiliser la propriété grid-template-areas pour définir le placement sur la grille et découvrir comment la propriété fonctionne réellement.

Au cas où vous auriez manqué les articles précédents de cette série, vous pouvez les retrouver ici :

  • Partie 1 : Création d'un conteneur de grille
  • Partie 2 : Lignes de quadrillage
  • Partie 3 : Zones de modèle de grille

Description de la mise en page avec grid-template-areas

La propriété grid-template-areas accepte une ou plusieurs chaînes comme valeur. Chaque chaîne (entre guillemets) représente une ligne de votre grille. Vous pouvez utiliser la propriété sur une grille que vous avez définie à l'aide grid-template-rows et grid-template-columns , ou vous pouvez créer votre mise en page, auquel cas toutes les lignes seront dimensionnées automatiquement.

La propriété et la valeur suivantes décrivent une grille à quatre zones, chacune s'étendant sur deux pistes de colonne et deux pistes de ligne. Une zone est amenée à s'étendre sur plusieurs pistes en répétant le nom dans toutes les cellules que vous souhaitez qu'elle couvre :

 grid-template-areas: "one one two two" "one one two two" "three three four four" "three three four four";

Les éléments sont placés dans la mise en page en étant nommés avec un identifiant à l'aide de la propriété grid-area . Par conséquent, si je veux placer un élément avec une classe de test dans la zone de la grille nommée one , j'utilise le CSS suivant :

 .test { grid-area: one; }

Vous pouvez voir cela en action dans l'exemple CodePen ci-dessous. J'ai quatre éléments (avec les classes un à quatre); ceux-ci sont affectés à la zone de grille appropriée à l'aide de la propriété grid-area et s'affichent donc sur la grille dans les cases appropriées.

Voir l'exemple Pen Simple grid-template-areas de Rachel Andrew (@rachelandrew) sur CodePen.

Voir l'exemple Pen Simple grid-template-areas de Rachel Andrew (@rachelandrew) sur CodePen.

Si vous utilisez l'inspecteur de grille de Firefox, vous pouvez voir les noms de zone et les lignes de grille démontrant que chaque élément s'étend effectivement sur deux lignes et deux colonnes - le tout sans effectuer de positionnement basé sur les lignes sur l'élément lui-même.

Une grille de quatre éléments avec Firefox Grid Inspector mettant en évidence les lignes
Chaque élément s'étend sur deux lignes et deux colonnes

Règles d'utilisation grid-template-areas

Il existe quelques règles lors de la création d'une mise en page de cette manière. Enfreindre les règles rendra la valeur invalide et donc votre mise en page ne se produira pas. La première règle est que vous devez décrire une grille complète , c'est-à-dire que chaque cellule de votre grille doit être remplie.

Si vous voulez laisser une cellule (ou des cellules) comme espace vide, vous le faites en insérant un . ou des séries telles que ... sans espace entre elles.

Par conséquent, si je modifie la valeur de grid-template-areas comme suit :

 grid-template-areas: "one one two two" "one one two two" ". . four four" "three three four four";

J'ai maintenant deux cellules sans contenu. L'élément trois s'affiche uniquement dans la dernière ligne de la grille.

Un élément ne couvre désormais qu'une seule ligne avec l'inspecteur de grille de Firefox mettant en surbrillance les lignes
Il y a maintenant un espace blanc dans la grille

Vous ne pouvez définir chaque zone qu'une seule fois , ce qui signifie que vous ne pouvez pas utiliser cette propriété pour copier du contenu à deux endroits sur la grille ! Ainsi, la valeur suivante serait invalide et entraînerait l'ignorance de toute la propriété car nous avons dupliqué la zone three :

 grid-template-areas: "one one three three" "one one two two" "three three four four" "three three four four";

Vous ne pouvez pas créer de zone non rectangulaire, la propriété ne peut donc pas être utilisée pour créer une zone en forme de « L » ou de « T », ce qui rend également la valeur suivante non valide :

 grid-template-areas: "one one two two" "one one one one" "three three four four" "three three four four";

Formater les chaînes

J'aime afficher la valeur de grid-template-areas comme ci-dessus (chaque chaîne représentant une ligne en dessous de la ligne précédente). Cela me donne une représentation visuelle de ce que sera la mise en page.

Pour vous aider, il est utile d'ajouter des caractères d'espacement supplémentaires entre chaque cellule, ainsi que d'utiliser plusieurs caractères . caractères indiquant les cellules vides.

Dans la valeur ci-dessous, j'ai utilisé plusieurs caractères d'espacement entre des mots plus petits, ainsi que plusieurs caractères . caractères pour que les cellules vides s'alignent :

 grid-template-areas: "one one two two" "one one two two" "..... ..... four four" "three three four four";

Cela dit, il est également tout à fait valide d'avoir toutes les chaînes sur une seule ligne, nous pourrions donc écrire notre exemple comme suit :

 grid-template-areas: "one one two two" "one one two two" "three three four four" "three three four four";
Plus après saut! Continuez à lire ci-dessous ↓

Expliquer grid-template-areas et grid-area

La raison pour laquelle chaque zone doit être un rectangle complet est qu'elle doit avoir la même forme que celle que vous pourriez créer en utilisant le placement basé sur les lignes. Si nous nous en tenons à notre exemple ci-dessus, nous pourrions faire cette mise en page avec des lignes de grille comme dans le prochain CodePen. Ici, j'ai créé ma grille comme avant. Cette fois, cependant, j'ai utilisé des lignes de grille pour créer le positionnement à l'aide des propriétés longues grid-column-start , grid-column-end , grid-row-start et grid-row-end .

Voir le placement Pen Grid Line par Rachel Andrew (@rachelandrew) sur CodePen.

Voir le placement Pen Grid Line par Rachel Andrew (@rachelandrew) sur CodePen.

Note : Si vous avez lu mon article précédent "Comprendre CSS Grid : Grid Lines", vous saurez qu'il est possible d'utiliser grid-area comme raccourci pour déclarer les quatre lignes à la fois.

Cela signifie que nous pourrions également créer notre mise en page avec l'ordre des lignes suivant :

  • grid-row-start
  • grid-column-start
  • grid-row-end
  • grid-column-end
 .one { grid-area: 1 / 1 / 3 / 3; } .two { grid-area: 1 / 3 / 3 / 5; } .three { grid-area: 3 / 1 / 5 / 3; } .four { grid-area: 3 / 3 / 5 / 5; }

La propriété grid-area est intéressante car elle peut prendre des numéros de ligne et des noms de ligne. Il est également important de comprendre la manière différente dont il se comporte dans chaque mode.

Utilisation grid-area avec des numéros de ligne

Si vous utilisez la propriété grid-area avec des numéros de ligne, les lignes sont affectées dans l'ordre décrit ci-dessus.

Si vous manquez des valeurs - fournissant ainsi 1, 2 ou 3 numéros de ligne - les valeurs manquantes sont définies sur auto , ce qui signifie que la zone s'étendra sur 1 piste (ce qui est la valeur par défaut). Ainsi, le CSS suivant placerait un élément grid-row-start: 3 avec toutes les autres valeurs définies sur auto, par conséquent, l'élément serait automatiquement placé dans la première piste de colonne disponible et s'étendrait sur une piste de ligne et une piste de colonne.

 grid-area: 3;

Utilisation grid-area avec des identifiants

Si vous utilisez un ident (c'est ainsi qu'une zone nommée est appelée dans Grid Layout), la propriété grid-area prend également quatre lignes. Si vous avez des lignes nommées sur votre grille comme décrit dans « Comprendre la grille CSS : Création d'un conteneur de grille », vous pouvez utiliser ces lignes nommées de la même manière que les lignes numérotées.

Cependant, ce qui se passe lorsque vous manquez certaines lignes est différent lorsque vous utilisez des identifiants et non des chiffres.

Ci-dessous, j'ai créé une grille avec des lignes nommées et utilisé grid-area pour placer un élément (manquant la valeur finale):

 .grid { display: grid; grid-template-columns: [one-start three-start] 1fr 1fr [one-end three-end two-start four-start] 1fr 1fr [two-end four-end]; grid-template-rows: [one-start two-start] 100px 100px [one-end two-end three-start four-start] 100px 100px [three-end four-end];; } .two { grid-area: two-start / two-start / two-end; }

Cela signifie qu'il nous manque le nom de ligne pour grid-column-end . La spécification indique que dans cette situation, grid-column-end doit utiliser une copie de grid-column-start . Si grid-column-end et grid-column-start sont identiques, alors la ligne de fin est supprimée, et essentiellement la valeur est définie sur auto afin que nous couvrons une piste comme dans la version numérotée.

La même chose se produit si nous manquons la troisième valeur grid-row-end ; il devient le même que grid-row-start et devient donc auto .

Jetez un œil à l'exemple CodePen suivant sur la façon dont chaque grid-area est utilisée et comment cela modifie ensuite la disposition de l'élément :

Voir les identifiants Pen Missing in grid-area par Rachel Andrew (@rachelandrew) sur CodePen.

Voir les identifiants Pen Missing in grid-area par Rachel Andrew (@rachelandrew) sur CodePen.

Cela explique alors pourquoi grid-area fonctionne avec une seule valeur ident représentant un nom de zone.

Lorsque nous créons une zone nommée avec la propriété grid-template-areas , le bord de chaque zone peut être référencé par un nom de ligne identique au nom de zone que vous avez utilisé. Dans notre cas, nous pourrions prendre notre zone nommée one et placer notre élément en utilisant des lignes nommées comme suit :

 .one { grid-row-start: one; grid-row-end: one; grid-column-start: one; grid-row-end: one; }

Si la ligne est une ligne -start , alors one se résout à la fin de début de la colonne ou de la ligne. S'il s'agit d'une ligne -end , alors one se résout à la ligne de fin de la colonne ou de la ligne.

Cela signifie que lorsque nous disons grid-area: one , nous avons omis les trois dernières valeurs pour le raccourci grid-area ; ils finissent tous par être des copies de la première valeur - tous dans notre cas deviennent one et l'élément est placé comme avec notre utilisation à long terme.

La façon dont la dénomination fonctionne dans Grid Layout est intelligente et permet des choses intéressantes, dont j'ai parlé dans mes articles précédents "Nommer les choses dans CSS Grid Layout" et "Modèles de conception éditoriale avec grille CSS et colonnes nommées".

Superposition d'éléments lors de l'utilisation grid-template-areas

Un seul nom peut occuper chaque cellule lors de l'utilisation grid-template-areas , cependant, vous pouvez toujours ajouter des éléments supplémentaires à la grille après avoir fait votre mise en page principale de cette manière. Vous pouvez utiliser les numéros de ligne comme d'habitude.

Dans l'exemple CodePen ci-dessous, j'ai ajouté un élément supplémentaire et je l'ai positionné en utilisant le positionnement basé sur les lignes sur les éléments déjà positionnés :

Voir Pen Placer un élément avec des numéros de ligne par Rachel Andrew (@rachelandrew) sur CodePen.

Voir Pen Placer un élément avec des numéros de ligne par Rachel Andrew (@rachelandrew) sur CodePen.

Vous pouvez également utiliser les noms de lignes définis lors de la création de vos colonnes ou lignes habituelles. Mieux encore, vous aurez des noms de ligne créés par la formation des zones. Nous avons déjà vu comment vous pouvez obtenir quatre noms de ligne avec le nom de la zone. Vous obtenez également une ligne sur le bord de départ de chaque zone avec -start ajouté au nom de la zone, et une ligne sur le bord de fin de chaque zone avec -end ajouté.

Par conséquent, la zone nommée one a des lignes de bord de début nommées one-start et des lignes de bord de fin nommées one-end .

Vous pouvez ensuite utiliser ces noms de ligne implicites pour placer un élément sur la grille. Cela peut être utile si vous redéfinissez la grille à différents points d'arrêt tant que vous voulez toujours que l'élément placé vienne après un certain nom de ligne.

Voir Pen Placer un élément avec des noms de ligne implicites par Rachel Andrew (@rachelandrew) sur CodePen.

Voir Pen Placer un élément avec des noms de ligne implicites par Rachel Andrew (@rachelandrew) sur CodePen.

Utilisation des zones de modèle de grille dans la conception réactive

Je travaille souvent avec la construction de composants dans une bibliothèque de composants et je trouve que l'utilisation grid-template-areas peut être utile pour pouvoir voir exactement à quoi ressemblera un composant à partir du CSS. Il est également très simple de redéfinir le composant à différents points d'arrêt en redéfinissant la valeur de grid-template-areas parfois en plus de modifier le nombre de pistes de colonne disponibles.

Dans le CSS ci-dessous, j'ai défini une disposition de colonne unique pour mon composant. Ensuite, à une largeur minimale de 600px, je redéfinis le nombre de colonnes ainsi que la valeur de grid-template-areas afin de créer une mise en page à deux colonnes. La bonne chose à propos de cette approche est que quiconque regarde ce CSS peut voir comment la mise en page fonctionne !

 .wrapper { background-color: #fff; padding: 1em; display: grid; gap: 20px; grid-template-areas: "hd" "bd" "sd" "ft"; } @media (min-width: 600px) { .wrapper { grid-template-columns: 3fr 1fr; grid-template-areas: "hd hd" "bd sd" "ft ft"; } } header { grid-area: hd; } article {grid-area: bd; } aside { grid-area: sd; } footer { grid-area: ft; }

Accessibilité

Lorsque vous utilisez cette méthode, vous devez savoir qu'il est très facile de déplacer des éléments et de provoquer le problème de déconnexion de l'affichage visuel de l'ordre source sous-jacent. Toute personne qui navigue sur le site, ou qui regarde l'écran tout en faisant parler le contenu, utilisera l'ordre dans lequel les choses se trouvent dans la source. En déplaçant l'affichage de cet ordre, vous pourriez créer une expérience déroutante et déconnectée. N'utilisez pas cette méthode pour déplacer les éléments sans vous assurer également que la source est dans un ordre raisonnable et correspond à l'expérience visuelle.

Sommaire

C'est la vérité sur l'utilisation des propriétés grid-template-area et grid-area pour créer des mises en page. Si vous n'avez jamais utilisé cette méthode de mise en page auparavant, essayez-la. Je trouve que c'est une belle façon d'expérimenter les mises en page et de l'utiliser souvent lors du prototypage d'une mise en page - même si pour une raison ou une autre, nous utiliserons finalement une méthode différente pour la version de production.

Débordement et perte de données dans CSS

CSS est conçu pour garder votre contenu lisible. Explorons les situations dans lesquelles vous pourriez rencontrer un débordement dans vos conceptions Web et comment CSS a évolué pour créer de meilleures façons de gérer et de concevoir autour de quantités inconnues de contenu. Lire un article connexe →