Existe-t-il un analogue de flex-grow
pour la propriété grille ?
J'aimerais que mes zones de grille tiennent compte du contenu qu'elles reçoivent, mais que certaines zones occupent plus de place que d'autres comme flex-grow
pour flex
.
Pratiquement, dans l'exemple ci-dessous, j'aimerais
turquoise
pour être invisible car il accueille son contenu.footer
doit également être invisible car il n'a pas de contenu.flex-grow
.Plus concrètement, j'aimerais ce code:
.ctnr {
display: grid;
min-height: 100vh;
grid-template-areas:
"header header"
"nav main"
"footer footer";
}
.test {
background: black;
height: 1rem;
}
header {
grid-area: header;
background: turquoise;
}
nav {
grid-area: nav;
background: grey;
}
main {
grid-area: main;
}
footer {
grid-area: footer;
background: yellow
}
<div class="ctnr">
<header>
<div class="test"></div>
</header>
<nav></nav>
<main></main>
<footer></footer>
</div>
Pour agir comme ce code:
.ctnr {
display: flex;
flex-direction: column;
height: 100vh;
}
.panel {
flex-grow: 1;
display: flex;
}
header {
flex-grow: 0;
background: turquoise;
}
nav {
min-width: 10rem;
background: grey
}
footer {
background: yellow
}
<div class="ctnr">
<header>hey</header>
<div class="panel">
<nav></nav>
<main></main>
</div>
<footer></footer>
</div>
Sans le div.panel
et sans ajouter de balise supplémentaire.
La raison pour laquelle je voudrais faire cela, est légitime, cet élément supplémentaire div
me dérange.
CSS Grid propose l'unité fr
, qui fonctionne de manière similaire à flex-grow
.
Alors que flex-grow
répartit l'espace libre dans le conteneur entre les éléments flexibles, l'unité fr
répartit l'espace libre dans le conteneur entre les lignes/colonnes.
D'après les spécifications:
7.2.3. Longueurs flexibles: l'unité
fr
Une longueur flexible ou
<flex>
est une dimension avec l'unitéfr
, qui représente une fraction de l'espace libre dans le conteneur de la grille.
(Notez que flex-grow
est appliqué à éléments flexibles, tandis que fr
les longueurs sont appliquées à conteneurs de grille.)
Donc, dans votre grille, vous avez trois lignes:
La première ligne est l'en-tête. Vous souhaitez que le contenu définisse sa hauteur. Sa hauteur est donc définie sur auto
.
La dernière ligne est le pied de page. Vous souhaitez que le contenu définisse sa hauteur. Sa hauteur est donc définie sur auto
.
La ligne du milieu contient les éléments nav
et main
. Vous voulez que cette ligne occupe tout l'espace vertical restant. Sa hauteur est donc définie sur 1fr
.
.ctnr {
display: grid;
grid-template-rows: auto 1fr auto; /* key rule */
grid-template-columns: 1fr 1fr;
height: 100vh;
grid-template-areas: "header header"
"nav main"
"footer footer";
}
header {
grid-area: header;
background: turquoise;
}
nav {
grid-area: nav;
background: grey;
}
main {
grid-area: main;
background: orange;
}
footer {
grid-area: footer;
background: yellow;
}
body {
margin: 0;
}
<div class="ctnr">
<header>header</header>
<nav>nav</nav>
<main>main</main>
<footer>footer</footer>
</div>