Tôi có thể sử dụng phương pháp 'Clearfix' nào?


864

Tôi có một vấn đề divmuôn thuở của việc gói bố cục hai cột. Thanh bên của tôi được thả nổi, vì vậy container của tôi divkhông thể bọc nội dung và thanh bên.

<div id="container">
  <div id="content"></div>
  <div id="sidebar"></div>
</div>

Dường như có rất nhiều phương pháp sửa lỗi rõ ràng trong Firefox:

  • <br clear="all"/>
  • overflow:auto
  • overflow:hidden

Trong tình huống của tôi, cách duy nhất có vẻ hoạt động chính xác là <br clear="all"/>giải pháp, có một chút khó chịu. overflow:automang lại cho tôi những thanh cuộn khó chịu, và overflow:hiddenchắc chắn phải có tác dụng phụ. Ngoài ra, IE7 rõ ràng không nên gặp phải vấn đề này do hành vi không chính xác của nó, nhưng trong tình huống của tôi, nó cũng bị như Firefox.

Phương pháp nào hiện có sẵn cho chúng tôi là mạnh mẽ nhất?


1
Tôi sử dụng jqui.net/tips-tricks/css-clearfix nó giúp tôi ẩn dấu chấm :)
Val

1
Còn IE 6 và IE 7 thì sao? Họ không bao giờ làm theo đúng cách để dọn dẹp mọi thứ.
Praveen Kumar Purushothaman

Bây giờ là một năm nữa, liệu có bất kỳ cơ hội nào để sửa đổi câu trả lời chính xác cho mã xóa ba dòng hiện đại được nêu ở đây , như được sử dụng trong các khung tên lớn Bourbon và Inuit.css không? Xem câu trả lời của tôi dưới đây .
iono

Câu trả lời:


1039

Tùy thuộc vào thiết kế được sản xuất, mỗi giải pháp CSS rõ ràng dưới đây đều có những lợi ích riêng.

Clearfix có các ứng dụng hữu ích nhưng nó cũng đã được sử dụng như một bản hack. Trước khi bạn sử dụng một Clearfix, có lẽ các giải pháp css hiện đại này có thể hữu ích:


Giải pháp Clearfix hiện đại


Container với overflow: auto;

Cách đơn giản nhất để xóa các phần tử nổi là sử dụng kiểu overflow: autotrên phần tử chứa. Giải pháp này hoạt động trong mọi trình duyệt hiện đại.

<div style="overflow: auto;">
  <img
    style="float: right;"
    src="path/to/floated-element.png"
    width="500"
    height="500"
  > 
  <p>Your content here…</p>
</div>

Một nhược điểm, sử dụng một số kết hợp lề và phần đệm nhất định trên phần tử bên ngoài có thể khiến thanh cuộn xuất hiện nhưng điều này có thể được giải quyết bằng cách đặt lề và phần đệm trên phần tử chứa cha mẹ khác.

Sử dụng 'overflow: hidden' cũng là một giải pháp Clearfix, nhưng sẽ không có thanh cuộn, tuy nhiên việc sử dụng hiddensẽ cắt bất kỳ nội dung nào được đặt bên ngoài phần tử chứa.

Lưu ý: Phần tử nổi là một imgthẻ trong ví dụ này, nhưng có thể là bất kỳ phần tử html nào.


Clearfix được tải lại

Thierry Koblentz trên CSSMojo đã viết: Clearfix mới nhất được tải lại . Ông lưu ý rằng bằng cách bỏ hỗ trợ cho oldIE, giải pháp có thể được đơn giản hóa thành một câu lệnh css. Ngoài ra, sử dụng display: block(thay vì display: table) cho phép lề thu gọn đúng cách khi các phần tử có Clearfix là anh em ruột.

.container::after {
  content: "";
  display: block;
  clear: both;
}

Đây là phiên bản hiện đại nhất của Clearfix.


Giải pháp Clearfix cũ hơn

Các giải pháp dưới đây không cần thiết cho các trình duyệt hiện đại, nhưng có thể hữu ích cho việc nhắm mục tiêu các trình duyệt cũ hơn.

Lưu ý rằng các giải pháp này phụ thuộc vào lỗi trình duyệt và do đó chỉ nên được sử dụng nếu không có giải pháp nào ở trên phù hợp với bạn.

Chúng được liệt kê đại khái theo thứ tự thời gian.


"Beat That ClearFix", một thuật ngữ rõ ràng cho các trình duyệt hiện đại

Thierry Koblentz' của CSS Mojo đã chỉ ra rằng khi nhắm mục tiêu các trình duyệt hiện đại, chúng tôi bây giờ có thể thả zoom::beforesở hữu / giá trị và chỉ cần sử dụng:

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

Giải pháp này không hỗ trợ cho IE 6/7 trên mục đích!

Thierry cũng đưa ra: " Một lời cảnh báo : nếu bạn bắt đầu một dự án mới từ đầu, hãy thực hiện nó, nhưng đừng trao đổi kỹ thuật này với kỹ thuật hiện tại của bạn, bởi vì mặc dù bạn không hỗ trợ oldIE, nhưng các quy tắc hiện tại của bạn sẽ ngăn chặn lợi nhuận bị sụp đổ. "


Micro Clearfix

Giải pháp Clearfix gần đây nhất và được áp dụng trên toàn cầu, Micro Clearfix của Nicolas Gallagher .

