Является ли clearfix устаревшим? - PullRequest
48 голосов
/ 06 апреля 2011

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

Одним из способов решения этой проблемы является «clearfix» , который добавляет ряд правил CSS для обеспечения правильного растяжения контейнера.

Однако, просто присвоение контейнера overflow: hidden, похоже, работает так же хорошо и с той же степенью совместимости с браузером.

Согласно этому руководству , оба метода совместимы со всеми важными сегодня браузерами.

Значит ли это, что "clearfix" устарела? Есть ли какое-либо преимущество в использовании по сравнению с overflow: hidden?

Здесь очень похожий вопрос: В чем разница между взломом clearfix и переполнением: скрытое и переполнение: автоматическое? но на этот вопрос на самом деле нет ответа.

Ответы [ 8 ]

32 голосов
/ 06 апреля 2011

Вы можете в значительной степени использовать overflow: hidden все время.

Но, являются исключениями.Вот пример одного из них:

Переполнение контейнера div по горизонтали, но не по вертикали

Вопрос был:


Вот более важный пример, когда вы не можете использовать overflow: hidden:

http://fordinteractive.com/misc/overflow/

Это не означает, что clearfix является альтернативой only - display: inline-block чисто исправляет этот пример:

http://jsbin.com/ubapog

10 голосов
/ 06 апреля 2011

Как уже упоминалось в другом ответе, недостатком hidden является то, что он удивительным образом скрывает такие вещи, как выпадающие меню.Однако есть другой способ содержать одну строку, перемещая родительский контейнер.Обычно это работает там, где у overflow: hidden есть недостатки, а также всплывающие подсказки помогают с множеством устаревших проблем с IE, особенно в списках.Если вы можете использовать ширину, то я бы использовал «float in the float», или display: inline-block.

Я не говорю, что «clearfix» бесполезен - но для меня он слишком широко внедрен вТемы CMS (такие как Wordpress и Drupal), которые, как мне кажется, во многих случаях используются слишком часто, и в div, которые на самом деле не нужно очищать или содержать.

Я не могу придумать ситуациюгде я не могу использовать ни переполнение, ни плавающее, по сравнению с clearfix, но мой мозг находится в режиме праздника - но так как clearfix, это решение для копирования / вставки, которое иногда проще всего рекомендовать, однако оно должно быть тем, которое устанавливаетhasLayout для IE, который, разумеется, и переполнение, и float тоже теперь делают.


добавлено это только что появилось снова: мозг не в режиме праздника ..

Я действительно начинаю думать, да, clearfix не нужен (по крайней мере, я еще не нашел пример, где он есть), даже пример @ тридцатки выше можно обойти с помощью display: inline-block и до сих пор IE6 sКроме того, контейнер с фиксированной шириной имеет требование IE7 и ниже hasLayout, и, сделав его встроенным блоком для всех других браузеров, он может быть отцентрирован, и «смещенные» прикрепляющие элементы будут нормально работать, пока контейнер растягивается вертикально

Пример

Я также видел ссылку на новый улучшенный clearfix для тех коллапсирующих полей, использующих :before, а также :after в хакере clearfix, ноесли только я что-то упустил, демоверсия имеет дефект - в элементах pre есть неравномерный пробел, и поля "clearfixed" фактически не содержат поплавков, как только вы выпустите элементы вих каждый метод выполняет одинаково.

Обратите внимание, поля на pre элементах не реагируют так же, как другие (так что попробуйте его с отступом вместо поля, чтобы увидеть ту же картинку во время тестирования) ... и есть еще один IE "foible"при этом IE не содержит полей должным образом, если они не указаны явно, а в демоверсии есть явные поля для h2, но не p, поэтому все вещи равны элементу с фиксированными значениями, как у TJK в этом примерестраница искусственно заставляет сдерживать поля в обычном элементе блока, почти так же, как это делает верхний / нижний отступ 1px, потому что браузеры все равно делают это по-другому!

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

См. Демоверсию перезагрузки

Итако мой разум больше не нуждается в этом способе «clearfix», просто найдите лучший способ создать этот новый контекст блочного форматирования, используя haslayout для более старых IE .. свойства для обоих одинаковы!

какВ своей статье TJK указывает: http://www.yuiblog.com/blog/2010/09/27/clearfix-reloaded-overflowhidden-demystified/

Лучшие альтернативы

Если вы можете применить ширину к элементу, содержащему числа с плавающей запятой, то ваш лучший вариантдолжен использовать:

display: inline-block; width: <any explicit value>;

Я думаю, что это справедливо, и даже со 100% элементами, которые могут нуждаться в заполнении, вы можете сделать это в сочетании с box-sizing

.clearfix {
  display: inline-block;
  width: 100%;
  *width: auto;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
}
8 голосов
/ 06 апреля 2011

overflow:hidden очень «мощный» (я использовал его в течение нескольких лет, и я согласен с тем, что сказал Дэвид), но в то же время подвергается проблеме.Если, например, внутри контейнера у вас есть элементы abs, которые вы должны перетаскивать за пределы него, вы не сможете увидеть их вне контейнера.В этом конкретном случае вам нужно использовать этот трюк 'clearfix';)

2 голосов
/ 12 августа 2015

Да, это "устарело" Отображение CSS L3 :

Созданы flow и flow-root внутренние типы отображения чтобы лучше выразить макет потока отображать типы и создать явный переключатель для создания элемента в корне BFC . (Это должно избавить от необходимости таких хаков, как ::after { clear: both; } и overflow: hidden, которые предназначены для достижения этой цели.)

Итак, теперь правильный путь -

display: flow-root;

К сожалению, это недавнее дополнение, поэтому браузеры еще не реализовали его.

1 голос
/ 18 января 2016

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

По мнению экспертов , эту версию вы должны использовать сегодня:

.clearfix:after {
    content: "";
    display: table;
    clear: both;
}
1 голос
/ 27 апреля 2011

Примечание: Убедитесь, что у вас установлен правильный DOCTYPE, если вы только тестируете. Поймал меня несколько раз, и я всегда забыл!

В IE9, например, следующее просто не будет работать без <!DOCTYPE html> вверху.

<!DOCTYPE html>
<html>

<style>

#bottom_panel {
    overflow: hidden;
    background: orange;
    border:1px solid red;
}

#bottom_panel .col1 {
    background: red;
    float: left;
    width: 100px
}

#bottom_panel .col2 {
    background: yellow;
    float: left;
    width: 70px
}

#bottom_panel .col3 {
    background: green;
    float: left;
    width: 150px
}

.clear {
    clear: both;
}

</style>

<div id="bottom_panel">

    <div class="col1">this is col 1</div>
    <div class="col2">this is col 2. It's taller than the other columns because it's got more text in ot</div>
    <div class="col3">this is col 3</div>

</div>

<div>
This should not be floating around! Should be underneath the columns!
</div>

</html>
1 голос
/ 06 апреля 2011

Я недавно обнаружил, к моему приятному удивлению, что overflow:hidden в настоящее время работает отлично. Я использовал метод clearfix примерно 6 месяцев назад, и по сравнению с ним он довольно раздутый.

1 голос
/ 06 апреля 2011

Я рекомендую метод overflow: hidden в течение многих лет. Широко поддерживается.

...