cerco di porre fine alla confusione:
ul
è un elemento a livello di blocco così come l'elemento p
(si estendono al 100% della larghezza genitore). Questo è il motivo per cui lo p
per impostazione predefinita verrà visualizzato sotto lo ul
se nessuna larghezza o visualizzazione è dichiarata su tali elementi.
Ora nel tuo esempio lo ul
contiene solo elementi flottanti. Questo lo fa collassare fino a un'altezza di 0px
(ha comunque il 100% della larghezza, come puoi vedere nell'esempio). L'adiacente p
apparirà a destra del float li
s perché sono considerati come normali elementi flottanti.
Ora dichiarando overflow
(qualsiasi valore diverso da visible
) stabilisce un nuovo block formatting context, che rende il ul
contiene i suoi figli. All'improvviso ricompare "ul
", che non ha più la dimensione 0px
. Lo p
viene spinto verso il basso. Potresti anche dichiarare position:absolute
per ottenere lo stesso effetto "clearing" (con l'effetto collaterale che ora lo ul
viene rimosso dal normale flusso di elementi: gli p
s saranno sovrapposti dallo ul
.)
See the example fiddle
Se siete nel materiale tecnico, confrontare i paragrafi secondo della specifica CSS:
§10.6.3 Block-level non-replaced elements in normal flow when 'overflow' computes to 'visible'
e
§10.6.7 'Auto' heights for block formatting context roots. (Grazie a BoltClock per scavare i link).
ul{
list-style-type:none;
margin:0; padding:0;
background-color:#dddddd;
border:2px solid red;
}
li{
float:left;
}
a{
display:block;
width:60px;
background-color:#555;
color:white;
}
p{
margin:0;
outline:2px dotted blue;
}
#two{
clear:both;
overflow:hidden;
}
No overflow:
<ul>
<li><a href="#home">Home</a></li>
<li><a href="#news">News</a></li>
<li><a href="#contact">Contact</a></li>
<li><a href="#about">About</a></li>
</ul>
<p>Notice the collapsed ul - no background-color visible, collapsed border and this paragraph treats the lis as regular floats </p>
<br>
With overflow: hidden
<ul id="two">
<li><a href="#home">Home</a></li>
<li><a href="#news">News</a></li>
<li><a href="#contact">Contact</a></li>
<li><a href="#about">About</a></li>
</ul>
<p>the ul reappeared - it now contains the child li's - the float is cleared</p>
+1 finalmente una risposta ancora migliore;) Si noti che il motivo * perché * 'ul' ha altezza zero quando i figli sono flottati è perché il calcolo dell'altezza del genitore ignora i float poiché non sono nel flusso normale se il genitore non crea un BFC per loro. Confrontare [§10.6.3 Elementi non sostituiti a livello di blocco nel flusso normale quando "overflow" calcola su "visible"] (http://www.w3.org/TR/CSS21/visudet.html#normal-block) con [§10.6.7 'Auto' altezze per le radici del contesto di formattazione dei blocchi] (http://www.w3.org/TR/CSS21/visudet.html#root-height) – BoltClock
@BoltClock Eccellente, stavo cercando questi paragrafi. Grazie per la condivisione! Aggiungerò quelli alla risposta. – Christoph