Hỗ trợ được biết đến: Firefox 3.5+, Safari 4+, Chrome, Opera 9+, IE 6+

.container::before, .container::after {
  content: "";
  display: table;
}
.container::after {
  clear: both;
}
.container {
  zoom: 1;
}

Tài sản tràn

Phương pháp cơ bản này được ưa thích cho trường hợp thông thường, khi nội dung được định vị sẽ không hiển thị bên ngoài giới hạn của vùng chứa.

http://www.quirksmode.org/css/clear.html - giải thích cách giải quyết các vấn đề phổ biến liên quan đến kỹ thuật này, cụ thể là, cài đặt width: 100%trên container.

.container {
  overflow: hidden;
  display: inline-block;
  display: block;
}

Thay vì sử dụng thuộc displaytính để đặt "hasLayout" cho IE, các thuộc tính khác có thể được sử dụng để kích hoạt "hasLayout" cho một phần tử .

.container {
  overflow: hidden;
  zoom: 1;
  display: block;
}

Một cách khác để xóa phao bằng cách sử dụng thuộc overflowtính là sử dụng hack gạch dưới . IE sẽ áp dụng các giá trị có tiền tố gạch dưới, các trình duyệt khác thì không. Các zoomkích hoạt thuộc tính hasLayout trong IE:

.container {
  overflow: hidden;
  _overflow: visible; /* for IE */
  _zoom: 1; /* for IE */
}

Trong khi điều này hoạt động ... nó không lý tưởng để sử dụng hack.


PIE: Phương pháp xóa dễ dàng

Phương pháp "Xóa dễ dàng" cũ này có ưu điểm là cho phép các phần tử được định vị treo bên ngoài giới hạn của vùng chứa, với chi phí CSS phức tạp hơn.

Giải pháp này khá cũ, nhưng bạn có thể tìm hiểu tất cả về Xóa dễ dàng trên vị trí là tất cả: http://www.poseitioniseverything.net/easyclear.html


Phần tử sử dụng thuộc tính "xóa"

Giải pháp nhanh và bẩn (với một số nhược điểm) khi bạn nhanh chóng tát một cái gì đó cùng nhau:

<br style="clear: both" /> <!-- So dirty! -->

Hạn chế

  • Nó không phản hồi và do đó có thể không cung cấp hiệu ứng mong muốn nếu kiểu bố cục thay đổi dựa trên các truy vấn phương tiện. Một giải pháp trong CSS thuần là lý tưởng hơn.
  • Nó thêm đánh dấu html mà không nhất thiết phải thêm bất kỳ giá trị ngữ nghĩa.
  • Nó đòi hỏi một định nghĩa và giải pháp nội tuyến cho từng trường hợp chứ không phải là một tham chiếu lớp cho một giải pháp duy nhất của một Clearfix rõ ràng trong css và các tham chiếu lớp đến nó trong html.
  • Nó làm cho mã khó làm việc với người khác vì họ có thể phải viết nhiều bản hack hơn để làm việc xung quanh nó.
  • Trong tương lai khi bạn cần / muốn sử dụng một giải pháp Clearfix khác, bạn sẽ không phải quay lại và xóa mọi <br style="clear: both" />thẻ nằm rải rác xung quanh đánh dấu.

25
@David Rivers: Phương thức: after không phải là hack vì nó không khai thác lỗi phân tích cú pháp trong trình duyệt, nó sử dụng tính năng của css làm giải pháp. Ngoài ra: sau sẽ được hỗ trợ trong các trình duyệt trong tương lai, không giống như hack gạch dưới. Lý tưởng nhất là sẽ có một thuộc tính css có thể được áp dụng cho một phần tử sẽ khiến nó chứa tất cả nội dung của nó.
Beau Smith

7
Cảm ơn sự cố. Tôi thấy phương pháp: sau khi "xóa dễ dàng" vượt trội hơn so với "tràn: ẩn", vì nó không cắt bóng hộp CSS3 hoặc các phần tử định vị. Các dòng mã thêm chắc chắn là giá trị nó.
Aneon

7
Tôi không ủng hộ br rõ ràng: cả hai giải pháp, nhưng tôi không đồng ý với việc dán nhãn 'bẩn' của bạn về nó. Đối số 'thêm trọng lượng / tải chậm hơn có vẻ ngớ ngẩn, vì đó là 1 dòng mã html ngắn, so với một số dòng CSS (mà trình duyệt của bạn cũng phải tải). Đối với đối số 'giá trị ngữ nghĩa', một br rõ ràng: cả hai đều dễ hiểu hơn nhiều so với cố gắng tìm ra một nhóm css bắn súng ngớ ngẩn. rõ ràng: cả hai đều ngắn và đơn giản và imho không ảnh hưởng đến 'tính chuyên nghiệp'.
Vigrond

16
Trái với niềm tin phổ biến, overflow: hiddenhoặc overflow: autokhông rõ ràng nổi (phân loại nó là "Clearfix" là một cách gọi sai); thay vào đó, nó làm cho một phần tử tạo ra một bối cảnh định dạng mới trong đó có thể chứa các float. Điều này làm cho container kéo dài đến chiều cao của phao để chứa chúng. Không có giải phóng mặt bằng liên quan đến bất cứ điều gì - như đã nói, bạn vẫn có thể chọn xóa, hoặc không rõ ràng, các phao trong container tùy thuộc vào bố cục của bạn.
BoltClock

