Tại sao chiều cao của phần tử container không tăng nếu nó chứa các phần tử nổi?


210

Tôi muốn hỏi làm thế nào chiều cao và nổi làm việc. Tôi có một div bên ngoài và một div bên trong có nội dung trong đó. Chiều cao của nó có thể thay đổi tùy thuộc vào nội dung của div bên trong nhưng có vẻ như div bên trong của tôi sẽ tràn qua div bên ngoài của nó. Điều gì sẽ là cách thích hợp để làm điều đó?

 <html>
    <body>
        <div style="margin:0 auto;width: 960px; min-height: 100px; background-color:orange">
    	    <div style="width:500px; height:200px; background-color:black; float:right"></div>
        </div>
    </body>
</html>



tốt đẹp và rất tốt cảm ơn!
Bassam Alugili

Câu trả lời:


581

Các phần tử nổi không thêm vào chiều cao của phần tử container và do đó nếu bạn không xóa chúng, chiều cao của container sẽ không tăng ...

Tôi sẽ chỉ cho bạn một cách trực quan:

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Giải thích thêm:

<div>
  <div style="float: left;"></div>
  <div style="width: 15px;"></div> <!-- This will shift 
                                        besides the top div. Why? Because of the top div 
                                        is floated left, making the 
                                        rest of the space blank -->

  <div style="clear: both;"></div> 
  <!-- Now in order to prevent the next div from floating beside the top ones, 
       we use `clear: both;`. This is like a wall, so now none of the div's 
       will be floated after this point. The container height will now also include the 
       height of these floated divs -->
  <div></div>
</div>

Bạn cũng có thể thêm overflow: hidden;vào các phần tử container, nhưng tôi sẽ đề nghị bạn sử dụng clear: both;thay thế.

Ngoài ra nếu bạn có thể muốn tự xóa một yếu tố bạn có thể sử dụng

.self_clear:after {
  content: "";
  clear: both;
  display: table;
}

CSS Float hoạt động như thế nào?

Phao chính xác là gì và nó làm gì?

  • Các floattài sản bị hiểu lầm bởi hầu hết người mới bắt đầu. Chà, chính xác thì floatlàm gì? Ban đầu, floattài sản được giới thiệu để chảy văn bản xung quanh hình ảnh, được thả nổi lefthoặc right. Đây là một lời giải thích khác của @Madara Uchicha.

    Vì vậy, có sai không khi sử dụng floattài sản để đặt các hộp cạnh nhau? Câu trả lời là không ; không có vấn đề gì nếu bạn sử dụng thuộc floattính để đặt các hộp cạnh nhau.

  • Nổi một phần tử inlinehoặc blockmức sẽ làm cho phần tử hoạt động giống như một inline-blockphần tử.

    Bản giới thiệu

  • Nếu bạn thả nổi một phần tử lefthoặc right, widthphần tử đó sẽ bị giới hạn ở nội dung mà nó chứa, trừ khi widthđược xác định rõ ràng ...

  • Bạn không thể floatlà một yếu tố center. Đây là vấn đề lớn nhất mà tôi luôn thấy với người mới bắt đầu, sử dụng float: center;, không phải là giá trị hợp lệ cho floattài sản. floatthường được sử dụng để float/ di chuyển nội dung sang bên trái hoặc bên phải . Chỉ có bốn giá trị hợp lệ cho floatví dụ: tài sản left, right, none(mặc định) và inherit.

  • Phần tử cha mẹ sụp đổ, khi nó chứa các phần tử con nổi, để ngăn chặn điều này, chúng ta sử dụng thuộc clear: both;tính, để xóa các phần tử nổi ở cả hai bên, điều này sẽ ngăn chặn sự sụp đổ của phần tử cha. Để biết thêm thông tin, bạn có thể tham khảo câu trả lời khác của tôi ở đây .

  • (Quan trọng) Hãy nghĩ về nó nơi chúng ta có một chồng các yếu tố khác nhau. Khi chúng ta sử dụng float: left;hoặc float: right;phần tử di chuyển trên ngăn xếp một. Do đó, các phần tử trong luồng tài liệu thông thường sẽ ẩn đằng sau các phần tử nổi vì nó nằm ở cấp độ ngăn xếp trên các phần tử nổi thông thường. (Xin đừng liên hệ điều này với z-indexđiều đó là hoàn toàn khác nhau.)


