J'ai des problèmes avec une colonne flexbox dans laquelle les enfants de l'élément flex'd ne répondent pas à height
en pourcentages. Je ne l'ai vérifié que dans Chrome, et d'après ce que j'ai compris, c'est un problème Chrome. Voici mon exemple:
HTML
<div class='flexbox'>
<div class='flex'>
<div class='flex-child'></div>
</div>
<div class='static'></div>
</div>
CSS
.flexbox{
position:absolute;
background:black;
width:100%;
height:100%;
display: flex;
flex-direction:column;
}
.flex{
background:blue;
flex:1;
}
.flex-child{
background:red;
height:100%;
width:100%;
display:block;
}
.static{
background:green;
width:100%;
height:5rem;
}
Je le veux si le rouge .flex-child
remplit le bleu .flex
. Pourquoi ne pas height:100%
travail?
TL; DR: Réglez .flex
Sur display:flex
Et supprimez le height:100%
Sur .flex-child
. Vous pouvez voir le CodePen modifié ici.
Pourquoi ça marche:
J'ai appris de cette question similaire que, selon la spécification flexbox, une valeur align-self:stretch
(La valeur par défaut pour un élément flex'd) ne change que le valeur utilisée de la propriété de taille croisée d'un élément (dans ce cas, height
). Les pourcentages sont toutefois calculés à partir de la valeur spécifiée de la propriété de taille croisée du parent, et non de sa valeur utilisée. Si jamais vous ouvrez votre inspecteur et que vous voyez height:100%
Sous "Styles" mais height:1200px
Sous "Calculé", vous obtenez le spécifié et utilisé valeurs respectivement.
Il semble que Chrome respecte la spécification à cet égard. Cela signifie que le réglage de height:100%
Sur .flex-child
Signifie que 100% de la valeur spécifiée de height
de .flex
. Comme nous n’avons pas spécifié de height
sur .flex
, cela signifie que nous récupérons 100% de la valeur par défaut height
, qui auto
. Vous voyez pourquoi le moteur de mise en page est confus?
Paramétrer .flex
Sur display:flex
Et supprimer le height:100%
De .flex-child
(Afin d'éviter de continuer à définir 100% de auto
) fera que .flex-child
remplisse tout .flex
Quand cela ne fonctionnera pas:
Cela ne fonctionnera pas si vous essayez de ne remplir qu'une partie de .flex
, Ex. essayer de définir .flex-child
sur height:90%
, car fléchir l'enfant signifie qu'il remplira tout l'espace disponible. Je pensais que vous pourriez peut-être le pirater avec un positionnement absolu, mais cela ne semble pas fonctionner non plus. Vous pouvez pirater en ajoutant un deuxième enfant à .flex
Que nous appellerons .spacer
, Et en réglant .spacer
Sur flex:1
Et .flex-child
Sur flex:9
(Veillez également à définir flex-direction:column
Sur .flex
Également). Un bidouillage, mais le seul moyen que je pourrais résoudre ce problème. Voici le CodePen.
Espérons que nous n’avons pas besoin de continuer à compter sur cela et qu’ils changeront simplement les spécifications pour agir plus comme prévu.