Tengo un contenedor div
con dos niños. El primer niño tiene una altura determinada. ¿Cómo puedo hacer que el segundo niño ocupe el "espacio libre" del contenedor div
sin darle una altura específica?
En el ejemplo, el rosa div
debería ocupar también el espacio en blanco.
Similar a esta pregunta: ¿Cómo hacer que div ocupe la altura restante?
Pero no quiero dar una posición absoluta .
Respuestas:
La expansión del
#down
niño para llenar el espacio restante#container
se puede lograr de varias maneras dependiendo de la compatibilidad del navegador que desee lograr y si tiene o no#up
una altura definida.Muestras
Mostrar fragmento de código
Cuadrícula
El
grid
diseño de CSS ofrece otra opción, aunque puede que no sea tan sencillo como el modelo Flexbox. Sin embargo, solo requiere diseñar el elemento contenedor:los
grid-template-rows
define la primera fila como una altura fija de 100px, y las filas restantes se estirarán automáticamente para llenar el espacio restante.Estoy bastante seguro de que IE11 requiere
-ms-
prefijos, así que asegúrese de validar la funcionalidad en los navegadores que desea admitir.Flexbox
El módulo de diseño de caja flexible
flexbox
de CSS3 ( ) ahora está bien soportado y puede ser muy fácil de implementar. Por ser flexible, funciona incluso cuando#up
no tiene una altura definida.Es importante tener en cuenta que el soporte de IE10 e IE11 para algunas propiedades de flexbox puede tener errores, e IE9 o inferior no tiene ningún soporte.
Altura calculada
Otra solución fácil es usar la unidad funcional CSS3
calc
, como señala Álvaro en su respuesta , pero requiere que la altura del primer niño sea un valor conocido:Tiene bastante soporte, con las únicas excepciones notables que son <= IE8 o Safari 5 (sin soporte) e IE9 (soporte parcial). Algunos otros problemas incluyen el uso de calc junto con transform o box-shadow , así que asegúrese de probar en varios navegadores si eso le preocupa.
Otras alternativas
Si se necesita un soporte más antiguo, puede agregar
height:100%;
para#down
que el div rosa sea de altura completa, con una advertencia. Causará un desbordamiento del recipiente, porque lo#up
está empujando hacia abajo.Por lo tanto, podría agregarlo
overflow: hidden;
al contenedor para solucionarlo.Alternativamente, si la altura de
#up
es fija, puede colocarla absolutamente dentro del contenedor y agregarle una tapa acolchada#down
.Y otra opción más sería utilizar una pantalla de mesa:
fuente
position: relative;
posición relativa al contenedor, no a la ventana. Entonces, esa debería ser una opción viable.Han pasado casi dos años desde que hice esta pregunta. Se me ocurrió css calc () que resuelve este problema que tenía y pensé que sería bueno agregarlo en caso de que alguien tenga el mismo problema. (Por cierto, terminé usando la posición absoluta).
http://jsfiddle.net/S8g4E/955/
Aquí está el css
Y más información al respecto aquí: http://css-tricks.com/a-couple-of-use-cases-for-calc/
Soporte del navegador: http://caniuse.com/#feat=calc
fuente
calc
donde la compatibilidad con un navegador amplio no es tan importante (IE8 y versiones inferiores y Safari 5 no lo admiten).#up
altura dinámica ?Mi respuesta usa solo CSS y no usa overflow: hidden o display: table-row. Requiere que el primer niño realmente tenga una altura determinada, pero en su pregunta indica que solo el segundo niño debe tener su altura no especificada, por lo que creo que debería encontrar esto aceptable.
html
css
http://jsfiddle.net/S8g4E/288/
fuente
ver la demostración - http://jsfiddle.net/S8g4E/6/
usar css -
fuente
height: 1px
para#up
asegurarse de que tome la cantidad mínima de altura. Aquí está el soporte del navegador paradisplay: table
: caniuse.com/css-tableA menos que lo esté entendiendo mal, puede agregar
height: 100%;
yoverflow:hidden;
para#down
.Demo en vivo
Editar: Dado que no desea utilizar
overflow:hidden;
, puede utilizardisplay: table;
para este escenario; sin embargo, no se admite antes de IE 8. (display: table;
soporte )Demo en vivo
Nota: ha dicho que desea que la
#down
altura sea la#container
altura menos la#up
altura. Ladisplay:table;
solución hace exactamente eso y este jsfiddle lo retratará con bastante claridad.fuente
overflow:hidden
para ocultar el contenido adicional.Puede usar flotantes para empujar el contenido hacia abajo:
http://jsfiddle.net/S8g4E/5/
Tienes un contenedor de tamaño fijo:
Se permite que el contenido fluya junto a un flotador. A menos que establezcamos el flotador en ancho completo:
Mientras
#up
y#down
comparte la posición superior,#down
el contenido de 'solo puede comenzar después de la parte inferior del flotante#up
:fuente
#up
realidad cubre la parte superior de#down
: jsfiddle.net/thirtydot/S8g4E/9#up
, entonces probablemente sea aceptable.Resumen
No encontré una respuesta completamente satisfactoria, así que tuve que averiguarlo yo mismo.
Mis requisitos:
calc()
no debe usarse ya que el elemento restante no debe saber nada sobre otros tamaños de elementos;La solución
flex-grow: 1
a todos los padres directos con la altura calculada (si corresponde) y el elemento para que ocupen todo el espacio restante cuando el tamaño del contenido del elemento sea menor;flex-shrink: 0
a todos los elementos de flexión con altura fija para que no se reduzca al tamaño del contenido del elemento es más grande que el tamaño del espacio restante;overflow: hidden
a todos los padres directos con altura calculada (si corresponde) para deshabilitar el desplazamiento y prohibir la visualización de contenido desbordado;overflow: auto
que el elemento para permitir el desplazamiento en su interior.JSFiddle (el elemento tiene padres directos con altura calculada)
JSFiddle (caso simple: sin padres directos con altura calculada)
fuente
No estoy seguro de que se pueda hacer únicamente con CSS, a menos que se sienta cómodo fingiéndolo con ilusiones. Tal vez use la respuesta de Josh Mein y configúrelo
#container
enoverflow:hidden
.Por lo que vale, aquí hay una solución jQuery:
fuente