HTML, CSS e tutto il resto
In questo articolo precedente, che riguardava i modi per ottimizzare il nostro CSS per rendere uniforme la visualizzazione del nostro sito su tutti i maggiori browser, abbiamo affrontato il bug di IE6 che riguarda l’altezza di un blocco contenente dei blocchi flottanti. Dato che questo comportamento errato del browser è uno dei primi problemi a cui un webdesigner deve fare fronte, e spesso risulta incomprensibile, facciamo il punto della situazione e vediamo tutte le soluzioni possibili.
Ma prima, partiamo dal problema.
Dobbiamo realizzare un layout che preveda una impaginazione a due colonne e un footer: assegnamo ai nostri blocchi la proprietà float: left, definiamo una larghezza per entrambi in modo tale che non superi la larghezza del blocco contenitore, inseriamo il footer, cui assegnamo la proprietà clear: both e se abbiamo fatto tutto senza errori dovremmo ottenere cioò che ci aspettiamo, cioè che l’altezza del contenitore si adatta a quella dei blocchi flottanti, e invece in tutti i browser (tranne che in IE6, che apparentemente, si comporta correttamente) l’altezza del contenitore non varia, in quanto i blocchi flottanti sono a tutti gli effetti sottratti dal flusso della pagina.
Questo comportamento, che potrebbe sembrare assurdo, ha in realtà una spiegazione: esso è necessario per gestire, per esempio, l’altezza di paragrafi contenenti immagini flottanti. Se l’altezza del paragrafo fosse determinata dall’altezza dell’immagine flottante, il testo del successivo paragrafo non potrebbe salire e disporsi attorno all’immagine stessa. Non è ancora chiaro? Ecco una pagina di esempio con il comportamento corretto e quello errato.
Ecco di seguito i fix per fare in modo che tutti i browser abbiano un comportamento uniforme:
Questa tecnica ristabilisce il normale flusso della pagina inserendo dopo gli elementi flottanti un elemento vuoto con proprietà clear: both. Il punto debole di questa tecnica è l’inserimento in pagina di un elemento con valore semantico pari a zero. Ecco un esempio:
<div id="contenitore">
<div class="floatLeft">Contenuto del blocco</div>
<div class="floatLeft">Contenuto del blocco</div>
<div class="clearBoth"><!-- --></div>
</div>
Ed ecco come impostare correttamente i CSS:
#contenitore {
width:700px;
background:#C30;
}
.floatLeft {
float:left;
background:#0C0;
color:#FFF;
padding:20px;
width:50px;
margin:0 50px 0 0;
}
.clearBoth {
clear:both;
}
Utiliziamo la pseudoclasse :after per aggiungere un "punto invisibile" al termine del contenitore:
<style type="text/css">
.clearfix:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.clearfix { /* for IE/Mac */
display: inline-block;
}
</style><!-- main stylesheet ends, CC with new stylesheet below... -->
<!--[if IE]>
<style type="text/css">
.clearfix {
zoom: 1; /* triggers hasLayout */
display: block; /* resets display for IE/Win */
} /* Only IE can see inside the conditional comment
and read this CSS rule. Don't ever use a normal HTML
comment inside the CC or it will close prematurely. */
</style> <![endif]-->
Ecco la pagina di esempio.
Ecco la soluzione più semplice:
Di seguito il codice css…
div.container {
border: 1px solid #000000;
overflow: hidden;
width: 100%;
}
div.left {
width: 45%;
float: left;
}
div.right {
width: 45%;
float: right;
}
…ecco la pagina di esempio.
All About Floats: What is “Float” and What are floats used for?
The Mystery Of The CSS Float Property
Simple clearing of floats
Clearing floats
Tre proprietà speciali: display, float clear
How To Clear Floats Without Structural Markup
Questo blog si offre come spazio di condivisione e conoscenza per tutti i webdesigner principianti che aspirano ad allargare le proprie conoscenze su html e css.

2 commenti a CSS e float: blocchi flottanti e altezza del contenitore. Le soluzioni
Federico Armand
aprile 27th, 2010 at 11:10
Nel listato
Contenuto del blocco
Contenuto del blocco
mancano i simboli di uguale tra gli attributi e i valori tra virgolette.
inoltre la classe usata nei css è clearfix e qui clearboth.
non funzionerà mai!
Giacomo Paita
aprile 27th, 2010 at 18:44
Ciao Federico, grazie per la segnalazione! In effetti avevo scritto male il codice. Adesso l’ho corretto e funziona. :-) A presto! Giac