Ich versuche, die Verwirrung zu beenden:
ul
ist ein Element auf Blockebene, wie auch das Element (sie erstrecken sich auf 100% der Elternbreite). Deshalb erscheint die p
standardmäßig unter der ul
, wenn für diese Elemente keine Breite oder Anzeige deklariert ist.
Jetzt in Ihrem Beispiel enthält die ul
nur floated Elemente. Dadurch fällt es auf eine Höhe von 0px
(Es hat immer noch 100% Breite, wie Sie in dem Beispiel sehen können). Die angrenzenden werden rechts neben den schwebenden li
s angezeigt, da sie als normal floated Elemente betrachtet werden.
Jetzt overflow
(jeder Wert außer visible
) erklärt, wird eine neue block formatting context, die die ul
enthält seine Kinder macht. Plötzlich erscheint die ul
"wieder", nicht mehr Größe 0px
. Die wird nach unten geschoben. Sie könnten auch position:absolute
deklarieren, um den gleichen "Klärungseffekt" zu erzielen (mit dem Nebeneffekt, dass jetzt der ul
aus dem normalen Elementfluss genommen wird - die s werden vom ul
überlappt.
)
See the example fiddle
Wenn Sie in die technischen Sachen sind, zu vergleichen, die nach den Absätzen der CSS-Spezifikation:
§10.6.3 Block-level non-replaced elements in normal flow when 'overflow' computes to 'visible'
und
§10.6.7 'Auto' heights for block formatting context roots. (Danke an BoltClock für das Ausgraben der Links).
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 endlich eine noch bessere Antwort;) Beachten Sie, dass der Grund * warum * 'ul 'keine Höhe hat, wenn seine Kinder floating sind, weil die Elternhöhenberechnung Floats ignoriert, da sie nicht im normalen Fluss sind, wenn der Elternteil keine erstellt BFC für sie. Vergleichen Sie [§10.6.3 Nicht ersetzte Elemente auf Blockebene im normalen Ablauf, wenn 'Überlauf' zu 'sichtbar' berechnet wird (http://www.w3.org/TR/CSS21/visudet.html#normal-block) mit [§10.6.7 'Auto' Höhen für Block Formatierung Kontext Wurzeln] (http://www.w3.org/TR/CSS21/visudet.html#root-height) – BoltClock
@BoltClock Excellent, suchte ich nach diesen Absätzen. Danke für das Teilen! Ich werde diese zur Antwort hinzufügen. – Christoph