Il piè di pagina appiccicoso di Ryan Fait è molto carino, tuttavia trovo che la sua struttura di base manchi *.
Versione Flexbox
Se sei abbastanza fortunato da poter utilizzare flexbox senza bisogno di supportare browser meno recenti, i piè di pagina appiccicosi diventano banalmente facili e supportano un piè di pagina di dimensioni dinamiche.
Il trucco per far sì che i piè di pagina aderiscano al fondo con flexbox è avere altri elementi nello stesso contenitore che si flettono verticalmente. Tutto ciò che serve è un elemento wrapper a tutta altezza con display: flex
e almeno un fratello con un flex
valore maggiore di 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>
Se non puoi usare flexbox, la mia struttura di base preferita è:
<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>
Che non è poi così lontano da:
<div id="main-wrapper">
<header>
</header>
<nav>
</nav>
<article>
</article>
<footer>
</footer>
</div>
Il trucco per far sì che il piè di pagina rimanga bloccato è di avere il piè di pagina ancorato al riempimento inferiore del suo elemento contenitore. Ciò richiede che l'altezza del piè di pagina sia statica, ma ho scoperto che i piè di pagina sono in genere di altezza statica.
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>
Con il piè di pagina ancorato a #main-wrapper
, ora devi #main-wrapper
essere almeno all'altezza della pagina, a meno che i suoi figli non siano più lunghi. Questo viene fatto facendo #main-wrapper
hanno un min-height
di 100%
. Devi anche ricordare che i suoi genitori html
e body
devono essere alti quanto la pagina.
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>
Ovviamente, dovresti mettere in discussione il mio giudizio, poiché questo codice costringe il piè di pagina a cadere dal fondo della pagina, anche quando non c'è contenuto. L'ultimo trucco è cambiare il modello di scatola usato da in #main-wrapper
modo che il min-height
di 100%
includa l' 100px
imbottitura.
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>
Ed ecco fatto, un piè di pagina appiccicoso con la tua struttura HTML originale. Assicurati solo che footer
's height
sia uguale a #main-wrapper
' padding-bottom
se dovresti essere impostato.
* Il motivo per cui trovo difetti nella struttura di Fait è perché imposta gli elementi .footer
e .header
su diversi livelli gerarchici aggiungendo un .push
elemento non necessario .