Estoy tratando de llenar el espacio vertical de un elemento flexible dentro de un 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>
Y aquí está el JSFiddle
flex-2-child no llena la altura requerida, excepto en los dos casos donde:
flex-2tiene una altura del 100% (lo cual es extraño porque un elemento flexible tiene un 100% por defecto + tiene errores en Chrome)flex-2-childtiene una posición absoluta que también es inconveniente
Esto no funciona en Chrome o Firefox actualmente.

height:100%pero en su lugar están renderizando con altura natural. Y lo extraño es que si cambio su altura aauto, entonces se renderizan comoheight:100%estaba tratando de hacer. Definitivamente no es intuitivo si así es como debería funcionar.Respuestas:
Utilizar
align-items: stretchSimilar a la respuesta de David Storey, mi solución es:
Alternativamente a
align-items, puede usaralign-selfsolo el.flex-2-childelemento que desea estirar.fuente
stretch: esta debería ser la respuesta elegida.height: 100%del componente secundario que desea tener la misma altura que el principalheight: 100%a la respuesta: casi me doy por vencido y solo vi esto en el último momento antes de volver a hacerloabsolute, lo que viene con todo tipo de problemas.He respondido una pregunta similar aquí .
Sé que ya has dicho que
position: absolute;es inconveniente, pero funciona. Consulte a continuación para obtener más información sobre cómo solucionar el problema de cambio de tamaño.También vea este jsFiddle para una demostración, aunque solo he agregado prefijos webkit tan abiertos en Chrome.
Básicamente tiene 2 problemas que trataré por separado.
position: relative;en el padre del niño.position: absolute;en el niño.overflow-y: auto;el div desplazable.height: 0;Consulte esta respuesta para obtener más información sobre el problema del desplazamiento.
fuente
Si entiendo correctamente, ¿quieres que flex-2-child llene la altura y el ancho de su padre, de modo que el área roja esté completamente cubierta por el verde?
Si es así, solo necesita configurar flex-2 para usar flexbox:
Luego dígale a flex-2-child que se vuelva flexible:
Ver http://jsfiddle.net/2ZDuE/10/
La razón es que flex-2-child no es un elemento de flexbox, pero su padre sí lo es.
fuente
align-items: centersi usaalign-self: stretchsolo un niño.min-height: 100vh;al.flex-2elemento para que funcione. ¡Gracias por la ayuda!Supongo que el comportamiento de Chrome es más consistente con la especificación CSS (aunque es menos intuitivo). De acuerdo con las especificaciones de Flexbox, el
stretchvalor predeterminado de laalign-selfpropiedad cambia solo el valor utilizado de la "propiedad de tamaño cruzado" del elemento (heighten este caso). Y, según tengo entendido la especificación CSS2.1 , las alturas porcentuales se calculan a partir del valor especificado de los padresheight, no de su valor utilizado. El valor especificado de los padresheightno se ve afectado por ninguna propiedad flex y sigue siendoauto.Configuración explícitas
height: 100%hace que sea formalmente posible calcular la altura porcentual del niño, al igual que el establecimientoheight: 100%dehtmlhace posible calcular la altura porcentaje debodyen CSS2.1.fuente
height:100%a.flex-2. Aquí está el jsfiddle .height: 100%está dando resultados muy extraños en Chrome. Parece que esto hace que la "altura especificada" se establezca en la altura total del contenedor , en lugar de la altura del elemento en sí, por lo que se produce un desplazamiento no deseado cuando otros elementos tienen tamaños calculados en relación con él.Encontré la solución por mí mismo, supongamos que tiene el CSS a continuación:
En este caso, establecer la altura al 100% no funcionará, así que lo que hago es establecer la
margin-bottomregla enauto, como:y el niño estará alineado con el superior del padre, también puede usar la
align-selfregla de todos modos si lo prefiere.fuente
Una idea sería que
display:flex;conflex-direction: row;está llenando elcontainerdiv con.flex-1y.flex-2, pero eso no significa que.flex-2tenga un valor predeterminado,height:100%;incluso si se extiende a toda su altura y para tener un elemento hijo (.flex-2-child) con elheight:100%;que deberá establecer el padreheight:100%;o usardisplay:flex;conflex-direction: row;en el.flex-2div también.Por lo que sé
display:flex, no se extenderá la altura de todos los elementos secundarios al 100%.Una pequeña demostración, eliminó la altura
.flex-2-childy se usódisplay:flex;en.flex-2: http://jsfiddle.net/2ZDuE/3/fuente
html
css
http://jsfiddle.net/2ZDuE/750/
fuente
Esto también se puede resolver con
align-self: stretch;el elemento que queremos estirar.A veces es deseable estirar solo un elemento en una configuración de flexbox.
fuente
.envase { . . . . elementos de alineación: estiramiento; . . . . }
fuente
Esta es mi solución usando css +
En primer lugar, si el primer hijo (flex-1) debería ser 100 px, no debería ser flex. En css +, de hecho, puede configurar elementos flexibles y / o estáticos (columnas o filas) y su ejemplo se vuelve tan fácil como esto:
contenedor css:
y obviamente incluye css + 0.2 core
escuchar el violín
fuente