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
Respostas:
Simplifique: DEMO
Versão em tela cheia
fonte
flex: 1
paraflex-grow: 1
. Obrigado pela solução!O exemplo abaixo inclui o comportamento de rolagem se o conteúdo do componente central expandido ultrapassar seus limites. Além disso, o componente central ocupa 100% do espaço restante na janela de exibição.
jsfiddle aqui
Exemplo de html que pode ser usado para demonstrar esse comportamento
fonte
html
-o do seletor e aplicandoheight: 100vh
-obody
especificamente: jsfiddle.net/pm6nqcqh/1Uma abordagem mais moderna seria usar a propriedade grid.
fonte
Use a
flex-grow
propriedade para o conteúdo principal div e entreguedispaly: flex;
ao pai;fonte
section
altura não é fixa?) Em vez de usarposition: absolute
?position: absolute;
. https://jsfiddle.net/xa26brzf/