Eu tenho um elemento de cabeçalho e um elemento de conteúdo:
#header
#content
Quero que o cabeçalho tenha altura fixa e o conteúdo preencha toda a altura restante disponível na tela, com overflow-y: scroll;
.
Isso é possível sem Javascript?
Eu tenho um elemento de cabeçalho e um elemento de conteúdo:
#header
#content
Quero que o cabeçalho tenha altura fixa e o conteúdo preencha toda a altura restante disponível na tela, com overflow-y: scroll;
.
Isso é possível sem Javascript?
Respostas:
O truque para isso é especificar 100% de altura nos elementos html e body. Alguns navegadores procuram os elementos pais (html, corpo) para calcular a altura.
<html>
<body>
<div id="Header">
</div>
<div id="Content">
</div>
</body>
</html>
html, body
{
height: 100%;
}
#Header
{
width: 960px;
height: 150px;
}
#Content
{
height: 100%;
width: 960px;
}
esqueça todas as respostas, esta linha de CSS funcionou para mim em 2 segundos:
height:100vh;
1vh
= 1% da altura da tela do navegador
Para escalonamento de layout responsivo, você pode usar:
min-height: 100vh
[atualização de novembro de 2018] Conforme mencionado nos comentários, usar a altura mínima pode evitar problemas em designs reativos
[atualização de abril de 2018] Conforme mencionado nos comentários, em 2011, quando a pergunta foi feita, nem todos os navegadores suportavam as unidades de janela de visualização. As outras respostas foram as soluções da época - vmax
ainda não é compatível com o IE, então essa pode não ser a melhor solução para todos ainda.
min-height: 100vh
seria muito melhor. Também seria escalonado para designs responsivos.
Na verdade, a melhor abordagem é esta:
html {
height:100%;
}
body {
min-height:100%;
}
Isso resolve tudo para mim e me ajuda a controlar meu rodapé e pode ter o rodapé fixo, não importa se a página está sendo rolada para baixo.
Solução Técnica - EDITADA
Historicamente, 'altura' é algo complicado de se moldar, em comparação com 'largura', a mais fácil. Já que o css foca <body>
para que o estilo funcione. O código acima - demos <html>
e <body>
uma altura. É aqui que a mágica entra em cena - uma vez que temos 'altura mínima' na mesa de jogo, estamos dizendo ao navegador que <body>
é superior <html>
porque <body>
mantém a altura mínima. Este por sua vez, permite <body>
anular <html>
porque <html>
já tinha altura anterior. Em outras palavras, estamos enganando o navegador para "bater" <html>
fora da mesa, para que possamos estilizar de forma independente.
min-height
e height
?
<body>
para que o estilo funcione. Este código: demos <html>
e <body>
uma altura. É aqui que a mágica entra em cena - uma vez que temos 'altura mínima' na mesa de jogo, estamos dizendo ao servidor que <body>
é superior <html>
porque <body>
mantém a altura mínima. Este por sua vez, permite <body>
anular <html>
porque <html>
já tinha altura anterior. Em outras palavras, estamos enganando o servidor para "bater" <html>
fora da mesa, para que possamos estilizar de forma independente.
Você pode usar vh na propriedade min-height.
min-height: 100vh;
Você pode fazer o seguinte, dependendo de como você está usando as margens ...
min-height: calc(100vh - 10px) //Considering you're using some 10px margin top on an outside element
A solução aceita realmente não funcionará. Você notará que o conteúdo div
será igual à altura de seu pai body
,. Portanto, definir a body
altura 100%
como igual à altura da janela do navegador. Digamos que a janela do navegador tenha a 768px
altura, ao definir a div
altura do conteúdo para 100%
, a div
altura de será 768px
. Assim, você terminará com o div de cabeçalho 150px
e o div de conteúdo 768px
. No final, você terá conteúdo 150px
abaixo da parte inferior da página. Para outra solução, verifique este link.
Com HTML5, você pode fazer isso:
CSS:
body, html{ width:100%; height:100%; padding: 0; margin: 0;}
header{ width:100%; height: 70px; }
section{ width: 100%; height: calc(100% - 70px);}
HTML:
<header>blabablalba </header>
<section> Content </section>
Para mim, o próximo funcionou bem:
Eu envolvi o cabeçalho e o conteúdo em um div
<div class="main-wrapper">
<div class="header">
</div>
<div class="content">
</div>
</div>
Usei essa referência para preencher a altura com flexbox. O CSS funciona assim:
.main-wrapper {
display: flex;
flex-direction: column;
min-height: 100vh;
}
.header {
flex: 1;
}
.content {
flex: 1;
}
Para obter mais informações sobre a técnica flexbox, visite a referência
Você também pode definir o pai como display: inline
. Vejo http://codepen.io/tommymarshall/pen/cECyH
Certifique-se de ter a altura do html e do corpo configurada para 100% também.
A resposta aceita não funciona. E a resposta com maior votação não responde à pergunta real. Com um cabeçalho de altura de pixel fixa e um preenchimento na exibição restante do navegador, role para owerflow. Aqui está uma solução que realmente funciona, usando posicionamento absoluto. Também suponho que a altura do cabeçalho seja conhecida, pelo som de "cabeçalho fixo" na questão. Eu uso 150px como exemplo aqui:
HTML:
<html>
<body>
<div id="Header">
</div>
<div id="Content">
</div>
</body>
</html>
CSS: (adicionando cor de fundo apenas para efeito visual)
#Header
{
height: 150px;
width: 100%;
background-color: #ddd;
}
#Content
{
position: absolute;
width: 100%;
top: 150px;
bottom: 0;
background-color: #aaa;
overflow-y: scroll;
}
Para uma visão mais detalhada de como isso funciona, com conteúdo real dentro do #Content
, dê uma olhada neste jsfiddle , usando linhas e colunas de bootstrap.
bottom
propriedade certificou-se de que o #Content
permanece preso no final da página. Agradeço por ter dispensado um tempo para explicar isso.
Neste caso, quero que meu div de conteúdo principal tenha altura líquida para que a página inteira ocupe 100% da altura do navegador.
height: 100vh;
Deixe-me adicionar meus 5 centavos aqui e oferecer uma solução clássica:
html {height:100%;}
body {height:100%; margin:0;}
#idOuter {position:relative; width:100%; height:100%;}
#idHeader {position:absolute; left:0; right:0; border:solid 3px red;}
#idContent {position:absolute; overflow-y:scroll; left:0; right:0; border:solid 3px green;}
<div id="idOuter">
<div id="idHeader" style="height:30px; top:0;">Header section</div>
<div id="idContent" style="top:36px; bottom:0;">Content section</div>
</div>
Isso funcionará em todos os navegadores, sem script, sem flex. Abra o snippet no modo de página inteira e redimensione o navegador: as proporções desejadas são preservadas mesmo no modo de tela inteira.
idHeader.height
e idContent.top
são ajustados para incluir a borda e devem ter o mesmo valor se a borda não for usada. Caso contrário, os elementos sairão da janela de visualização, já que a largura calculada não inclui borda, margem e / ou preenchimento.left:0; right:0;
pode ser substituído pelo width:100%
mesmo motivo, se nenhuma borda for usada.padding-top
e / ou
padding-bottom
atributos ao #idOuter
elemento.Para completar minha resposta, aqui está o layout do rodapé:
html {height:100%;}
body {height:100%; margin:0;}
#idOuter {position:relative; width:100%; height:100%;}
#idContent {position:absolute; overflow-y:scroll; left:0; right:0; border:solid 3px green;}
#idFooter {position:absolute; left:0; right:0; border:solid 3px blue;}
<div id="idOuter">
<div id="idContent" style="bottom:36px; top:0;">Content section</div>
<div id="idFooter" style="height:30px; bottom:0;">Footer section</div>
</div>
E aqui está o layout com cabeçalho e rodapé:
html {height:100%;}
body {height:100%; margin:0;}
#idOuter {position:relative; width:100%; height:100%;}
#idHeader {position:absolute; left:0; right:0; border:solid 3px red;}
#idContent {position:absolute; overflow-y:scroll; left:0; right:0; border:solid 3px green;}
#idFooter {position:absolute; left:0; right:0; border:solid 3px blue;}
<div id="idOuter">
<div id="idHeader" style="height:30px; top:0;">Header section</div>
<div id="idContent" style="top:36px; bottom:36px;">Content section</div>
<div id="idFooter" style="height:30px; bottom:0;">Footer section</div>
</div>
A menos que você precise oferecer suporte ao IE 9 e inferior, eu usaria o flexbox
body { display: flex; flex-direction: column; }
.header { height: 70px; }
.content { flex: 1 1 0 }
Você também precisa obter o corpo para preencher a página inteira
body, html{ width:100%; height:100%; padding: 0; margin: 0;}
CSS PLaY | cross browser cabeçalho fixo / rodapé / layout de coluna única centralizado
Quadros CSS, versão 2: Exemplo 2, largura especificada | 456 Berea Street
Uma coisa importante é que, embora pareça fácil, haverá um pouco de código feio entrando em seu arquivo CSS para obter um efeito como este. Infelizmente, é realmente a única opção.
#Header
{
width: 960px;
height: 150px;
}
#Content
{
min-height:100vh;
height: 100%;
width: 960px;
}
A melhor solução que encontrei até agora é definir um elemento de rodapé na parte inferior da página e, em seguida, avaliar a diferença entre o deslocamento do rodapé e o elemento que precisamos expandir. por exemplo
<div id="contents"></div>
<div id="footer"></div>
#footer {
position: fixed;
bottom: 0;
width: 100%;
}
var contents = $('#contents');
var footer = $('#footer');
contents.css('height', (footer.offset().top - contents.offset().top) + 'px');
Você também pode querer atualizar a altura do elemento de conteúdo em cada redimensionamento da janela, então ...
$(window).on('resize', function() {
contents.css('height', (footer.offset().top -contents.offset().top) + 'px');
});
Você já tentou algo assim?
CSS:
.content {
height: 100%;
display: block;
}
HTML:
<div class=".content">
<!-- Content goes here -->
</div>