Flex base de 100% dans la colonne flexbox: pleine hauteur dans Firefox, pas dans Chrome
Je voudrais une colonne de vrd, de n'importe quel nombre, chacun avec une largeur de 100% et à hauteur de 100% de leur div parent, de sorte que l'une est visible au départ, et les autres de dépassement de la mère vers le bas. J'ai mis les divs avoir flex: 0 0 100%;
, à l'intérieur d'un div parent avec display: flex
et flex-direction: column
pour atteindre cet objectif.
La div parent est lui-même de l'inconnu de la hauteur, de sorte qu'il est aussi un enfant d'un display: flex
et flex-direction: column
, mis à flex: 1 0 0
de prendre de l'espace restant dans son conteneur.
Dans Firefox, la sortie est comme je le voudrais:
Cependant, pas dans Chrome:
Comment puis-je obtenir Firefox de style dans Chrome, sans Javascript?
Vous pouvez le voir en action à http://plnkr.co/edit/WnAcmwAPnFaAhqqtwhLL?p=preview, ainsi que la version correspondante avec flex-direction: row
, qui travaille de façon constante à la fois Firefox et Chrome.
Pour référence, le CSS complète
.wrapper {
display: flex;
flex-direction: column;
height: 150px;
width: 200px;
border: 4px solid green;
margin-bottom: 20px;
}
.column-parent {
flex: 1 0 0;
display: flex;
flex-direction: column;
border: 2px solid blue;
}
.column-child {
flex: 0 0 100%;
border: 2px solid red;
}
et HTML
<div class="wrapper">
<p>Some content of unknown size</p>
<div class="column-parent">
<div class="column-child">
Should be inside green
</div>
<div class="column-child">
Should be outside green
</div>
</div>
</div>
- remarquez que dans firefox aussi - si vous ajoutez des colonnes les éléments enfants - ils s'effondrer (comme dans google Chrome) Plunker
- J'ai ajouté une autre solution, moins hacky, dans ma réponse
- Chrome / Safari n'est pas de remplissage de 100% à hauteur de flex parent
Vous devez vous connecter pour publier un commentaire.
Comme indiqué dans Abhitalks réponse, il y a un bug (ou une interprétation différente de la norme) dans la façon Chrome poignées de la hauteur attribut ici.
J'ai trouvé un hack qui travaille à la fois dans Chrome, FF et IE
Le seul problème est que vous nie avoir autant de règles que possible, les enfants y sont.
Le truc est de mettre le flex-direction de ligne, définissez le flex de base (qui est maintenant la largeur) à 100%, puis de traduire les éléments
CSS:
HTML:
Si il pourrait y avoir un autre enfant, vous avez besoin d'une nth-child(4) de la règle, et ainsi de suite
J'ai ajouté un effet hover pour vérifier la façon dont la taille s'adapte
Ce qui semble être un bug avec Chrome. Similaires à ceux rapportés ici (question 428049) et peut-être liée à (question 346275).
Cela dit:
Sommairement, Chrome n'est pas la résolution pour cent des hauteurs sur flex-élément de l'enfant (même si l'enfant est lui-même un flex-élément), tandis que tous les autres navigateurs n'.
Cela peut être illustré dans l'extrait de code ci-dessous: (Violon ici)
CSS:
HTML:
La deuxième
div
doit montrer le même comportement que le premier. Les autres navigateurs (IE11, Edge, FF39) afficher correctement. Google Chrome ne parvient pas d'ici et ne permet pas de résoudrediv.item
correctement. Il a besoin d'une hauteur fixe sur son parent, sans laquelle il utilisemin-content
que sa hauteur et n'a donc pas de débordement.Alors que, dans le premier
div
, lediv.item
s sont correctement réglés et dépassement de capacité en conséquence. C'est parce qu'il y a une hauteur fixe sur le parent (c'est à dirediv.wrap
)Solution Possible:
Comme une solution de contournement, si vous êtes sûr d'avoir seulement deux éléments (
p
etdiv
) à l'intérieur de votre enveloppe, alors vous pourriez leur donner un50%
hauteur. Vous devez fournir unheight:50%
à votre.column-parent
. Chrome a besoin d'une hauteur fixe sur les parents comme démontré ci-dessus.Puis tout le travail que vous avez besoin.
Démo Violon: http://jsfiddle.net/abhitalks/kqncm65n/
Pertinentes CSS:
PS: Il semble également y avoir des différences dans la manière jsfiddle et plnkr rendu. Je ne sais pas pourquoi, mais j'ai parfois des résultats différents!
HTML
est correctement tapé dans ce violon. Quelle peut être la raison pour ne pas imprimer les valeurs?Ma réponse précédente est un hack qui exploite une configuration particulière de la mise en page voulu.
Une autre façon, plus générale, de contourner ce Chrome bug est d'utiliser un élément intermédiaire dans la mise en page, et de définir cette taille de l'élément à l'aide de top: 0px et bottom: 0px. (au lieu de la hauteur: 100%) Il y a encore un bug dans la façon Chrome poignées de calcul, qui a besoin d'un faux de l'animation pour le faire ajuster correctement
CSS:
HTML:
Que sur l'ajout de 100% pour le conteneur:
Et flex-grow à 1 dans le contenu de l'élément sans réglage de flex de base:
Voici à quoi il devrait ressembler: http://plnkr.co/edit/H25NQxLtbi65oaltNVax?p=preview