Lấy một trường hợp làm ví dụ để giải thích cách hoạt động của CSS float, giả sử chúng ta cần bố cục 2 cột đơn giản với tiêu đề, chân trang và 2 cột, vì vậy đây là bản kế hoạch chi tiết ...

nhập mô tả hình ảnh ở đây

Trong ví dụ trên, chúng ta sẽ có nổi chỉ hộp màu đỏ, hoặc bạn có thể floatcho cả người left, hoặc bạn có thể floatvào left, và một để rightlà tốt, phụ thuộc vào cách bố trí, nếu đó là 3 cột, bạn có thể float2 cột để leftnơi khác một trong số rightđó phụ thuộc, mặc dù trong ví dụ này, chúng ta có bố cục 2 cột được đơn giản hóa, do đó, floatmột sẽ leftvà một khác cho right.

Đánh dấu và các kiểu để tạo bố cục được giải thích thêm ...

<div class="main_wrap">
    <header>Header</header>
    <div class="wrapper clear">
        <div class="floated_left">
            This<br />
            is<br />
            just<br />
            a<br />
            left<br />
            floated<br />
            column<br />
        </div>
        <div class="floated_right">
            This<br />
            is<br />
            just<br />
            a<br />
            right<br />
            floated<br />
            column<br />
        </div>
    </div>
    <footer>Footer</footer>
</div>

* {
    -moz-box-sizing: border-box;       /* Just for demo purpose */
    -webkkit-box-sizing: border-box;   /* Just for demo purpose */
    box-sizing: border-box;            /* Just for demo purpose */
    margin: 0;
    padding: 0;
}

.main_wrap {
    margin: 20px;
    border: 3px solid black;
    width: 520px;
}

header, footer {
    height: 50px;
    border: 3px solid silver;
    text-align: center;
    line-height: 50px;
}

.wrapper {
    border: 3px solid green;
}

.floated_left {
    float: left;
    width: 200px;
    border: 3px solid red;
}

.floated_right {
    float: right;
    width: 300px;
    border: 3px solid red;
}

.clear:after {
    clear: both;
    content: "";
    display: table;
}

Hãy đi từng bước với cách bố trí và xem cách float hoạt động ..

Trước hết, chúng tôi sử dụng phần tử trình bao bọc chính, bạn có thể giả sử rằng đó là chế độ xem của bạn, sau đó chúng tôi sử dụng headervà gán một heightthứ 50pxkhông có gì lạ mắt ở đó. Nó chỉ là một phần tử mức khối không nổi bình thường sẽ chiếm 100%không gian ngang trừ khi nó nổi hoặc chúng ta gán inline-blockcho nó.

Giá trị hợp lệ đầu tiên cho floatleftnhư vậy trong ví dụ của chúng tôi, chúng tôi sử dụng float: left;cho .floated_left, vì vậy chúng tôi có ý định nổi một khối đến leftcác yếu tố container của chúng tôi.

Cột nổi bên trái

Và vâng, nếu bạn thấy, phần tử cha, .wrapperđược thu gọn, phần tử bạn nhìn thấy có viền màu xanh lá cây không mở rộng, nhưng nó có đúng không? Sẽ trở lại điều đó trong một thời gian, bây giờ, chúng tôi đã có một cột nổi left.

Đến với cột thứ hai, hãy để nó ở cột floatnàyright

Một cột khác trôi nổi bên phải

Ở đây, chúng ta có một 300pxcột rộng mà chúng tôi floatđến right, mà sẽ ngồi bên cạnh cột đầu tiên làm nó nổi đến left, và vì nó nổi đến left, nó tạo ra máng xối rỗng vào right, và kể từ đó đã phong phú của không gian trên right, chúng tôi rightyếu tố nổi ngồi hoàn hảo bên cạnh leftmột.

Tuy nhiên, phần tử cha bị thu gọn, tốt, chúng ta hãy sửa nó ngay bây giờ. Có nhiều cách để ngăn chặn phần tử cha khỏi bị sụp đổ.

  • Thêm một phần tử mức khối trống và sử dụng clear: both;trước khi phần tử cha kết thúc, chứa các phần tử nổi, bây giờ đây là một giải pháp rẻ tiền cho clearcác phần tử nổi của bạn sẽ thực hiện công việc cho bạn, nhưng tôi khuyên bạn không nên sử dụng phần tử này.

