Tengo un contenedor divcon 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 divsin darle una altura específica?
En el ejemplo, el rosa divdeberí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
#downniño para llenar el espacio restante#containerse puede lograr de varias maneras dependiendo de la compatibilidad del navegador que desee lograr y si tiene o no#upuna altura definida.Muestras
Mostrar fragmento de código
Cuadrícula
El
griddiseñ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-rowsdefine 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
flexboxde CSS3 ( ) ahora está bien soportado y puede ser muy fácil de implementar. Por ser flexible, funciona incluso cuando#upno 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#downque el div rosa sea de altura completa, con una advertencia. Causará un desbordamiento del recipiente, porque lo#upestá empujando hacia abajo.Por lo tanto, podría agregarlo
overflow: hidden;al contenedor para solucionarlo.Alternativamente, si la altura de
#upes 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
calcdonde la compatibilidad con un navegador amplio no es tan importante (IE8 y versiones inferiores y Safari 5 no lo admiten).#upaltura 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: 1pxpara#upasegurarse 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
#downaltura sea la#containeraltura menos la#upaltura. Ladisplay:table;solución hace exactamente eso y este jsfiddle lo retratará con bastante claridad.fuente
overflow:hiddenpara 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
#upy#downcomparte la posición superior,#downel contenido de 'solo puede comenzar después de la parte inferior del flotante#up:fuente
#uprealidad 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: 1a 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: 0a 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: hiddena todos los padres directos con altura calculada (si corresponde) para deshabilitar el desplazamiento y prohibir la visualización de contenido desbordado;overflow: autoque 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
#containerenoverflow:hidden.Por lo que vale, aquí hay una solución jQuery:
fuente