3
Chúng tôi không nên hỗ trợ IE7 nữa. Vui lòng cập nhật điều này với phương pháp ba dòng được mô tả ở đây
iono

70

Những vấn đề chúng ta đang cố gắng giải quyết?

Có hai cân nhắc quan trọng khi nổi thứ:

  1. Chứa con cháu nổi. Điều này có nghĩa là yếu tố trong câu hỏi làm cho nó đủ cao để bao bọc tất cả các hậu duệ trôi nổi. (Họ không treo bên ngoài.)

    Nội dung nổi treo bên ngoài container của nó

  2. Con cháu cách nhiệt từ bên ngoài phao. Điều này có nghĩa là con cháu bên trong một phần tử sẽ có thể sử dụng clear: bothvà nó không tương tác với phần nổi bên ngoài phần tử.

    <code> xóa: cả </ code> tương tác với một float ở nơi khác trong DOM

Khối bối cảnh định dạng

Chỉ có một cách để làm cả hai điều này. Và đó là để thiết lập một bối cảnh định dạng khối mới . Các yếu tố thiết lập bối cảnh định dạng khối là một hình chữ nhật cách điện trong đó các float tương tác với nhau. Một bối cảnh định dạng khối sẽ luôn đủ cao để bao bọc trực quan các hậu duệ trôi nổi của nó và không có phần nổi nào bên ngoài bối cảnh định dạng khối có thể tương tác với các phần tử bên trong. Cách nhiệt hai chiều này là chính xác những gì bạn muốn. Trong IE, khái niệm tương tự này được gọi là hasLayout , có thể được đặt qua zoom: 1.

Có một số cách để thiết lập bối cảnh định dạng khối, nhưng giải pháp tôi khuyên dùng là display: inline-blockvới width: 100%. (Tất nhiên, có những hãy cẩn thận thông thường với việc sử dụng width: 100%, vì vậy sử dụng box-sizing: border-boxhoặc đặt padding, marginbordertrên một yếu tố khác nhau.)

Giải pháp mạnh mẽ nhất

Có lẽ ứng dụng phổ biến nhất của phao là bố trí hai cột. (Có thể mở rộng thành ba cột.)

Đầu tiên cấu trúc đánh dấu.

<div class="container">
  <div class="sidebar">
    sidebar<br/>sidebar<br/>sidebar
  </div>
  <div class="main">
    <div class="main-content">
      main content
      <span style="clear: both">
        main content that uses <code>clear: both</code>
      </span>
    </div>
  </div>
</div>

Và bây giờ là CSS.

/* Should contain all floated and non-floated content, so it needs to
 * establish a new block formatting context without using overflow: hidden.
 */
.container {
  display: inline-block;
  width: 100%;
  zoom: 1; /* new block formatting context via hasLayout for IE 6/7 */
}

/* Fixed-width floated sidebar. */
.sidebar {
  float: left;
  width: 160px;
}

/* Needs to make space for the sidebar. */
.main {
  margin-left: 160px;
}

/* Establishes a new block formatting context to insulate descendants from
 * the floating sidebar. */
.main-content {
  display: inline-block;
  width: 100%;
  zoom: 1; /* new block formatting context via hasLayout for IE 6/7 */
}

Tự mình thử

Đi đến JS Bin để chơi xung quanh với mã và xem cách giải pháp này được xây dựng từ đầu.

Phương pháp Clearfix truyền thống được coi là có hại

Vấn đề với các giải pháp Clearfix truyền thống là chúng sử dụng hai khái niệm kết xuất khác nhau để đạt được cùng một mục tiêu cho IE và mọi người khác. Trong IE họ sử dụng hasLayout để thiết lập bối cảnh định dạng khối mới, nhưng đối với mọi người khác, họ sử dụng các hộp được tạo ( ) với , không thiết lập bối cảnh định dạng khối mới. Điều này có nghĩa là mọi thứ sẽ không hành xử giống nhau trong mọi tình huống. Để biết giải thích tại sao điều này là xấu, hãy xem Mọi thứ bạn biết về Clearfix đều sai .:afterclear: both


"Hãy cẩn thận thông thường với việc sử dụng width: 100%" là gì? Ngoài ra, bạn có đề xuất sử dụng zoom: 1trong ¶1 của §2 không?
Baumr

Câu trả lời thú vị, nhưng những gì về overflow: hidden, khái niệm kết xuất nào mà gọi? Và làm thế nào nó có thể khác nhau hasLayout?
Baumr

Đúng, nhưng nếu một người tránh sử dụng position: absolute, thì nó có ổn không và sẽ là một phần của cùng một khái niệm kết xuất?
Baumr

Tôi hiểu rồi. Bằng cách biểu hiện khái niệm tôi có nghĩa là nếu overflow: hiddenthực thi một điều như vậy khác với những gì hasLayout làm?
Baumr

2
Đọc thêm về hasLayouttại stackoverflow.com/questions/1794350/what-is-haslayout . Tôi nghĩ về nó như đồng nghĩa với việc thiết lập một bối cảnh định dạng khối mới. Các yếu tố làm điều này về cơ bản chịu trách nhiệm cho việc bố trí tất cả các yếu tố hậu duệ của chúng. Một kết quả của điều này là các phần tử thiết lập bối cảnh định dạng khối mới chứa hậu duệ nổi và phần nổi bên ngoài phần tử không tương tác với clear: left|right|bothcác phần tử bên trong. (Đây là trong câu trả lời ở trên.)
Chris Calo

