Какие методы «clearfix» я могу использовать? - PullRequest
844 голосов
/ 17 октября 2008

У меня есть давняя проблема div, оборачивающая макет из двух столбцов. Моя боковая панель всплыла, поэтому мой контейнер div не может обернуть содержимое и боковую панель.

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

Похоже, существует множество способов исправления ошибки в Firefox:

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

В моей ситуации единственное, что, кажется, работает правильно - это решение <br clear="all"/>, которое немного неопрятно. overflow:auto дает мне мерзкие полосы прокрутки, а overflow:hidden обязательно должен иметь побочные эффекты. Кроме того, IE7, очевидно, не должен страдать от этой проблемы из-за его неправильного поведения, но в моей ситуации он страдает так же, как Firefox.

Какой метод, доступный в настоящее время для нас, является наиболее надежным?

Ответы [ 28 ]

1023 голосов
/ 27 октября 2009

В зависимости от разрабатываемого дизайна каждое из приведенных ниже CSS-решений clearfix имеет свои преимущества.

У clearfix есть полезные приложения, но он также использовался как взлом. Прежде чем использовать clearfix, возможно, эти современные css-решения могут быть полезны:


Современные решения Clearfix


Контейнер с overflow: auto;

Самый простой способ очистить плавающие элементы - использовать стиль overflow: auto для содержащего элемента. Это решение работает во всех современных браузерах.

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

Один недостаток - использование определенных комбинаций полей и отступов на внешнем элементе может привести к появлению полос прокрутки, но это можно решить, поместив поля и отступы на другой родительский элемент.

Использование «переполнения: скрытое» также является решением для устранения неполадок, но не будет иметь полос прокрутки, однако при использовании hidden будет обрезано любое содержимое, расположенное за пределами содержащего элемента.

Примечание: Плавающий элемент является тегом img в этом примере, но может быть любым элементом html.


Clearfix Reloaded

Тьерри Кобленц из CSSMojo писал: Самый последний перезагруженный файл исправлений . Он отметил, что отказавшись от поддержки oldIE, решение можно упростить до одного оператора css. Кроме того, использование display: block (вместо display: table) позволяет правильно свернуть поля, если элементы с clearfix являются братьями и сестрами.

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

Это самая современная версия clearfix.


Старые решения Clearfix

Указанные ниже решения не являются необходимыми для современных браузеров, но могут быть полезны для таргетинга на старые браузеры.

Обратите внимание, что эти решения основаны на ошибках браузера и поэтому должны использоваться только в том случае, если ни одно из перечисленных выше решений не работает для вас.

Они перечислены примерно в хронологическом порядке.


"Beat That ClearFix", исправление для современных браузеров

Тьерри Кобленц из CSS Mojo отметил, что при таргетинге на современные браузеры мы можем теперь отбрасывать свойства / значения zoom и ::before и просто использовать:

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

Это решение не поддерживает IE 6/7 ... специально!

Тьерри также предлагает: " Слово предостережения : если вы начинаете новый проект с нуля, сделайте это, но не меняйте эту технику на ту, которая у вас есть сейчас, потому что даже если вы не поддерживайте oldIE, ваши существующие правила предотвращают падение полей. "


Micro Clearfix

Самое последнее и всемирно принятое решение для clearfix, Micro Clearfix от Nicolas Gallagher .

Известная поддержка: Firefox 3.5+, Safari 4+, Chrome, Opera 9+, IE 6 +

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

Свойство переполнения

Этот основной метод предпочтителен для обычного случая, когда позиционированный контент не будет отображаться за пределами контейнера.

http://www.quirksmode.org/css/clearing.html - объясняет, как решить общие проблемы, связанные с этой техникой, а именно, установить width: 100% для контейнера.

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

Вместо использования свойства display для установки «hasLayout» для IE, другие свойства могут использоваться для , вызывая «hasLayout» для элемента .

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

Другой способ очистить поплавки с помощью свойства overflow - использовать хак с подчеркиванием . IE будет применять значения с префиксом подчеркивания, другие браузеры - нет. Свойство zoom вызывает hasLayout в IE:

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

Хотя это работает ... не рекомендуется использовать хаки.


ПИРОГ: легкий метод очистки

Этот старый метод "Easy Clearing" имеет преимущество, заключающееся в том, что позиционируемые элементы могут висеть за пределами контейнера, за счет более сложного CSS.

Это сРешение довольно старое, но вы можете узнать все о Easy Clearing на позиции все: http://www.positioniseverything.net/easyclearing.html


Элемент, использующий свойство "clear"

