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-2
tiene una altura del 100% (lo cual es extraño porque un elemento flexible tiene un 100% por defecto + tiene errores en Chrome)flex-2-child
tiene 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: stretch
Similar a la respuesta de David Storey, mi solución es:
Alternativamente a
align-items
, puede usaralign-self
solo el.flex-2-child
elemento 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: center
si usaalign-self: stretch
solo un niño.min-height: 100vh;
al.flex-2
elemento 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
stretch
valor predeterminado de laalign-self
propiedad cambia solo el valor utilizado de la "propiedad de tamaño cruzado" del elemento (height
en 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 padresheight
no 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%
dehtml
hace posible calcular la altura porcentaje debody
en 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-bottom
regla enauto
, como:y el niño estará alineado con el superior del padre, también puede usar la
align-self
regla de todos modos si lo prefiere.fuente
Una idea sería que
display:flex;
conflex-direction: row;
está llenando elcontainer
div con.flex-1
y.flex-2
, pero eso no significa que.flex-2
tenga 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-2
div 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-child
y 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