54

Tiêu chuẩn mới, được sử dụng bởi Inuit.cssBourbon - hai khung CSS / Sass được sử dụng rất rộng rãi và được duy trì tốt:

.btcf:after {
    content:"";
    display:block;
    clear:both;
}

Ghi chú

Hãy nhớ rằng Clearfixes về cơ bản là một bản hack cho những gì bố trí flexbox hiện có thể cung cấp theo cách thông minh hơn nhiều . Phao CSS ban đầu được thiết kế để nội dung nội tuyến chảy xung quanh - giống như hình ảnh trong một bài viết văn bản dài - và không dành cho bố cục lưới và tương tự. Nếu trình duyệt mục tiêu của bạn hỗ trợ flexbox , nó đáng để xem xét.

Điều này không hỗ trợ IE7. Bạn không nên hỗ trợ IE7. Làm như vậy tiếp tục khiến người dùng bị khai thác bảo mật không trộn lẫn và làm cho cuộc sống của tất cả các nhà phát triển web khác khó khăn hơn, vì nó giảm áp lực cho người dùng và tổ chức chuyển sang trình duyệt hiện đại.

Clearfix này đã được Thierry Koblentz công bố và giải thích vào tháng 7 năm 2012. Nó làm giảm trọng lượng không cần thiết từ micro-Clearfix 2011 của Nicolas Gallagher . Trong quá trình này, nó giải phóng một yếu tố giả cho việc sử dụng của riêng bạn. Điều này đã được cập nhật để sử dụng display: blockchứ không phải display: table(một lần nữa, tín dụng cho Thierry Koblentz).


3
Tôi hy vọng câu trả lời của bạn nhận được nhiều phiếu hơn về điều này vì tôi hoàn toàn đồng ý với bạn. Một lần nữa, đó là năm 2013 và tôi thực sự tin rằng đây là giải pháp mọi người nên sử dụng.
rafaelbiten

2
Đã đồng ý. theie7countdown.com Kiểm tra phân tích của riêng bạn và hy vọng rằng IE7 không xứng đáng với thời gian của bạn.
Justin

1
@Justin đồng ý; phân tích cá nhân của bạn sẽ đặt ra điều này. Tuy nhiên, tôi không nghĩ rằng trang web đếm ngược đã được cập nhật trong một thời gian - tốt nhất nên sử dụng số liệu thống kê của caniuse , đưa IE7 ở mức 0,39% trên toàn cầu.
iono

1
Hy vọng, các bản hack như Clearfix sẽ sớm được đưa ra không cần thiết thông qua việc sử dụng flexbox, thay vì float, để bố trí.
iono

Bạn có thể phản đối hỗ trợ IE7 nhiều như bạn muốn, nhưng nếu có yêu cầu từ phía doanh nghiệp để hỗ trợ những người dùng này (vì những lý do khác nhau - điển hình là tiền), bạn sẽ làm việc đó bất kể bạn cảm thấy thế nào về vấn đề này
Kris Selbekk 17/03/2015

27

Tôi khuyên bạn nên sử dụng những điều sau đây, được lấy từ http://html5boilerplate.com/

/* >> The Magnificent CLEARFIX << */
.clearfix:after { 
  content: "."; 
  display: block; 
  height: 0; 
  clear: both; 
  visibility: hidden; 
}
.clearfix { 
  display: inline-block;  
}
* html .clearfix {  
  height: 1%;  
} /* Hides from IE-mac \*/
.clearfix {  
  display: block;  
}

8
Ai còn nhớ IE-mac bây giờ? Tại sao làm cho mọi thứ trở nên phức tạp vì những vấn đề không còn phù hợp?
Ilya Streltsyn

23

Thuộc tính tràn có thể được sử dụng để xóa phao mà không cần đánh dấu bổ sung:

.container { overflow: hidden; }

Điều này hoạt động cho tất cả các trình duyệt ngoại trừ IE6, nơi tất cả những gì bạn cần làm là bật hasLayout (thu phóng là phương pháp ưa thích của tôi):

.container { zoom: 1; }

http://www.quirksmode.org/css/clear.html


3
tràn: ẩn không hoạt động trong trình duyệt PS3. Không phải hầu hết mọi người cần điều đó để làm việc, nhưng đó là điều quan trọng nhất làm nổ tung trang web của tôi trong PS3 mà chúng tôi đang cố gắng nhắm mục tiêu vì lý do kinh doanh. Ừ
gtd

1
Và đó là một vấn đề nếu bạn thực sự muốn một số nội dung nhất định treo bên ngoài container.
Simon East

tràn: ẩn có tác dụng phụ xấu của việc cắt nội dung
Chris Calo

9
overflow:hiddentác dụng cắt nội dung; nó có tác dụng phụ trong việc dọn sạch container ;-)
Tamlyn

tràn: auto cũng sẽ kích hoạt bối cảnh định dạng khối và nó sẽ không cắt nội dung.
Harry Robbins

17

