Ответ 1
Я пытаюсь положить конец путанице:
ul
является элементом уровня блока, который является элементом p
(они растягиваются до 100% от родительской ширины). Поэтому по умолчанию p
будет отображаться ниже ul
, если в этих элементах не объявлена ширина или отображение.
Теперь в вашем примере ul
содержит только плавающие элементы. Это приводит к тому, что он падает до высоты 0px
(он по-прежнему имеет ширину 100%, как вы можете видеть в примере). Прилегающий p
появится справа от плавающего li
, потому что они рассматриваются как обычные плавающие элементы.
Теперь объявление overflow
(любое значение, отличное от visible
) устанавливает новый блок форматирования контекста, что делает ul
содержит его дочерние элементы. Внезапно ul
"снова появляется", не имея размера 0px
. p
приближается к дну. Вы также можете объявить position:absolute
для достижения того же эффекта "очистки" (с побочным эффектом, который теперь ul
выводится из потока нормального элемента - p
будет перекрываться ul
.)
Если вы попали в технический материал, сравните соответствующие параграфы спецификации CSS:
§10.6.3 Незаменяемые элементы уровня блока в нормальном потоке, когда "переполнение" вычисляется до "видимого"
и
§10.6.7 "Авто" высоты для корневого контекста форматирования блоков. (Благодаря BoltClock для выкапывания ссылок).
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 - the float is cleared</p>