Le pied de page collant de Ryan Fait est très agréable, mais je trouve que sa structure de base fait défaut *.
Version Flexbox
Si vous avez la chance d'utiliser flexbox sans avoir à prendre en charge les anciens navigateurs, les pieds de page collants deviennent trivialement faciles et prennent en charge un pied de page de taille dynamique.
L'astuce pour que les pieds de page collent au fond avec flexbox est d'avoir d'autres éléments dans le même conteneur fléchis verticalement. Tout ce qu'il faut, c'est un élément wrapper pleine hauteur avec display: flex
et au moins un frère avec une flex
valeur supérieure à 0
:
CSS:
html,
body {
height: 100%;
margin: 0;
padding: 0;
}
#main-wrapper {
display: flex;
flex-direction: column;
min-height: 100%;
}
article {
flex: 1;
}
html,
body {
height: 100%;
margin: 0;
padding: 0;
}
#main-wrapper {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
min-height: 100%;
}
article {
-webkit-box-flex: 1;
-ms-flex: 1;
flex: 1;
}
header {
background-color: #F00;
}
nav {
background-color: #FF0;
}
article {
background-color: #0F0;
}
footer {
background-color: #00F;
}
<div id="main-wrapper">
<header>
here be header
</header>
<nav>
</nav>
<article>
here be content
</article>
<footer>
here be footer
</footer>
</div>
Si vous ne pouvez pas utiliser flexbox, ma structure de base de choix est:
<div class="page">
<div class="page__inner">
<header class="header">
<div class="header__inner">
</div>
</header>
<nav class="nav">
<div class="nav__inner">
</div>
</nav>
<main class="wrapper">
<div class="wrapper__inner">
<div class="content">
<div class="content__inner">
</div>
</div>
<div class="sidebar">
<div class="sidebar__inner">
</div>
</div>
</div>
</main>
<footer class="footer">
<div class="footer__inner">
</div>
</footer>
</div>
</div>
Ce qui n'est pas si loin de:
<div id="main-wrapper">
<header>
</header>
<nav>
</nav>
<article>
</article>
<footer>
</footer>
</div>
L'astuce pour faire coller le pied de page consiste à ancrer le pied de page au rembourrage inférieur de son élément conteneur. Cela nécessite que la hauteur du pied de page soit statique, mais j'ai constaté que les pieds de page sont généralement de hauteur statique.
HTML:
<div id="main-wrapper">
...
<footer>
</footer>
</div>
CSS:
#main-wrapper {
padding: 0 0 100px;
position: relative;
}
footer {
bottom: 0;
height: 100px;
left: 0;
position: absolute;
width: 100%;
}
#main-wrapper {
padding: 0 0 100px;
position: relative;
}
footer {
bottom: 0;
height: 100px;
left: 0;
position: absolute;
width: 100%;
}
header {
background-color: #F00;
}
nav {
background-color: #FF0;
}
article {
background-color: #0F0;
}
footer {
background-color: #00F;
}
<div id="main-wrapper">
<header>
here be header
</header>
<nav>
</nav>
<article>
here be content
</article>
<footer>
here be footer
</footer>
</div>
Avec le pied de page ancré à #main-wrapper
, vous devez maintenant avoir #main-wrapper
au moins la hauteur de la page, sauf si ses enfants sont plus longs. Cela se fait en faisant #main-wrapper
avoir un min-height
fichier 100%
. Vous avez également de se rappeler que ses parents, html
et body
doivent être aussi grand que la page ainsi.
CSS:
html,
body {
height: 100%;
margin: 0;
padding: 0;
}
#main-wrapper {
min-height: 100%;
padding: 0 0 100px;
position: relative;
}
footer {
bottom: 0;
height: 100px;
left: 0;
position: absolute;
width: 100%;
}
html,
body {
height: 100%;
margin: 0;
padding: 0;
}
#main-wrapper {
min-height: 100%;
padding: 0 0 100px;
position: relative;
}
footer {
bottom: 0;
height: 100px;
left: 0;
position: absolute;
width: 100%;
}
header {
background-color: #F00;
}
nav {
background-color: #FF0;
}
article {
background-color: #0F0;
}
footer {
background-color: #00F;
}
<div id="main-wrapper">
<header>
here be header
</header>
<nav>
</nav>
<article>
here be content
</article>
<footer>
here be footer
</footer>
</div>
Bien sûr, vous devriez remettre en question mon jugement, car ce code force le pied de page à tomber du bas de la page, même en l'absence de contenu. La dernière astuce consiste à changer le modèle de boîte utilisé par le #main-wrapper
afin que le min-height
de 100%
inclut le 100px
remplissage.
CSS:
html,
body {
height: 100%;
margin: 0;
padding: 0;
}
#main-wrapper {
box-sizing: border-box;
min-height: 100%;
padding: 0 0 100px;
position: relative;
}
footer {
bottom: 0;
height: 100px;
left: 0;
position: absolute;
width: 100%;
}
html,
body {
height: 100%;
margin: 0;
padding: 0;
}
#main-wrapper {
box-sizing: border-box;
min-height: 100%;
padding: 0 0 100px;
position: relative;
}
footer {
bottom: 0;
height: 100px;
left: 0;
position: absolute;
width: 100%;
}
header {
background-color: #F00;
}
nav {
background-color: #FF0;
}
article {
background-color: #0F0;
}
footer {
background-color: #00F;
}
<div id="main-wrapper">
<header>
here be header
</header>
<nav>
</nav>
<article>
here be content
</article>
<footer>
here be footer
</footer>
</div>
Et là vous l'avez, un pied de page collant avec votre structure HTML d'origine. Assurez-vous simplement que le footer
's height
est égal à #main-wrapper
' s padding-bottom
, et vous devriez être défini.
* La raison pour laquelle je trouve à redire à la structure de Fait est qu'elle définit les éléments .footer
et .header
sur différents niveaux hiérarchiques tout en ajoutant un .push
élément inutile .