Tôi đã tìm thấy một lỗi trong Phương thức CLEARFIX chính thức: DOT không có cỡ chữ. Và nếu bạn đặt height = 0Phần tử đầu tiên và trong DOM-Tree của bạn có lớp "Clearfix" thì bạn sẽ luôn có một lề ở cuối trang 12px :)

Bạn phải sửa nó như thế này:

/* float clearing for everyone else */
.clearfix:after{
  clear: both;
  content: ".";
  display: block;
  height: 0;
  visibility: hidden;
  font-size: 0;
}

Bây giờ nó là một phần của Bố cục YAML ... Hãy nhìn vào nó - nó rất thú vị! http://www.yaml.de/en/home.html


15

Đây là một giải pháp khá gọn gàng:

/* For modern browsers */
.cf:before,
.cf:after {
    content:"";
    display:table;
}

.cf:after {
    clear:both;
}

/* For IE 6/7 (trigger hasLayout) */
.cf {
    zoom:1;
}

Nó được biết là hoạt động trong Firefox 3.5+, Safari 4+, Chrome, Opera 9+, IE 6+

Bao gồm: trước khi bộ chọn không cần thiết để xóa phao, nhưng nó ngăn chặn lợi nhuận hàng đầu sụp đổ trong các trình duyệt hiện đại. Điều này đảm bảo rằng có sự thống nhất trực quan với IE 6/7 khi thu phóng: 1 được áp dụng.

Từ http://nicolasgallagher.com/micro-clearfix-hack/


1
Vâng, tính đến giữa năm 2011, đây là giải pháp yêu thích của tôi. Nó cho phép bạn định vị các đối tượng bên ngoài hộp chứa nếu cần thiết (tránh overflow: hidden).
Simon East

10

Clearfix từ bootstrap:

.clearfix {
  *zoom: 1;
}

.clearfix:before,
.clearfix:after {
  display: table;
  line-height: 0;
  content: "";
}

.clearfix:after {
  clear: both;
}

Phiên bản bootstrap này là từ đâu?
Eric

8

Tôi chỉ sử dụng: -

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

Hoạt động tốt nhất và tương thích với IE8 + :)


Sẽ không hoạt động trong IE7 vì nó không hỗ trợ các giả CSS.
siêu sáng

4
... Đó là lý do tại sao anh ấy nói "tương thích với IE8 +." Hầu hết các trang web không cần hỗ trợ IE7 nữa, nó sử dụng ít hơn 1% trên toàn thế giới. theie7countdown.com
Justin

8

Với số lượng lớn các câu trả lời tôi sẽ không đăng. Tuy nhiên, phương pháp này có thể giúp được ai đó, vì nó đã giúp tôi.

Tránh xa phao bất cứ khi nào có thể

Điều đáng nói là, tôi tránh những người nổi như Ebola. Có nhiều lý do và tôi không đơn độc; Đọc câu trả lời của Rikudo về một từ rõ ràng và bạn sẽ thấy những gì tôi muốn nói. Nói cách riêng của mình:...the use of floated elements for layout is getting more and more discouraged with the use of better alternatives...

Có những lựa chọn tốt khác (và đôi khi tốt hơn) ngoài những cái phao. Khi công nghệ tiến bộ và cải tiến, flexbox (và các phương pháp khác) sẽ được áp dụng rộng rãi và phao sẽ trở thành một bộ nhớ tồi. Có lẽ là CSS4?


Float misbehavior và xóa thất bại

Trước hết, đôi khi, bạn có thể nghĩ rằng bạn an toàn khỏi phao cho đến khi phao cứu sinh của bạn bị thủng và dòng html của bạn bắt đầu chìm:

Trong codepen http://codepen.io/omarjuvera/pen/jEXBya dưới đây, thực hành xóa một float với <div classs="clear"></div>(hoặc yếu tố khác) là phổ biến nhưng cau mày và chống ngữ nghĩa.

<div class="floated">1st</div>
<div class="floated">2nd</div>
<div class="floated">3nd</div>
<div classs="clear"></div> <!-- Acts as a wall -->
<section>Below</section>

CSS

div {
    border: 1px solid #f00;
    width: 200px;
    height: 100px;
}

div.floated {
    float: left;
}

.clear {
    clear: both;
}
section {
    border: 1px solid #f0f;
}

Tuy nhiên , ngay khi bạn nghĩ chiếc phao của bạn là cánh buồm xứng đáng ... bùng nổ! Khi kích thước màn hình trở nên nhỏ hơn và nhỏ hơn, bạn sẽ thấy các hành vi kỳ lạ giống như đồ họa bên dưới (Cùng http://codepen.io/omarjuvera/pen/jEXBya ):

mẫu lỗi float 1

Tại sao bạn cần quan tâm? Tôi không chắc chắn về con số chính xác nhưng khoảng 80% (hoặc hơn) các thiết bị được sử dụng là thiết bị di động có màn hình nhỏ. Máy tính để bàn / máy tính xách tay không còn là vua.


Nó chưa dừng lại ở đó

Đây không phải là vấn đề duy nhất với phao. Có rất nhiều, nhưng trong ví dụ này, một số có thể nói all you have to do is to place your floats in a container. Nhưng như bạn có thể thấy trong codepen và đồ họa, đó không phải là trường hợp. Nó rõ ràng làm cho mọi thứ tồi tệ nhất:

HTML

<div id="container" class="">
  <div class="floated">1st</div>
  <div class="floated">2nd</div>
  <div class="floated">3nd</div>
</div> <!-- /#conteiner -->
<div classs="clear"></div> <!-- Acts as a wall -->
<section>Below</section>

CSS

#container {
  min-height: 100px; /* To prevent it from collapsing */
  border: 1px solid #0f0;
}
.floated {
    float: left;
    border: 1px solid #f00;
    width: 200px;
    height: 100px;
}

