Footer sempre in fondo

Il footer, per definizione, è quell’elemento che chiude la pagina e si pone alla fine dei contenuti. Quando però il contenuto è più corto dello spazio disponibile a video – il viewport – il footer si “solleva” dal bordo inferiore della pagina, lasciando uno spazio più o meno grande al di sotto di esso. L’effetto in certi casi può essere poco gradevole, dando l’impressione di un layout “tagliato a metà”. Potete vedere qui un esempio

Il footer dovrebbe invece disporsi allineato al bordo inferiore della pagina nel caso citato, mentre dovrebbe posizionarsi in fondo al contenuto, oltre lo scroll, se questo è sufficientemente lungo da riempire tutto il viewport. Per farvi un’idea date un’occhiata qui e qui.

Una soluzione valida, compatibile con tutti i moderni browser, è quella di utilizzare la proprietà css min-height per imporre l’altezza minima del contenuto tale da farlo ampliare fino a riempire con il viewport.

Ma procediamo con ordine. Il layout standard potrebbe essere questo:

<body>
    <div id="container">
            <div id="header">
                 Header
            </div>
           <div id="content">
                 Content
            </div>
    </div>
    <div id="footer">
        Footer
    </div>
</body>

Tramite css impostiamo l’altezza minima del container al 100% in modo da farlo occupare tutto lo spazio verticale disponibile. L’altezza viene però calcolata in base a quella degli elementi contenenti il div, quindi dobbiamo impostare al 100% sia il tag body che il tag html:

html, body {
    height:100%;
}

#container {
    min-height:100%;
}

In questo modo però il footer andrà a posizionarsi fuori dall’area visibile (oltre il 100%, per intendersi): occorre quindi recuperare lo spazio necessario. Per farlo utilizziamo un semplice margine negativo pari all’altezza voluta del footer (in pixel o em, come preferite):

html, body {
    height:100%;
}

#container {
    min-height:100%;
    margin-bottom:-100px;
}

Ora però dobbiamo impedire al contenuto di finire sotto al footer che abbiamo portato in primo piano. Aggiungiamo perciò un padding inferiore al content in modo da distanziarlo a sufficienza: è importante quindi che abbia almeno lo stesso valore. Se vogliamo aggiungere un ulteriore spazio basta addizionarlo: (ad es. 110px per un padding inferiore apparente di 10px).

html, body {
    height:100%;
}

#container {
    min-height:100%;
    margin-bottom:-100px;
}

#content {
    padding-bottom:100px;
}

Se provate la pagina con un browser come Firefox o Safari noterete che abbiamo già ottenuto l’effetto desiderato. La proprietà min-height però non è supportata da Internet Explorer 6. Possiamo risolvere facilmente con il noto l’hack che utilizza la proprietà !important. Aggiorniamo quindi il css ed abbiamo finito:

#body {
    height:100%;
}

#container {
    min-height:100%;
height:auto !important; /*per gli altri browser*/
height:100%; /*per IE 6*/ margin-bottom:-100px; } #content { padding-bottom:100px; }

Ecco quindi l’esempio finito con poco o molto contenuto. Potete in alternativa scaricare lo zip con i sorgenti.
Ho aggiunto qualche altra istruzione per evidenziare header e footer, ma il css di base è lo stesso.

5 Comments so far

  1. yaka on novembre 6th, 2008

    Bellissimo tutorial!

    Complimenti! ;)

  2. andrea on gennaio 29th, 2009

    fantastico, finalmente qulcuno che fa degli esempi quando spiega qualcosa, grazie mille!!

  3. raffaello on maggio 28th, 2009

    Sembra che funzioni e da paura anche!!
    Ho visto molti post sull’argomento e le soluzioni che funzionano meglio sono super-arzigogolate, qui invece funziona alla grande ed è super semplice.

    Bravo, grazie

  4. cris on novembre 10th, 2010

    complimenti per il tutorial… spiegato benissimo con esempi espliciti… ho provato altri tutorial non ci sono riuscito con questo funziona tutto grande

  5. Francesco Paggin on novembre 11th, 2010

    Grazie dei commenti, sono felice di esservi utile!

Leave a reply