Thêm, <div style="clear: both;"></div>trước khi .wrapper divkết thúc, như

<div class="wrapper clear">
    <!-- Floated columns -->
    <div style="clear: both;"></div>
</div>

Bản giới thiệu

Chà, nó sửa rất tốt, không bị sập cha mẹ nữa, nhưng nó thêm đánh dấu không cần thiết vào DOM, vì vậy một số gợi ý, để sử dụng overflow: hidden;trên phần tử cha giữ các phần tử con nổi hoạt động như dự định.

Sử dụng overflow: hidden;trên.wrapper

.wrapper {
    border: 3px solid green;
    overflow: hidden;
}

Bản giới thiệu

Điều đó tiết kiệm cho chúng tôi một yếu tố mỗi khi chúng tôi cần clear floatnhưng khi tôi thử nghiệm nhiều trường hợp khác nhau, nó đã thất bại ở một box-shadowyếu tố cụ thể, sử dụng trên các yếu tố con.

Bản trình diễn (Không thể nhìn thấy bóng trên cả 4 mặt,overflow: hidden;gây ra sự cố này)

Giờ thì sao? Lưu một phần tử, không overflow: hidden;cần phải sửa lỗi rõ ràng, sử dụng đoạn mã dưới đây trong CSS của bạn và giống như khi bạn sử dụng overflow: hidden;phần tử cha, hãy gọi phần tử classbên dưới vào phần tử cha để tự xóa.

.clear:after {
    clear: both;
    content: "";
    display: table;
}

<div class="wrapper clear">
    <!-- Floated Elements -->
</div>

Bản giới thiệu

Ở đây, bóng hoạt động như dự định, đồng thời, nó tự xóa phần tử cha ngăn chặn thu gọn.

Và cuối cùng, chúng tôi sử dụng chân trang sau khi chúng tôi clearcác yếu tố nổi.

Bản giới thiệu


Khi nào được float: none;sử dụng, vì nó là mặc định, vì vậy sử dụng để khai báo float: none;?

Chà, điều đó còn tùy thuộc, nếu bạn định thiết kế đáp ứng, bạn sẽ sử dụng giá trị này rất nhiều lần, khi bạn muốn các phần tử nổi của mình hiển thị bên dưới một độ phân giải nhất định. Đối với float: none;tài sản đó đóng một vai trò quan trọng đó.


Vài ví dụ thực tế về cách floathữu ích.

  • Ví dụ đầu tiên chúng ta đã thấy là tạo một hoặc nhiều bố cục cột.
  • Sử dụng imgnổi bên trong psẽ cho phép nội dung của chúng tôi chảy xung quanh.

Bản demo (Không nổiimg)

Bản demo 2 (imgthả nổi đếnleft)

  • Sử dụng floatđể tạo menu ngang - Demo

Nổi phần tử thứ hai là tốt, hoặc sử dụng `lề`

Cuối cùng nhưng không kém phần quan trọng, tôi muốn giải thích trường hợp cụ thể này khi bạn floatchỉ có một yếu tố duy nhất leftnhưng bạn không phải floatlà yếu tố khác, vậy chuyện gì xảy ra?

Giả sử nếu chúng ta loại bỏ float: right;khỏi chúng ta .floated_right class, divnó sẽ được hiển thị từ mức cực đoan leftvì nó không trôi nổi.

Bản giới thiệu

Vì vậy, trong trường hợp này, hoặc là bạn có thể floatđể các leftcũng

HOẶC LÀ

Bạn có thể sử dụng margin-leftsẽ bằng với kích thước của cột nổi bên trái tức là 200pxrộng .


3
Thực tế là số float không đóng góp vào chiều cao của bậc cha mẹ ở cấp độ khối được nêu rõ ở đây trong thông số: w3.org/TR/CSS21/visudet.html#n normal -block Lý do tại sao việc thêm một Clearfix hoạt động là vì 1) Clearfix là (thường) trong luồng thông thường 2) phao xóa rõ ràng yêu cầu phải xóa Clearfix ở dưới cùng của phao 3) thùng chứa phải được kéo dài để chứa Clearfix đó.
BoltClock