Быстрое и грязное решение (с некоторыми недостатками), когда вы быстро что-то шлепаете:

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

1135 * Недостатки * Он не реагирует и, следовательно, может не дать желаемого эффекта, если стили макета меняются в зависимости от медиазапросов. Решение в чистом CSS более идеальное. Добавляет HTML-разметку без необходимости добавления какого-либо семантического значения. Требуется встроенное определение и решение для каждого экземпляра, а не ссылка на класс для одного решения «clearfix» в CSS и ссылки на классы в html. Это затрудняет работу с кодом для других, поскольку им, возможно, придется написать больше хаков, чтобы обойти его. В будущем, когда вам понадобится / вы захотите использовать другое решение clearfix, вам не придется возвращаться назад и удалять каждый тег <br style="clear: both" />, замусоренный вокруг разметки.

70 голосов
/ 29 марта 2012

Какие проблемы мы пытаемся решить?

При плавающих вещах есть два важных соображения:

  1. Содержит поплавки потомка. Это означает, что рассматриваемый элемент становится достаточно высоким, чтобы обернуть всех плавающих потомков. (Они не висят снаружи.)

    Floating content hanging outside its container

  2. Изоляция потомков от внешних поплавков. Это означает, что потомки внутри элемента должны иметь возможность использовать clear: both и не иметь возможности взаимодействовать с поплавками вне элемента.

    imageclear: both interacting with a float elsewhere in the DOM">

Блокировать контексты форматирования

Есть только один способ сделать то и другое. И это для установки нового контекста форматирования блока . Элементы, которые устанавливают контекст форматирования блока, представляют собой изолированный прямоугольник, в котором поплавки взаимодействуют друг с другом. Контекст форматирования блока всегда будет достаточно высоким для визуального переноса его плавающих потомков, и никакие плавающие объекты вне контекста форматирования блока не могут взаимодействовать с элементами внутри. Эта двусторонняя изоляция - именно то, что вы хотите. В IE эта же концепция называется hasLayout , которую можно установить с помощью zoom: 1.

Существует несколько способов установить контекст блочного форматирования, но я рекомендую решение display: inline-block с width: 100%. (Конечно, есть обычных предупреждений с использованием width: 100%, поэтому используйте box-sizing: border-box или поместите padding, margin и border на другой элемент.)

Самое надежное решение

Вероятно, наиболее распространенным применением поплавков является двухколоночная схема. (Может быть расширен до трех столбцов.)

Первая структура разметки.

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

А теперь 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 */
}

Попробуй сам

Перейдите на JS Bin , чтобы поиграть с кодом и посмотреть, как это решение строится с нуля.

Традиционные методы исправления ошибок считаются вредными

Проблема с традиционными clearfix решениями заключается в том, что они используют две разные концепции рендеринга для достижения одной цели для IE и всех остальных. В IE они используют hasLayout для установки нового контекста форматирования блока, но для всех остальных они используют сгенерированные блоки (:after) с clear: both, что не устанавливает новый контекст форматирования блока. Это означает, что вещи не будут вести себя одинаково во всех ситуациях. Чтобы объяснить, почему это плохо, см. Все, что вы знаете о Clearfix, неверно .

54 голосов
/ 19 апреля 2013

Новый стандарт, используемый Inuit.css и Bourbon - две очень широко используемые и хорошо поддерживаемые платформы CSS / Sass:

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

Примечания

Имейте в виду, что clearfixes - это, по сути, хак для того, что макеты flexbox теперь могут предоставить намного умнее . Первоначально CSS-плавающие элементы были предназначены для обтекания встроенного содержимого - например, изображений в длинной текстовой статье, а не для макетов сетки и т. Если ваши целевые браузеры поддерживают flexbox , стоит посмотреть.

Это не поддерживает IE7. Вы не должны поддерживать IE7. Это продолжает подвергать пользователей незафиксированным уязвимостям безопасности и усложняет жизнь всем остальным веб-разработчикам, поскольку снижает нагрузку на пользователей и организации на переход на современные браузеры.

Это исправление было объявлено и объяснено Тьерри Кобленцем в июле 2012 года. Оно сбрасывает лишний вес с Микроочистка Николя Галлахера 2011 года . В процессе он освобождает псевдоэлемент для вашего собственного использования. Это было обновлено для использования display: block вместо display: table (опять же, кредит Тьерри Кобленцу).

27 голосов
/ 27 сентября 2010

Я рекомендую использовать следующее, взятое из 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;  
}
23 голосов
/ 10 февраля 2009