.clear {
    clear: both;
}
section {
    border: 1px solid #f0f;
}

Còn kết quả thì sao?

Nó giống nhau! mẫu phao 2

Ít nhất bạn biết, bạn sẽ bắt đầu một bữa tiệc CSS, mời tất cả các loại công cụ chọn và thuộc tính cho bữa tiệc; làm cho một mớ CSS lớn hơn so với những gì bạn bắt đầu. Chỉ để sửa chữa nổi của bạn.


CSS Clearfix để giải cứu

Đoạn CSS đơn giản và rất dễ thích nghi này là một vẻ đẹp và là "vị cứu tinh":

.clearfix:before, .clearfix:after { 
    content: "";
    display: table;
    clear: both;
    zoom: 1; /* ie 6/7 */
}

Đó là nó! Nó thực sự hoạt động mà không phá vỡ ngữ nghĩa và tôi đã đề cập đến nó hoạt động? :

Từ cùng một mẫu ... HTML

<div class="clearfix">
    <div class="floated">1st</div>
    <div class="floated">2nd</div>
    <div class="floated">3nd</div>
</div>
<section>Below</section>

CSS

div.floated {
    float: left;
    border: 1px solid #f00;
    width: 200px;
    height: 100px;
}
section {
        border: 4px solid #00f;
}


.clearfix:before, .clearfix:after { 
    content: "";
    display: table;
    clear: both;
    zoom: 1; /* ie 6/7 */
}

Bây giờ chúng tôi không còn cần <div classs="clear"></div> <!-- Acts as a wall -->và giữ cho cảnh sát ngữ nghĩa hạnh phúc. Đây không phải là lợi ích duy nhất. Clearfix này đáp ứng với mọi kích thước màn hình mà không cần sử dụng @mediaở dạng đơn giản nhất. Nói cách khác, nó sẽ giữ thùng phao của bạn trong tầm kiểm soát và ngăn chặn lũ lụt. Cuối cùng, nó cung cấp hỗ trợ cho tất cả các trình duyệt cũ trong một karate chop nhỏ =)

Đây là một lần nữa

.clearfix:before, .clearfix:after { 
    content: "";
    display: table;
    clear: both;
    zoom: 1; /* ie 6/7 */
}

2
Lý do tại sao phần tử với cleartên lớp không hoạt động là thuộc tính của bạn classsai. Những gì bạn đã viết là classs, với một bổ sung s.
hạt dẻ

Ví dụ của bạn không thể hiện những gì bạn yêu cầu, ngay cả sau khi sửa lỗi.
Khôi phục Monica - notmaynard

7

Tôi luôn thả nổi các phần chính của lưới và áp dụng clear: both;cho phần chân trang. Điều đó không yêu cầu thêm div hoặc lớp.


Neil, tôi đoán rắc rối xảy ra khi bạn muốn có một đường viền xung quanh cả hai cột của bạn (hoặc màu nền / hình ảnh), bạn cần một phần trình bao bọc cần hack.
Simon East

5

thành thật; tất cả các giải pháp dường như là một bản hack để sửa lỗi kết xuất ... tôi có sai không?

Tôi đã tìm thấy <br clear="all" />là dễ nhất, đơn giản nhất. nhìn thấy class="clearfix"mọi nơi không thể vuốt ve sự nhạy cảm của một người phản đối các yếu tố markeup ngoại lai, phải không? bạn chỉ đang vẽ vấn đề trên một bức tranh khác.

tôi cũng sử dụng display: hiddengiải pháp này, rất tốt và không yêu cầu khai báo lớp bổ sung hoặc đánh dấu html ... nhưng đôi khi bạn cần các phần tử để tràn vào vùng chứa, ví dụ như. những dải ruy băng xinh xắn


5
overflow: hiddenTôi nghĩ bạn có nghĩa là
ajbeaven

Một số đề nghị sử dụng lớp được gọi là nhóm làm cho mọi thứ có ngữ nghĩa hơn. Tôi thực sự không chắc chắn tại sao điều này không bị bắt
Damon

tôi hoàn toàn rút lại vị trí này. Tôi chỉ sử dụng Clearfix bây giờ. nhưng trên các thùng chứa rất phổ biến, tôi 'nướng' nó vào css để cắt giảm ô nhiễm thuộc tính lớp. Ngoài ra, đặt tên nó là "nhóm" có vẻ tốt. ít ký tự để gõ là tốt
duggi


4

Tôi đã thử tất cả các giải pháp này, một biên độ lớn sẽ được thêm vào <html>phần tử tự động khi tôi sử dụng mã dưới đây:

.clearfix:after {   
    visibility: hidden;   
    display: block;   
    content: ".";   
    clear: both;   
    height: 0;
}

Cuối cùng, tôi đã giải quyết vấn đề lề bằng cách thêm font-size: 0;vào CSS ở trên.


