tôi cố gắng để chấm dứt sự nhầm lẫn:
ul
là phần tử cấp khối là phần tử p
(chúng kéo dài đến 100% chiều rộng của bố mẹ). Đó là lý do tại sao theo mặc định, p
sẽ xuất hiện bên dưới ul
nếu không có chiều rộng hoặc hiển thị nào được khai báo trên các yếu tố đó.
Bây giờ trong ví dụ của bạn, ul
chỉ chứa các phần tử nổi. Điều này làm cho nó sụp đổ đến độ cao 0px
(Nó vẫn có chiều rộng 100% mặc dù bạn có thể thấy trong ví dụ). Các p
liền kề sẽ xuất hiện ở bên phải của các float li
s bởi vì chúng được coi là các phần tử lưu hành bình thường.
Bây giờ khai báo overflow
(bất kỳ giá trị nào khác ngoài visible
) thiết lập block formatting context mới, làm cho số ul
chứa con của nó. Đột nhiên, ul
"xuất hiện trở lại", không còn kích thước 0px
nữa. p
bị đẩy xuống đáy. Bạn cũng có thể khai báo position:absolute
để đạt được cùng hiệu ứng "thanh toán bù trừ" (với hiệu ứng phụ hiện tại là ul
được lấy ra khỏi luồng yếu tố thông thường - p
s sẽ bị chồng chéo bởi ul
.)
See the example fiddle
Nếu bạn là thành công cụ kỹ thuật, so sánh các đoạn theo của spec CSS:
§10.6.3 Block-level non-replaced elements in normal flow when 'overflow' computes to 'visible'
và
§10.6.7 'Auto' heights for block formatting context roots. (Cám ơn BoltClock đã đào các liên kết).
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 cuối cùng là một câu trả lời tốt hơn;) Lưu ý rằng lý do * tại sao * 'ul' có chiều cao bằng không khi con của nó được thả nổi là vì tính toán chiều cao của cha bỏ qua phao vì chúng không ở lưu lượng bình thường nếu cha mẹ không tạo ra BFC cho họ. So sánh [§10.6.3 Các phần tử không thay thế cấp khối trong luồng thông thường khi 'tràn' tính toán thành 'hiển thị'] (http://www.w3.org/TR/CSS21/visudet.html#normal-block) với [§10.6.7 'Tự động' chiều cao cho bối cảnh định dạng khối bối cảnh] (http://www.w3.org/TR/CSS21/visudet.html#root-height) – BoltClock
@BoltClock Tuyệt vời, tôi đã tìm kiếm các đoạn văn này. Cám ơn vì đã chia sẻ! Tôi sẽ thêm chúng vào câu trả lời. – Christoph