Pourquoi ai-je un débordement sur l'axe X dans l'extrait de code suivant?
Le débordement est généré une fois que j'applique grid-gap: 10px
sur mon .body
conteneur de grille.
div:not(.header):not(.body):not(.row) {
border: 1px solid grey;
}
.header {
margin-top: 20px;
display: grid;
grid-gap: 10px;
grid-template-areas: "header-left header-right-up" "header-left header-right-down";
grid-template-rows: 40px 40px;
grid-template-columns: minmax(50px, 200px) auto;
}
.header-left {
grid-area: header-left;
}
.header-right-up {
grid-area: header-right-up;
}
.header-right-down {
grid-area: header-right-down;
}
.body {
margin-top: 20px;
display: grid;
grid-template-columns: 25% 50% 25%;
grid-auto-rows: 80px;
grid-gap: 10px;
}
.row-left {
}
.row-center {
}
.row-right {
}
<div class="header">
<div class="header-left">image</div>
<div class="header-right-up">content</div>
<div class="header-right-down">long content</div>
</div>
<div class="body">
<div class="row-left"></div>
<div class="row-center"></div>
<div class="row-right"></div>
<div class="row-left"></div>
<div class="row-center"></div>
<div class="row-right"></div>
<div class="row-left"></div>
<div class="row-center"></div>
<div class="row-right"></div>
</div>
</div>
Vous disposez d'un conteneur de grille à 3 colonnes (.body
):
grid-template-columns: 25% 50% 25%
La largeur totale de ces colonnes est de 100%.
Vous ajoutez ensuite des gouttières entre les colonnes (et les lignes):
grid-gap: 10px
qui est un raccourci pour:
grid-column-gap: 10px;
grid-row-gap: 10px;
Ainsi, lorsque vous additionnez toutes les largeurs, vous obtenez:
25% + 50% + 25% + 10px + 10px
Plus brièvement:
100% + 20px > 100%, which results in an overflow condition
(Remarque: grid-*-gap
les propriétés s'appliquent uniquement entre les éléments de la grille - jamais entre les éléments et le conteneur. C'est pourquoi nous calculons deux écarts de grille, pas quatre.)
En tant que solution , au lieu d'unités en pourcentage, essayez d'utiliser les unités fr
, qui s'appliquent uniquement à l'espace libre. Cela signifie que fr
longueurs sont calculées après tout grid-gap
des longueurs sont appliquées.
grid-template-columns: 1fr 2fr 1fr
div:not(.header):not(.body):not(.row) {
border: 1px solid grey;
}
.header {
margin-top: 20px;
display: grid;
grid-gap: 10px;
grid-template-areas: "header-left header-right-up" "header-left header-right-down";
grid-template-rows: 40px 40px;
grid-template-columns: minmax(50px, 200px) auto;
}
.header-left {
grid-area: header-left;
}
.header-right-up {
grid-area: header-right-up;
}
.header-right-down {
grid-area: header-right-down;
}
.body {
margin-top: 20px;
display: grid;
grid-template-columns: 1fr 2fr 1fr; /* ADJUSTMENT */
grid-auto-rows: 80px;
grid-gap: 10px;
}
.row-left {}
.row-center {}
.row-right {}
<div class="header">
<div class="header-left">image</div>
<div class="header-right-up">content</div>
<div class="header-right-down">long content</div>
</div>
<div class="body">
<div class="row-left"></div>
<div class="row-center"></div>
<div class="row-right"></div>
<div class="row-left"></div>
<div class="row-center"></div>
<div class="row-right"></div>
<div class="row-left"></div>
<div class="row-center"></div>
<div class="row-right"></div>
</div>
Plus de détails ici: La différence entre le pourcentage et les unités fr dans la disposition de la grille CSS
Si vous souhaitez utiliser des pourcentages ou une autre unité, il existe une autre solution. L'utilisation de la fonction minmax()
permettra aux colonnes de rétrécir pour s'adapter au conteneur parent et de ne pas provoquer de débordement .
La solution ressemblerait à ceci:
grid-template-columns: minmax(auto, 25%) minmax(auto, 50%) minmax(auto, 25%);
gap: 10px;
En savoir plus sur la fonction minmax()
ici .