2013-04-16 43 views
14

Tôi đọc số following code on w3schools và không hiểu cách thuộc tính overflow sẽ tác động đến việc văn bản có xuất hiện ở bên phải của ul hay không.Lỗi tràn CSS: bị ẩn với phao

ul { 
 
    list-style-type: none; 
 
    margin: 0; 
 
    padding: 0; 
 
    overflow: hidden; 
 
} 
 

 
li { 
 
    float: left; 
 
} 
 

 
a { 
 
    display: block; 
 
    width: 60px; 
 
    background-color: #dddddd; 
 
    padding: 8px; 
 
}
<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><b>Note:</b> overflow:hidden is added to the ul element to prevent li elements from going outside of the list.</p>

Tôi biết rằng overflow:hidden được sử dụng để xử lý nội dung mà đi bên ngoài của hộp nhưng không hiểu tại sao nó được áp dụng trong trường hợp này.

Trả lời

29

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'

§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>

+8

+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

+0

@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

-1

Thay vì sử dụng overflow:hidden;, hãy sử dụng clear:both; cho số <p>. ở đây nó đang được sử dụng http://jsfiddle.net/Mvv8w/. Về cơ bản, overflow:hidden sẽ xóa mọi thứ sang một bên, giống như clear:both;.

+0

Đó là không giống nhau. Hãy xem [ví dụ sửa đổi] của bạn (http://jsfiddle.net/Mvv8w/1/) – Christoph

+0

tôi không nói chúng giống nhau ?. tôi chỉ nói rằng nó sẽ xóa các phần tử bên cạnh nó. Vì vậy, không cần đánh giá tiêu cực. – Tyler

+0

1) Tôi không downvote. 2) Như bạn thấy từ fiddle, tôi đã đăng tràn trong ví dụ này được sử dụng để làm cho phần tử cha chứa các phần tử con được thả nổi. Tôi đặt background-color trên ul để làm cho nó rõ ràng: ul thứ hai mở rộng để chứa nó trôi nổi trẻ em trong khi phao trong danh sách đầu tiên được xóa quá, nhưng ul không chứa nó trôi nổi con li và do đó có chiều cao 0 = không màu nền. – Christoph

-1

Đây là lý do tại sao w3schools không phải là một nguồn đáng tin cậy cho nhà thiết kế web/nhà phát triển. Bạn là chính xác, nó là một ví dụ khủng khiếp.

Nó không phải vì, trong ví dụ này, phần tử gốc không có cố định. Hơn nữa, nó là một thẻ danh sách không được sắp xếp, mà sẽ kéo dài đến kích thước của nó là trẻ em bất kể.

http://jsfiddle.net/EhphH/

CSS

.parent { 
    width: 150px; 
    height: 100px; 
    padding: 10px; 
    background: yellow; 
    overflow: hidden; 

} 
.child { 
    float: left; 
    width: 75px; 
    height: 120px; 
    margin: 10px; 
    background: blue; 

} 
.baby { 
    width: 200px; 
    height: 25px; 
    background: green; 
} 

Markup

<div class="parent"> 
    <div class="child"> 
     <div class="baby"> 
     </div> 
    </div> 
    <div class="child"> 
    </div> 
</div> 
+1

Làm sáng trước khi bạn bị đột quỵ. Tức giận không có cách nào để sống. – Plummer

+0

Hehe, tôi không tức giận chút nào. Tôi thích thú làm thế nào một số người có thể được về ý kiến ​​sai lầm của họ. Bạn nên xem xét kỹ hơn về fiddle ví dụ của tôi và thiền vài giờ về nó. – Christoph

+0

@tPlummer: "Thắp sáng trước khi bạn bị đột quỵ. Tức giận không có cách nào để sống." [Nói] (http://stackoverflow.com/revisions/16041526/1) cho [chính mình] (http://stackoverflow.com/revisions/16041526/2). Dù sao, bởi vì jsFiddle đã xuống cho tôi suốt buổi chiều, tôi sẽ giả định rằng những gì bạn đã thêm vào thực tế là mã tương tự trong liên kết của bạn - mặc dù vị trí của bạn trên nó vẫn có vẻ hơi mơ hồ. – BoltClock

Các vấn đề liên quan