2
Đó là bởi vì bạn đang thêm một dòng với ., chỉ cần sử dụngcontent: ""
Bốn mươi

4

Với SASS, tiền tố rõ ràng là:

@mixin clearfix {
    &:before, &:after {
        content: '';
        display: table;
    }
    &:after {
        clear: both;
    }
    *zoom: 1;
}

và nó được sử dụng như:

.container {
    @include clearfix;
}

nếu bạn muốn mã xóa mới:

@mixin newclearfix {
    &:after {
        content:"";
        display:table;
        clear:both;
    }
}

4

Với LESS ( http://lesscss.org/ ), người ta có thể tạo một trình trợ giúp xóa mã tiện dụng:

.clearfix() {
  zoom: 1;
  &:before { 
    content: ''; 
    display: block; 
  }
  &:after { 
    content: ''; 
    display: table; 
    clear: both; 
  }
}

Và sau đó sử dụng nó với các thùng chứa có vấn đề, ví dụ:

<!-- HTML -->
<div id="container">
  <div id="content"></div>
  <div id="sidebar"></div>
</div>
/* LESS */
div#container {
  .clearfix();
}

4

Sử dụng overflow:hidden/ autovà chiều cao cho eg6 sẽ đủ nếu thùng chứa nổi có phần tử cha.

Một trong những #test có thể hoạt động, đối với HTML được nêu dưới đây để xóa số float.

#test {
  overflow:hidden; // or auto;
  _height:1%; forces hasLayout in IE6
}

<div id="test">
  <div style="floatLeft"></div>
  <div style="random"></div>
</div>

Trong trường hợp khi điều này từ chối làm việc với eg6, chỉ cần thả cha mẹ để xóa float.

#test {
  float: left; // using float to clear float
  width: 99%;
}

Không bao giờ thực sự cần bất kỳ loại thanh toán bù trừ nào khác. Có lẽ đó là cách tôi viết HTML của mình.


1
Tôi muốn nghiên cứu cách viết HTML của bạn mà không xóa bất kỳ yếu tố nào. Bạn có thể gửi một số liên kết?
Starx

4

Một giá trị hiển thị mới dường như cho công việc trong một dòng.

display: flow-root;

Từ thông số W3: "Phần tử tạo ra hộp chứa khối và đưa ra nội dung của nó bằng cách sử dụng bố cục luồng. Nó luôn thiết lập bối cảnh định dạng khối mới cho nội dung của nó."

Thông tin: https://www.w3.org/TR/css-display-3/#valdef-display-flow-root https://www.chromestatus.com/feature/5769454877147136

※ Như được hiển thị trong liên kết ở trên, hỗ trợ hiện bị giới hạn nên hỗ trợ dự phòng như bên dưới có thể được sử dụng: https://github.com/fliptheweb/postcss-flow-root


3

Tôi cũng sẽ nổi #content, theo cách đó cả hai cột đều chứa phao. Cũng bởi vì nó sẽ cho phép bạn xóa các yếu tố bên trong #contentmà không cần xóa thanh bên.

Điều tương tự với trình bao bọc, bạn cần đặt bối cảnh định dạng khối để bọc hai cột.

Bài viết này đề cập đến một vài kích hoạt bạn có thể sử dụng: chặn bối cảnh định dạng .


3

Clearfix là một cách để một phần tử tự động xóa sau đó, do đó bạn không cần thêm đánh dấu bổ sung.

.clearfix:after {
   content: " "; /* Older browser do not support empty content */
   visibility: hidden;
   display: block;
   height: 0;
   clear: both;
}
.cleaner {
  clear: both;
}

Thông thường bạn sẽ cần phải làm một cái gì đó như sau:

<div style="float: left;">Sidebar</div>
<div class="cleaner"></div> <!-- Clear the float -->

Với Clearfix, bạn chỉ cần

<div style="float: left;" class="clearfix">Sidebar</div>
<!-- No Clearing div! -->

2

Tại sao chỉ cố gắng sử dụng css hack để làm những gì 1 dòng HTML thực hiện công việc. Và tại sao không sử dụng ngữ nghĩa html tu đặt break để trở về dòng?

Đối với tôi thực sự tốt hơn để sử dụng:

<br style="clear:both" />

Và nếu bạn không muốn bất kỳ kiểu nào trong html của mình, bạn chỉ cần sử dụng lớp để nghỉ và đưa .clear { clear:both; }CSS vào.

Ưu điểm của việc này:

  • Sử dụng ngữ nghĩa của html để quay lại dòng
  • Nếu không tải CSS, nó sẽ hoạt động.
  • Không cần thêm mã CSS và Hack
  • không cần mô phỏng br với CSS, nó đã tồn tại trong HTML

2

Giả sử bạn đang sử dụng cấu trúc HTML này:

<div id="container">
  <div id="content">
  </div>
  <div id="sidebar">
  </div>
</div>

Đây là CSS mà tôi sẽ sử dụng:

div#container {
    overflow: hidden;    /* makes element contain floated child elements */
}

div#content, div#sidebar {
    float: left;
    display: inline;    /* preemptively fixes IE6 dobule-margin bug */
}

Tôi sử dụng bộ này mọi lúc và nó hoạt động tốt với tôi, ngay cả trong IE6.


2

Không giống như các loại tiền tố khác, đây là một loại kết thúc mở không có thùng chứa

