J'essaie de remplir l'espace vertical d'un élément flexible à l'intérieur d'une Flexbox.
.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;
}
<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
ne remplit pas la hauteur requise sauf dans les deux cas où:
flex-2
a une hauteur de 100% (ce qui est bizarre car un élément flexible a 100% par défaut + il est buggé dans Chrome)flex-2-child
a une position absolue qui est également gênante
Cela ne fonctionne pas actuellement dans Chrome ou Firefox.
height:100%
mais qui sont rendus à la hauteur naturelle à la place. Et le plus étrange, c'est que si je change leur hauteur enauto
, ils restituent commeheight:100%
j'essayais de le faire. Ce n'est certainement pas intuitif si c'est ainsi que cela devrait fonctionner.Réponses:
Utilisation
align-items: stretch
Semblable à la réponse de David Storey, ma solution est la suivante:
Vous
align-items
pouvez également utiliseralign-self
uniquement l'.flex-2-child
élément que vous souhaitez étirer.la source
stretch
: ce devrait être la réponse choisie.height: 100%
du composant enfant que vous souhaitez avoir la même taille que le parentheight: 100%
à la réponse - j'ai failli abandonner et je n'ai vu cela qu'au dernier moment avant de revenir àabsolute
- ce qui pose toutes sortes de problèmes.J'ai répondu à une question similaire ici .
Je sais que vous avez déjà dit que ce
position: absolute;
n'était pas pratique, mais cela fonctionne. Voir ci-dessous pour plus d'informations sur la résolution du problème de redimensionnement.Voir aussi ce jsFiddle pour une démo, même si je n'ai ajouté que des préfixes webkit donc ouverts dans Chrome.
Vous avez essentiellement 2 problèmes que je traiterai séparément.
position: relative;
sur le parent de l'enfant.position: absolute;
sur l'enfant.overflow-y: auto;
le div défilable.height: 0;
Consultez cette réponse pour plus d'informations sur le problème de défilement.
la source
Si je comprends bien, vous voulez que flex-2-child remplisse la hauteur et la largeur de son parent, de sorte que la zone rouge soit entièrement couverte par le vert?
Si c'est le cas, il vous suffit de configurer flex-2 pour utiliser flexbox:
Dites ensuite à flex-2-child de devenir flexible:
Voir http://jsfiddle.net/2ZDuE/10/
La raison en est que flex-2-child n'est pas un élément flexbox, mais son parent l'est.
la source
align-items: center
si vous utilisezalign-self: stretch
sur un seul enfant.min-height: 100vh;
à l'.flex-2
élément pour que cela fonctionne. Merci pour l'aide!Je suppose que le comportement de Chrome est plus cohérent avec la spécification CSS (bien qu'il soit moins intuitif). Selon la spécification Flexbox, la
stretch
valeur par défaut de laalign-self
propriété modifie uniquement la valeur utilisée de la "propriété de taille croisée" de l'élément (height
, dans ce cas). Et, si je comprends bien la spécification CSS2.1 , les hauteurs en pourcentage sont calculées à partir de la valeur spécifiée du parentheight
, et non de sa valeur utilisée. La valeur spécifiée du parentheight
n'est affectée par aucune propriété de flexion et l'est toujoursauto
.La définition explicite
height: 100%
permet formellement de calculer le pourcentage de hauteur de l'enfant, tout comme la définitionheight: 100%
dehtml
permet de calculer la hauteur en pourcentage debody
CSS2.1.la source
height:100%
à.flex-2
. Voici le jsfiddle .height: 100%
donne des résultats très étranges pour moi dans Chrome. Il semble que cela entraîne la définition de la "hauteur spécifiée" à la hauteur totale du conteneur , plutôt qu'à la hauteur de l'élément lui-même, ce qui provoque un défilement indésirable lorsque d'autres éléments ont des tailles calculées par rapport à lui.J'ai trouvé la solution par moi-même, supposons que vous ayez le CSS ci-dessous:
Dans ce cas, la définition de la hauteur à 100% ne fonctionnera pas, donc ce que je fais est de définir la
margin-bottom
règleauto
, comme:et l'enfant sera aligné au sommet du parent, vous pouvez également utiliser la
align-self
règle de toute façon si vous préférez.la source
Une idée serait que
display:flex;
avecflex-direction: row;
remplisse lecontainer
div avec.flex-1
et.flex-2
, mais cela ne signifie pas qu'il.flex-2
a une valeur par défautheight:100%;
même s'il est étendu à pleine hauteur et d'avoir un élément enfant (.flex-2-child
) avecheight:100%;
vous devrez définir le parent surheight:100%;
ou utiliserdisplay:flex;
avecflex-direction: row;
sur le.flex-2
div aussi.D'après ce que je sais
display:flex
, la hauteur de tous vos éléments enfants ne sera pas étendue à 100%.Une petite démo, supprimée de la hauteur
.flex-2-child
et utiliséedisplay:flex;
sur.flex-2
: http://jsfiddle.net/2ZDuE/3/la source
html
css
http://jsfiddle.net/2ZDuE/750/
la source
Cela peut également être résolu avec
align-self: stretch;
l'élément que nous voulons étirer.Parfois, il est souhaitable d'étirer un seul élément dans une configuration flexbox.
la source
.récipient { . . . . align-items: étirer; . . . . }
la source
Ceci est ma solution en utilisant css +
Tout d'abord si le premier enfant (flex-1) doit être 100px ne doit pas être flex. Dans css +, en fait, vous pouvez définir des éléments flexibles et / ou statiques (colonnes ou lignes) et votre exemple devient aussi simple que cela:
conteneur css:
et incluent évidemment css + 0.2 core
entendre le violon
la source