Eu tenho um contêiner div
com dois filhos. O primeiro filho tem uma determinada altura. Como faço para que o segundo filho ocupe o "espaço livre" do container div
sem dar uma altura específica?
No exemplo, o rosa div
deve ocupar também o espaço em branco.
Semelhante a esta pergunta: Como fazer div ocupar a altura restante?
Mas não quero dar posição absoluta .
Respostas:
Expandir o
#down
filho para preencher o espaço restante#container
pode ser realizado de várias maneiras, dependendo do suporte do navegador que você deseja alcançar e se#up
tem ou não uma altura definida.Amostras
Exibir trecho de código
Rede
O
grid
layout do CSS oferece outra opção, embora possa não ser tão simples quanto o modelo Flexbox. No entanto, ele requer apenas o estilo do elemento do contêiner:O
grid-template-rows
define a primeira linha como uma altura fixa de 100 px e as linhas restantes se esticarão automaticamente para preencher o espaço restante.Tenho certeza de que o IE11 requer
-ms-
prefixos, então certifique-se de validar a funcionalidade nos navegadores que você deseja oferecer suporte.Flexbox
O Módulo de Layout de Caixa Flexível
flexbox
do CSS3 ( ) agora é bem suportado e pode ser muito fácil de implementar. Por ser flexível, funciona até quando#up
não tem altura definida.É importante observar que o suporte do IE10 e IE11 para algumas propriedades do flexbox pode ser problemático, e o IE9 ou versões anteriores não têm suporte algum.
Altura Calculada
Outra solução fácil é usar a unidade funcional CSS3
calc
, como Alvaro aponta em sua resposta , mas exige que a altura do primeiro filho seja um valor conhecido:É amplamente suportado, com as únicas exceções notáveis sendo <= IE8 ou Safari 5 (sem suporte) e IE9 (suporte parcial). Alguns outros problemas incluem o uso de calc em conjunto com transform ou box-shadow , portanto, certifique-se de testar em vários navegadores se isso for do seu interesse.
Outras Alternativas
Se um suporte mais antigo for necessário, você pode adicionar
height:100%;
para#down
aumentar a altura total do div rosa, com uma ressalva. Isso causará estouro para o contêiner, porque o#up
está empurrando para baixo.Portanto, você pode adicionar
overflow: hidden;
ao contêiner para consertar isso.Alternativamente, se a altura de
#up
for fixa, você pode posicioná-lo absolutamente dentro do contêiner e adicionar uma tampa de preenchimento a#down
.E, ainda outra opção seria usar um display de mesa:
fonte
position: relative;
posiciona em relação ao contêiner, não à janela. Então, essa deve ser uma opção viável.Já se passaram quase dois anos desde que fiz essa pergunta. Acabei de sugerir css calc () que resolve este problema que eu tive e pensei que seria bom adicioná-lo caso alguém tenha o mesmo problema. (Aliás acabei usando a posição absoluta).
http://jsfiddle.net/S8g4E/955/
Aqui está o css
E mais informações sobre isso aqui: http://css-tricks.com/a-couple-of-use-cases-for-calc/
Suporte para navegador: http://caniuse.com/#feat=calc
fonte
calc
onde o amplo suporte a navegadores não é tão importante (IE8 e versões anteriores e Safari 5 não suportam).#up
altura dinâmica ?Minha resposta usa apenas CSS, e não overflow: hidden ou display: table-row. Exige que o primeiro filho realmente tenha uma determinada altura, mas em sua pergunta você afirma que apenas o segundo filho precisa ter sua altura não especificada, então acredito que você deve achar isso aceitável.
html
css
http://jsfiddle.net/S8g4E/288/
fonte
verifique a demonstração - http://jsfiddle.net/S8g4E/6/
use css -
fonte
height: 1px
para#up
garantir que ele tenha o mínimo de altura. Este é o suporte do navegador paradisplay: table
: caniuse.com/css-tableA menos que eu sou mal-entendido, você pode simplesmente adicionar
height: 100%;
eoverflow:hidden;
para#down
.Demonstração ao vivo
Editar: Uma vez que você não deseja usar
overflow:hidden;
, você pode usardisplay: table;
para este cenário; no entanto, não é compatível antes do IE 8. (display: table;
suporte )Demonstração ao vivo
Nota: você disse que deseja que a
#down
altura seja a#container
altura menos a#up
altura. Adisplay:table;
solução faz exatamente isso e este jsfiddle vai retratá-lo muito claramente.fonte
overflow:hidden
a para ocultar o conteúdo extra.Você pode usar flutuadores para empurrar o conteúdo para baixo:
http://jsfiddle.net/S8g4E/5/
Você tem um contêiner de tamanho fixo:
O conteúdo pode fluir próximo a um flutuador. A menos que definamos o flutuador para largura total:
Embora
#up
e#down
compartilhe a posição superior,#down
o conteúdo de só pode começar após a parte inferior do flutuado#up
:fonte
#up
na verdade, cobre a parte superior de#down
: jsfiddle.net/thirtydot/S8g4E/9#up
, provavelmente é aceitável.Resumo
Não encontrei uma resposta totalmente satisfatória, então tive que descobrir sozinho.
Meus requisitos:
calc()
não deve ser usado porque o elemento restante não deve saber nada sobre os tamanhos de outros elementos;A solução
flex-grow: 1
para todos os pais diretos com altura calculada (se houver) e o elemento para que ocupem todo o espaço restante quando o tamanho do conteúdo do elemento for menor;flex-shrink: 0
para todos os itens flexíveis com altura fixa para que não fiquem menores quando o tamanho do conteúdo do elemento for maior que o tamanho do espaço restante;overflow: hidden
para todos os pais diretos com altura calculada (se houver) para desativar a rolagem e proibir a exibição de conteúdo de estouro;overflow: auto
para o elemento para permitir a rolagem dentro dele.JSFiddle (elemento tem pais diretos com altura computada)
JSFiddle (caso simples: sem pais diretos com altura computada)
fonte
Não tenho certeza se isso pode ser feito puramente com CSS, a menos que você se sinta confortável em fingir com ilusões. Talvez use a resposta de Josh Mein e defina
#container
comooverflow:hidden
.Para valer a pena, aqui está uma solução jQuery:
fonte