263 votes

Lignes de hauteur égale dans la disposition de grille CSS

Je suppose que cela est impossible à utiliser avec Flexbox, car chaque rangée ne peut représenter que la hauteur minimale requise pour s'adapter à ses éléments, mais cela peut-il être réalisé à l'aide de la nouvelle grille CSS?

Pour être clair, je veux une hauteur égale pour tous les éléments d'une grille sur toutes les lignes, pas seulement pour chaque ligne. Fondamentalement, la "cellule" la plus haute devrait dicter la hauteur de toutes les cellules, et pas seulement des cellules de sa rangée.

478voto

Michael_B Points 15556

Réponse Courte

Si l'objectif est de créer un réseau avec une égale hauteur des lignes, où le plus grand de la cellule dans la grille définit la hauteur pour toutes les lignes, voici une solution rapide et simple:

  • Mettre le récipient d' grid-auto-rows: 1fr

Comment ça marche

Présentation de la grille fournit un logement pour l'établissement flexible longueurs dans une grille contenant. C'est l' fr unité. Il est conçu pour distribuer de l'espace libre dans le conteneur et est quelque peu analogue à l' flex-grow propriété dans flexbox.

Si vous définissez toutes les lignes dans une grille conteneur 1fr, disons le comme ceci:

grid-auto-rows: 1fr;

... puis toutes les lignes seront égale hauteur.

Il n'est pas vraiment hors-la-chauve-souris, car fr est censé distribuer de l'espace libre. Et si plusieurs lignes ont un contenu avec des hauteurs différentes, puis, quand l'espace est distribué, quelques lignes seraient proportionnellement plus petit et plus grand.

Sauf, enfoui au plus profond dans la grille de spécification est cette petite pépite:

7.2.3. Flexible Longueur: l' fr unité

...

Lorsque l'espace disponible est infini (ce qui arrive lorsque la grille conteneur largeur ou de la hauteur est à durée indéterminée), flex-taille moyenne (fr) de la grille pistes sont de la taille de leur contenu, tout en conservant leurs proportions respectives.

La taille utilisée de chaque flex-taille de la grille de piste est calculée en déterminant l' max-content de la taille de chaque flex-taille de la grille de suivi et de diviser le résultat la taille par le flex facteur pour déterminer un "hypothétique 1fr la taille".

Le maximum de celles-ci est utilisé comme résolu 1fr de la longueur (la flex fraction), qui est ensuite multiplié par chaque cellule de la grille de la piste flex facteur pour déterminer sa taille définitive.

Donc, si je suis en train de lire ceci correctement, lorsque vous traitez avec un dynamiquement la taille de la grille (par exemple, la hauteur est à durée indéterminée), la grille de pistes (lignes, dans ce cas) sont de taille à leur contenu.

La hauteur de chaque ligne est déterminée par la plus haute (max-content) de la grille de l'élément.

La hauteur maximale de ces lignes devient la longueur de l' 1fr.

C'est combien de 1fr crée la même hauteur des lignes dans une grille contenant.


Pourquoi flexbox n'est pas une option

Comme indiqué dans la question, l'égalité de la hauteur des lignes ne sont pas possibles avec flexbox.

Flex éléments peut être égale hauteur, sur la même ligne, mais pas sur plusieurs lignes.

Ce comportement est défini dans la flexbox spec:

6. Lignes Flex

Dans un multi-ligne flex conteneur, la croix de la taille de chaque ligne est la taille minimale nécessaire pour contenir le flex éléments sur la ligne.

En d'autres termes, lorsqu'il y a plusieurs lignes dans une base de lignes flex conteneur, la hauteur de chaque ligne (de la "croix" taille") est la hauteur minimale nécessaire pour contenir le flex éléments sur la ligne.

67voto

Hlsg Points 490

La réponse courte est que le réglage grid-auto-rows: 1fr; sur le conteneur de grille résout ce qui était demandé.

https://codepen.io/Hlsg/pen/EXKJba

0voto

MTZ Points 86

Vous pouvez utiliser des pourcentages pour grid-template-rows comme tel

 grid-template-rows: 50% 50%;
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X