Em um layout de 3 linhas:
- a linha superior deve ser dimensionada de acordo com seu conteúdo
- a linha inferior deve ter uma altura fixa em pixels
- a linha do meio deve se expandir para encher o recipiente
O problema é que, à medida que o conteúdo principal se expande, ele esmaga as linhas de cabeçalho e rodapé:
HTML:
<section>
<header>
header: sized to content
<br>(but is it really?)
</header>
<div>
main content: fills remaining space<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
<!-- uncomment to see it break - ->
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
<!-- -->
</div>
<footer>
footer: fixed height in px
</footer>
</section>
CSS:
section {
display: flex;
flex-flow: column;
align-items: stretch;
height: 300px;
}
header {
flex: 0 1 auto;
background: tomato;
}
div {
flex: 1 1 auto;
background: gold;
overflow: auto;
}
footer {
flex: 0 1 60px;
background: lightgreen;
/* fixes the footer: min-height: 60px; */
}
Violino:
- http://jsfiddle.net/7yLFL/1/ (trabalhando, com conteúdo pequeno)
- http://jsfiddle.net/7yLFL/ (interrompido, com conteúdo maior)
Estou na situação de sorte de poder usar o melhor e o mais recente em CSS, desconsiderando navegadores legados. Eu pensei que poderia usar o layout flexível para finalmente me livrar dos layouts antigos baseados em tabelas. Por alguma razão, não está fazendo o que eu quero ...
Para o registro, há muitas perguntas relacionadas ao SO sobre "preencher a altura restante", mas nada que resolva o problema que estou tendo com o flex. Refs:
- Faça uma div preencher a altura do espaço restante na tela
- Preencha o espaço vertical restante - apenas CSS
- Tem uma div para preencher a altura / largura restante de um contêiner ao compartilhá-lo com outra div?
- Faça o alongamento da div aninhada para 100% da altura restante da div do contêiner
- Como posso fazer com que meu layout flexbox ocupe 100% de espaço vertical?
- etc