Свойство overflow можно использовать для очистки поплавков без дополнительной наценки:

.container { overflow: hidden; }

Это работает для всех браузеров, кроме IE6, где все, что вам нужно сделать, это включить hasLayout (масштабирование - мой предпочтительный метод):

.container { zoom: 1; }

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

17 голосов
/ 20 января 2009

Я нашел ошибку в официальном методе CLEARFIX: DOT не имеет размера шрифта. И если вы установите height = 0 и первый элемент в вашем DOM-дереве будет иметь класс «clearfix», у вас всегда будет поле внизу страницы 12px:)

Вы должны исправить это так:

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

Теперь это часть YAML-макета ... Просто посмотрите на это - это очень интересно! http://www.yaml.de/en/home.html

15 голосов
/ 21 апреля 2011

Это довольно аккуратное решение:

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

.cf:after {
    clear:both;
}

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

Известно, что он работает в Firefox 3.5+, Safari 4+, Chrome, Opera 9+, IE 6 +

Включая: перед селектором нет необходимости очищать поплавки, но это предотвращает разрушение верхних полей в современных браузерах. это гарантирует, что есть визуальная согласованность с IE 6/7, когда zoom: 1 приложенное.

С http://nicolasgallagher.com/micro-clearfix-hack/

10 голосов
/ 05 декабря 2012

Clearfix из начальной загрузки:

.clearfix {
  *zoom: 1;
}

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

.clearfix:after {
  clear: both;
}
8 голосов
/ 21 февраля 2011

Я просто использую: -

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

Лучше всего работает и совместим с IE8 +:)

8 голосов
/ 20 марта 2015

Учитывая огромное количество ответов, которые я не собирался публиковать. Однако этот метод может кому-то помочь, так как он мне помог.

Держитесь подальше от поплавков, когда это возможно

Стоит отметить, что я избегаю поплавков, таких как Эбола. Есть много причин, и я не одинок; Прочтите ответ Рикудо о что такое исправление , и вы поймете, что я имею в виду. По его собственным словам: ...the use of floated elements for layout is getting more and more discouraged with the use of better alternatives...

Есть и другие хорошие (а иногда и лучшие) варианты, кроме поплавков. По мере развития и совершенствования технологий, широкое распространение получат flexbox (и другие методы), и операции с плавающей точкой станут просто плохой памятью. Может быть CSS4?


Неправильное поведение с плавающей точкой и сбой очищает

Во-первых, иногда вы можете думать, что вы в безопасности от поплавков, пока ваш спасатель не проколется и ваш поток HTML не начнет снижаться:

В коде http://codepen.io/omarjuvera/pen/jEXBya ниже практика очистки поплавка с <div classs="clear"></div> (или другим элементом) является обычной, но осуждаемой и антисемантической.

<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;
}

Однако , именно тогда, когда вы думали, что ваш поплавок достоин паруса ... бум! Когда размер экрана становится все меньше и меньше, вы видите странное поведение, как показано на рисунке ниже (То же http://codepen.io/omarjuvera/pen/jEXBya):

float bug sample 1

Почему вы должны заботиться? Я не уверен в точной цифре, но около 80% (или более) используемых устройств - это мобильные устройства с маленькими экранами. Настольные компьютеры / ноутбуки больше не являются королями.


Это не заканчивается

Это не единственная проблема с поплавками. Их много, но в этом примере некоторые могут сказать all you have to do is to place your floats in a container. Но, как вы можете видеть на codepen и графике, это не так. Видимо, все стало хуже:

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;
}

Что касается результата?

Это чертовски то же самое! float bug sample 2

Меньше всего вы знаете, что вы создадите CSS-вечеринку, пригласив на нее все виды селекторов и свойств; создавая еще больший беспорядок в вашем CSS, чем то, с чего вы начали. Просто чтобы исправить ваш поплавок.


CSS Clearfix на помощь

Этот простой и очень адаптируемый фрагмент CSS - это красота и «спаситель»:

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

Вот и все! Это действительно работает без нарушения семантики, и я упоминал , что работает? :

Из того же образца ... 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 */
}

Теперь мы больше не нуждаемся в <div classs="clear"></div> <!-- Acts as a wall --> и сохраняем семантическую полицию счастливой. Это не единственное преимущество. Это исправление реагирует на любой размер экрана без использования @media в простейшем виде. Другими словами, он будет контролировать ваш поплавковый контейнер и предотвращать затопление. Наконец, он обеспечивает поддержку старых браузеров в одном небольшом отборе каратэ =)

Вот снова это исправление

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