@BoltClock sẽ tốt hơn nếu bạn quay lại chỉnh sửa tiêu đề vì nó sẽ ảnh hưởng nghiêm trọng đến seo cho những người dùng tìm thấy float hoạt động như thế nào .. bạn có thể viết các thuật ngữ đó trên google và kiểm tra .. nếu không thì câu trả lời kinh điển này sẽ không hữu dụng nếu mọi người không thể tìm thấy những gì họ đang tìm kiếm.
Ông Alien

"CSS float hoạt động như thế nào?" là một tiêu đề cực kỳ rộng rãi và nó cũng khiến mọi người hiểu lầm khi bỏ phiếu để đóng bất kỳ câu hỏi nổi nào như một bản sao của câu hỏi này. Câu hỏi ở đây chỉ bao gồm một khía cạnh: thùng chứa (hoặc không gói) nổi.
BoltClock

@BoltClock Dù sao thì tính kỹ thuật vẫn giống như được giải thích clear: both;, nhưng sẽ ổn nếu bạn cảm thấy việc chỉnh sửa hợp lý vì vậy hãy giữ nguyên như vậy
Ông Alien

1
câu trả lời xuất sắc. "Nổi bất kỳ phần tử nào sang trái hoặc phải, chiều rộng của phần tử sẽ bị giới hạn ở nội dung mà nó chứa, trừ khi chiều rộng được xác định rõ ràng" - tôi quan sát điều tương tự và chỉ tìm kiếm điều này để được xác nhận. Cảm ơn bạn
Deen John

38

Bạn cần thêm overflow:autovào div cha của bạn để nó bao gồm div nổi bên trong:

<div style="margin:0 auto;width: 960px; min-height: 100px; background-color:orange;overflow:auto">
    <div style="width:500px; height:200px; background-color:black; float:right">
    </div>
</div>

ví dụ jsFiddle


6
Đây không phải là một giải pháp, bạn đang che giấu nội dung đi ra khỏi ranh giới từ div bên ngoài.
Alejandro Ruiz Arias

@AlejandroRuizArias - Chính xác thì mọi thứ đang bị ẩn như thế nào?
j08691

3
Trong ví dụ này không có gì, nhưng nếu bạn giới thiệu đủ nội dung trong div bên trong thì có.
Alejandro Ruiz Arias

Điều này không làm được điều mà OP đang tìm kiếm: Forked jsfiddle.net/h0ceb5ra
TecBrat

1
Tuyệt vời. Giải pháp một thuộc tính mà tôi đang tìm kiếm, nếu mọi thứ khác dễ dàng như vậy, sẽ không cần phải thu nhỏ.
YK

10

Bạn đang gặp phải lỗi nổi (mặc dù tôi không chắc đó có phải là lỗi do có bao nhiêu trình duyệt thể hiện hành vi này không). Đây là điều đang xảy ra:

Trong các trường hợp thông thường, giả sử rằng không có chiều cao rõ ràng nào được đặt, một phần tử mức khối như div sẽ đặt chiều cao dựa trên nội dung của nó. Phần dưới của div cha sẽ mở rộng ra ngoài phần tử cuối cùng. Thật không may, việc thả nổi một phần tử ngăn phụ huynh đưa phần tử nổi vào tài khoản khi xác định chiều cao của nó. Điều này có nghĩa là nếu phần tử cuối cùng của bạn được thả nổi, nó sẽ không "kéo dài" cha mẹ theo cách giống như một phần tử bình thường.

Dọn dẹp

Có hai cách phổ biến để khắc phục điều này. Đầu tiên là thêm một yếu tố "bù trừ"; đó là, một yếu tố khác bên dưới yếu tố nổi sẽ buộc cha mẹ kéo dài. Vì vậy, thêm html sau đây là con cuối cùng:

<div style="clear:both"></div>

Không nên nhìn thấy nó và bằng cách sử dụng rõ ràng: cả hai, bạn chắc chắn rằng nó sẽ không ngồi bên cạnh phần tử nổi, nhưng sau nó.

Tràn ra:

Phương pháp thứ hai, được hầu hết mọi người (tôi nghĩ) ưa thích là thay đổi CSS của phần tử cha mẹ để phần tràn là bất cứ thứ gì ngoài "hiển thị". Vì vậy, thiết lập tràn thành "ẩn" sẽ buộc cha mẹ kéo dài ra khỏi đáy của con nổi. Tất nhiên, điều này chỉ đúng nếu bạn chưa đặt chiều cao cho cha mẹ.

Như tôi đã nói, phương pháp thứ hai được ưa thích vì nó không yêu cầu bạn phải đi và thêm các yếu tố vô nghĩa về mặt ngữ nghĩa vào đánh dấu của bạn, nhưng có những lúc bạn cần overflowhiển thị, trong trường hợp đó, việc thêm một yếu tố xóa là chấp nhận được .


3

Đó là vì sự nổi của div. Thêm overflow: hiddenvào các yếu tố bên ngoài.

<div style="overflow:hidden; margin:0 auto;width: 960px; min-height: 100px; background-color:orange;">
    <div style="width:500px; height:200px; background-color:black; float:right">
    </div>
</div>

Bản giới thiệu


3

Bạn nhầm lẫn cách trình duyệt kết xuất các phần tử khi có các phần tử nổi. Nếu một thành phần khối nổi (div bên trong của bạn trong trường hợp của bạn), các thành phần khối khác sẽ bỏ qua vì trình duyệt sẽ loại bỏ các thành phần nổi khỏi luồng thông thường của trang web. Sau đó, vì div nổi đã bị xóa khỏi luồng bình thường, div bên ngoài được điền vào, giống như div bên trong không có ở đó. Tuy nhiên, các yếu tố nội tuyến (hình ảnh, liên kết, văn bản, blackquote) sẽ tôn trọng ranh giới của yếu tố nổi. Nếu bạn giới thiệu văn bản trong div bên ngoài, văn bản sẽ đặt arround de bên trong div.

Nói cách khác, các phần tử khối (tiêu đề, đoạn văn, div, v.v.) bỏ qua các phần tử nổi và điền vào, và các phần tử nội tuyến (hình ảnh, liên kết, văn bản, v.v.) tôn trọng ranh giới của các phần tử nổi.

Một ví dụ thú vị ở đây

<body>
    <div style="float:right; background-color:blue;width:200px;min-height:400px;margin-right:20px">
           floating element
    </div>
    <h1 style="background-color:red;"> this is a big header</h1>
    <p style="background-color:green"> this is a parragraph with text and a big image. The text places arrounds the floating element. Because of the image is wider than space between paragrah and floating element places down the floating element. Try to make wider the viewport and see what happens :D
        <img src="http://2.bp.blogspot.com/_nKxzQGcCLtQ/TBYPAJ6xM4I/AAAAAAAAAC8/lG6XemOXosU/s1600/css.png">
     </p>

3
Không làm nổi bật văn bản và chia sẻ liên kết fiddle, mã bài đăng trong câu trả lời của bạn từ lần sau, vì nếu liên kết fiddle đã chết, người dùng tương lai sẽ không nhận được bất kỳ trợ giúp nào ở đây và câu trả lời của bạn sẽ không có ý nghĩa gì
Ông Alien


1

bạn có thể sử dụng thuộc tính tràn vào div container nếu bạn không có div nào để hiển thị trên container, ví dụ:

<div class="cointainer">
    <div class="one">Content One</div>
    <div class="two">Content Two</div>
</div>

Đây là css sau:

.container{
    width:100%;/* As per your requirment */
    height:auto;
    float:left;
    overflow:hidden;
}
.one{
    width:200px;/* As per your requirment */
    height:auto;
    float:left;
}

.two{
    width:200px;/* As per your requirment */
    height:auto;
    float:left;
}

-----------------------HOẶC LÀ-------------------------- ----

    <div class="cointainer">
        <div class="one">Content One</div>
        <div class="two">Content Two</div>
        <div class="clearfix"></div>
    </div>

Đây là css sau:

    .container{
        width:100%;/* As per your requirment */
        height:auto;
        float:left;
        overflow:hidden;
    }
    .one{
        width:200px;/* As per your requirment */
        height:auto;
        float:left;
    }

    .two{
        width:200px;/* As per your requirment */
        height:auto;
        float:left;
    }
    .clearfix:before,
    .clearfix:after{
        display: table;
        content: " ";
    }
    .clearfix:after{
        clear: both;
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.