staram się zakończyć zamieszanie:
ul
to element blokowy, podobnie jak element p
(rozciągają się do 100% szerokości nadrzędnej). Dlatego domyślnie p
pojawi się poniżej ul
, jeśli żadna szerokość ani wyświetlacz nie jest zadeklarowany dla tych elementów.
Teraz w twoim przykładzie ul
zawiera tylko elementy pływające. Powoduje to, że zwinięty na wysokość 0px
(nadal ma 100% szerokości, jak widać w przykładzie). Sąsiednie p
pojawi się na prawo od pływających li
s, ponieważ są one uważane za normalne elementy pływające.
Teraz deklarując overflow
(wartość inna niż visible
) ustanawia nowy block formatting context, co czyni ul
zawiera swoje dzieci. Nagle ponownie "pojawia się" ul
, nie mając już rozmiaru 0px
. p
zostaje przesunięty na sam dół. Można również zadeklarować position:absolute
, aby uzyskać ten sam efekt "czyszczenia" (z efektem ubocznym, że teraz ul
jest wyjęty z przepływu normalnego elementu - p
s zostanie nałożony przez ul
.)
See the example fiddle
Jeśli do technicznych rzeczy, porównaj według akapitów specyfikacji CSS:
§10.6.3 Block-level non-replaced elements in normal flow when 'overflow' computes to 'visible'
i
§10.6.7 'Auto' heights for block formatting context roots. (Dzięki BoltClock za wykopanie linków).
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 wreszcie jeszcze lepszą odpowiedź;) Zwróć uwagę, że powodem * dlaczego * 'ul' ma zerową wysokość, gdy jego dzieci są pływające, ponieważ obliczenie wysokości rodziców ignoruje pływaki, ponieważ nie są one w normalnym przepływie, jeśli rodzic nie tworzy BFC dla nich. Porównaj [§10.6.3 Elementy niezastąpione na poziomie bloku w normalnym przepływie, gdy "przelew" zostanie obliczony jako "widoczny"] (http://www.w3.org/TR/CSS21/visudet.html#normal-block) z [§10.6.7 "Auto" wysokości dla kontekstowego kontekstu korzenia blokowego] (http://www.w3.org/TR/CSS21/visudet.html#root-height) – BoltClock
@BoltClock Doskonale, szukałem tych akapitów. Dzięki za udostępnienie! Dodam je do odpowiedzi. – Christoph