Eu só quero acrescentar - a maioria das outras respostas funcionou bem para mim; no entanto, demorou muito tempo para fazê-los funcionar!
Isso ocorre porque a configuração height: 100%
apenas pega a altura da div pai!
Portanto, se todo o seu html (dentro do corpo) se parecer com o seguinte:
<div id="holder">
<header>.....</header>
<div id="body">....</div>
<footer>....</footer>
</div>
Então, o seguinte ficará bem:
html,body{
height: 100%
}
#holder{
min-height: 100%;
position:relative;
}
#body{
padding-bottom: 100px; /* height of footer */
}
footer{
height: 100px;
width:100%;
position: absolute;
left: 0;
bottom: 0;
}
... como "suporte" pegará sua altura diretamente do "corpo".
Parabéns ao My Head Hurts, cuja resposta foi a que acabei por começar a trabalhar!
Contudo. Se o seu html estiver mais aninhado (porque é apenas um elemento da página inteira, ou está dentro de uma determinada coluna, etc.), você precisa garantir que todos os elementos contidos também tenham sido height: 100%
definidos na div. Caso contrário, as informações de altura serão perdidas entre "corpo" e "suporte".
Por exemplo, a seguir, onde adicionei a classe "altura total" a todas as div para garantir que a altura desça até os elementos de cabeçalho / corpo / rodapé:
<div class="full-height">
<div class="container full-height">
<div id="holder">
<header>.....</header>
<div id="body">....</div>
<footer>....</footer>
</div>
</div>
</div>
E lembre-se de definir a altura na classe de altura total no css:
#full-height{
height: 100%;
}
Isso corrigiu meus problemas!
position:fixed
, no entanto, que não será exatamente a melhor maneira de fazê-lo