Các loại tiền tố khác hoặc yêu cầu phần tử nổi phải nằm trong một thùng chứa được đánh dấu tốt hoặc cần thêm một phần trống, về mặt ngữ nghĩa <div>. Ngược lại, việc phân tách rõ ràng nội dung và đánh dấu đòi hỏi một giải pháp CSS nghiêm ngặt cho vấn đề này.

Thực tế là người ta cần đánh dấu sự kết thúc của một float, không cho phép sắp chữ CSS không giám sát .

Nếu mục đích sau là mục tiêu của bạn, thì float sẽ được mở cho bất kỳ thứ gì (đoạn văn, danh sách được sắp xếp và không có thứ tự, v.v.) để bọc xung quanh nó, cho đến khi gặp phải "Clearfix". Ví dụ: Clearfix có thể được đặt bởi một tiêu đề mới.

Đây là lý do tại sao tôi sử dụng mã xóa sau với các tiêu đề mới:

h1 {
    clear: both;
    display: inline-block;
    width: 100%;
}

Giải pháp này được sử dụng rộng rãi trên trang web của tôi để giải quyết vấn đề: Văn bản bên cạnh hình thu nhỏ nổi là ngắn và lề trên của đối tượng bù trừ tiếp theo không được tôn trọng.

Nó cũng ngăn chặn mọi can thiệp thủ công khi tự động tạo tệp PDF từ trang web. Đây là một trang ví dụ .


2

Tôi luôn luôn sử dụng micro-Clearfix :

.cf:before,
.cf:after {
    content: " ";
    display: table;
}

.cf:after {
    clear: both;
}

/**
 * For IE 6/7 only
 */
.cf {
    *zoom: 1;
}

Trong Cascade Framework, tôi thậm chí áp dụng nó theo mặc định cho các phần tử mức khối. IMO, áp dụng nó theo mặc định trên các phần tử mức khối cho phép các phần tử mức khối hoạt động trực quan hơn so với hành vi truyền thống của chúng. Nó cũng giúp tôi dễ dàng hơn rất nhiều khi thêm hỗ trợ cho các trình duyệt cũ hơn vào Cascade Framework (hỗ trợ IE6-8 cũng như các trình duyệt hiện đại).


0

Bạn cũng có thể đặt cái này trong CSS của bạn:

.cb:after{
  visibility: hidden;
  display: block;
  content: ".";
  clear: both;
  height: 0;
}

*:first-child+html .cb{zoom: 1} /* for IE7 */

Và thêm lớp "cb" vào div cha của bạn:

<div id="container" class="cb">

Bạn sẽ không cần thêm bất cứ điều gì khác vào mã gốc của mình ...


0

#content{float:left;}
#sidebar{float:left;}
.clear{clear:both; display:block; height:0px; width:0px; overflow:hidden;}
<div id="container">
  <div id="content">text 1 </div>
  <div id="sidebar">text 2</div>
  <div class="clear"></div>
</div>


-2

Bạn đã thử điều này:

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

Tôi chưa có vấn đề gì với phương pháp này.


2
Tôi nghĩ vấn đề là chúng tôi đang cố gắng tránh cả kiểu đánh dấu bổ sung và kiểu nội tuyến với giải pháp này. Nó phụ thuộc vào sự thỏa hiệp nào hạnh phúc nhất của bạn với tôi cho rằng
Sam Murray-Sutton

1
Vấn đề với phương pháp này là trong các trình duyệt IE, div có chiều cao, do đó khoảng cách của bạn sẽ bị tắt. Đó là lý do tại sao các phương thức css đặt chiều cao và kích thước phông chữ.
zznq

bạn cần nói <div style = "Clear: cả"> </ div> với một thẻ đóng phù hợp để tuân thủ đúng XHTML. Tôi đã gặp sự cố với jQuery khi không làm điều này
Simon_Weaver

1
Trớ trêu thay, "phải-to-be-tự-khép kín" <div/> X (HT) ML tuân thủ, nhưng không phải là HTML tương thích , vì vậy cho các tài liệu phục vụ như là text/htmltất cả các trình duyệt sẽ đối xử với nó như thẻ không khép kín. Thật không có những thứ như thẻ tự đóng cho các text/htmltài liệu, bất kể tài liệu là gì , không may.
Ilya Streltsyn

-2

Phương pháp yêu thích của tôi là tạo một lớp Clearfix trong tài liệu css / scss của tôi như dưới đây

.clearfix{
    clear:both
}

Và sau đó gọi nó trong tài liệu html của tôi như dưới đây

<html>
  <div class="div-number-one">
    Some Content before the clearfix
  </div>

  <!-- Let's say we need to clearfix Here between these two divs --->
  <div class="clearfix"></div>

  <div class="div-number-two">
    Some more content after the clearfix
  </div>
</html>

-2

Nó rất đơn giản để xóa vấn đề bằng cách khi chúng ta sử dụng các thuộc tính float bên trong phần tử div. Nếu chúng ta sử dụng hai phần tử div một là float: left; và một cái khác như float: phải; chúng ta có thể sử dụng Clearfix cho cha của phần tử div. Nếu chúng tôi từ chối sử dụng Clearfix, các khoảng trắng không cần thiết sẽ điền vào nội dung bên dưới và cấu trúc trang web sẽ bị phá vỡ.

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.