Comment faire flexbox enfants de 100% de la hauteur de leur parent?
Je suis en train de remplir l'espace vertical d'un flex de l'élément à l'intérieur d'un flexbox.
CSS:
.container {
height: 200px;
width: 500px;
display: flex;
flex-direction: row;
}
.flex-1 {
width: 100px;
background-color: blue;
}
.flex-2 {
position: relative;
flex: 1;
background-color: red;
}
.flex-2-child {
height: 100%;
width: 100%;
background-color: green;
}
HTML:
<div class="container">
<div class="flex-1"></div>
<div class="flex-2">
<div class="flex-2-child"></div>
</div>
</div>
Et voici le JSFiddle
flex-2-child
de ne pas remplir la hauteur requise, sauf dans les deux cas où:
flex-2
a une hauteur de 100% (ce qui est bizarre, parce que d'un flex élément a 100% par défaut + il est bogué dans google Chrome)flex-2-child
a une position absolue qui est aussi gênant
Cela ne fonctionne pas avec Chrome ou Firefox actuellement.
- quel est le problème avec l'utilisation de height:100%; pour .flex-2 ?
- Il défie le but de la flexion de l'élément qui est à remplir le contenu en lui-même et de me donner le plus étrange bug dans chrome où la hauteur revient à zéro à chaque fois que je redimensionner la fenêtre
- Firefox versions qui suivent encore la spec à partir de 2009 (affichage: cocher) se comportent très différemment des versions qui suivent le moderne spec. Si FF est défaillante, je vous recommande d'enlever le support pour cela.
- En fait, la dernière version de Firefox est le seul à travailler correctement
- Actuellement, il existe d'importantes différences de comportement entre les navigateurs quand il s'agit de rendre pourcentage des hauteurs dans flexbox: stackoverflow.com/a/35537510/3597276
- Yep, Chrome a certains problèmes, en particulier avec imbriqué flexboxes. Par exemple, j'ai un imbriquée flex zone avec des enfants qui ont
height:100%
mais ils sont rendu avec hauteur naturelle à la place. Et la chose étrange est que si je change leur hauteur àauto
, alors qu'ils rendentheight:100%
comme j'ai essayé de faire. Ce n'est certainement pas intuitif si c'est la façon dont il devrait fonctionner.
Vous devez vous connecter pour publier un commentaire.
J'ai répondu à une question similaire ici.
Je sais que vous l'avez déjà dit
position: absolute;
est gênant, mais il fonctionne. Voir ci-dessous pour de plus amples renseignements sur la façon de résoudre le problème de redimensionnement.Aussi voir ce jsFiddle pour une démo, même si j'ai ajouté webkit préfixes afin de l'ouvrir dans google Chrome.
En gros, vous avez 2 questions que je vais traiter séparément.
position: relative;
sur le parent de l'enfant.position: absolute;
sur l'enfant.overflow-y: auto;
sur le défilement div.height: 0;
Voir ce réponse pour plus d'informations sur le défilement de la question.
Si je comprends bien, vous voulez flex-2-enfant pour remplir la hauteur et la largeur de son parent, de sorte que la zone rouge est entièrement couvert par le vert?
Si oui, vous avez juste besoin de mettre en flex-2 pour utiliser flexbox:
Alors dites-flex-2-enfant à devenir flexible:
Voir http://jsfiddle.net/2ZDuE/10/
La raison en est que flex-2-enfant n'est pas un flexbox, mais ses parent l'est.
align-items: center
si vous utilisezalign-self: stretch
sur un seul enfant.min-height: 100vh;
à.flex-2
élément pour en faire des œuvres. Merci pour l'aide!Similaire à David Storey réponse, mon travail est environ
Alternativement à
align-items
, vous pouvez utiliseralign-self
juste sur le.flex-2-child
élément que vous souhaitez tendu.stretch
: ce devrait être la réponse choisie.Je suppose que google Chrome, le comportement est plus compatible avec les CSS (même si c'est moins intuitif). Selon Flexbox spec, la valeur par défaut
stretch
valeur dealign-self
propriété ne change que la utilisé valeur de l'élément de la "croix de la taille de la propriété" (height
, dans ce cas). Et, comme je comprends le CSS2.1 spec, le pourcentage des hauteurs sont calculées à partir de la spécifié valeur de la société mèreheight
, pas sa valeur utilisée. La valeur spécifiée de la société mèreheight
n'est pas affectée par toutes les propriétés de flex et est encoreauto
.Paramètre explicite
height: 100%
rend officiellement possible de calculer le pourcentage de la hauteur de l'enfant, tout comme la mise enheight: 100%
àhtml
permet de calculer le pourcentage de la hauteur debody
dans CSS2.1.height:100%
à.flex-2
. Voici le jsfiddle.height: 100%
donne de très étrange résultats pour moi sur Chrome. Il semble que cela provoque la "hauteur spécifiée" doit être défini à la hauteur totale du conteneur, plutôt que de la hauteur de l'élément lui-même, de sorte que les causes indésirable de défilement lorsque d'autres éléments ont des tailles calculées par rapport à elle.J'ai trouvé la solution par moi-même, supposons que vous avez le CSS ci-dessous:
Dans ce cas, le réglage de la hauteur de 100% ne fonctionnera pas, donc ce que je fais est le réglage de la
margin-bottom
règle deauto
, comme:et l'enfant sera aligné à la supérieure de la maison mère, vous pouvez également utiliser le
align-self
règle de toute façon, si vous préférez.Une idée serait que
display:flex;
avecflex-direction: row;
de remplissage estcontainer
div avec.flex-1
et.flex-2
, mais cela ne signifie pas que.flex-2
a un défautheight:100%;
même si elle est étendue à toute la hauteur et d'avoir un enfant de l'élément (.flex-2-child
) avecheight:100%;
vous aurez besoin de mettre de la mère àheight:100%;
ou de l'utilisationdisplay:flex;
avecflex-direction: row;
sur le.flex-2
div trop.De ce que je sais
display:flex
ne s'étend pas à toutes vos éléments d'enfant à hauteur de 100%.Une petite démo, retiré de la hauteur de
.flex-2-child
et utilisédisplay:flex;
sur.flex-2
:http://jsfiddle.net/2ZDuE/3/
html
css
http://jsfiddle.net/2ZDuE/750/
.conteneur {
. . . .
alignez-les éléments: extensible;
. . . .
}
C'est ma solution à l'aide css+
Tout d'abord si le premier enfant (flex-1) doit être 100px ne devrait pas être flexible.
Dans css+ en fait, vous pouvez définir flexibles et/ou des éléments statiques (lignes ou colonnes) et par votre exemple, devenir aussi facile que cela:
conteneur css:
et comprend évidemment css+ 0.2 core
entendre le violon