Понимание класса clearfix Bootstrap
.clearfix {
*zoom: 1;
&:before,
&:after {
display: table;
content: "";
// Fixes Opera/contenteditable bug:
// http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952
line-height: 0;
}
&:after {
clear: both;
}
}
- Почему бы не использовать
display:block
? - кроме того, почему это также относится к
::before
псевдокласса?
3 ответов
.clearfix
определена в less/mixins.less
. Прямо над его определением находится комментарий со ссылкой на эту статью:
в статье объясняется, как все это работает.
обновление: да, только ссылки ответы плохие. Я знал это даже в то время, когда я опубликовал этот ответ, но я не чувствовал, что копирование и вставка были в порядке из-за авторских прав, плагиата и что у вас есть. Впрочем, я сейчас чувствую, что все в порядке, так как я связан с оригинальной статьей. Я должен также упомянуть имя автора, хотя, для кредита: Николя Галлахер. Вот мясо статьи (обратите внимание, что" метод Тьерри " относится к "clearfix reloaded" Тьерри Кобленца):
этот "micro clearfix" генерирует псевдо-элементы и устанавливает их
display
totable
. Это создает анонимная таблица-ячейка и a новый контекст форматирования блока, который означает:before
псевдо-элемент мешает топ-маржа крах. The:after
псевдо-элемент используется для снимите поплавки. В результате нет необходимости скрывать сгенерированные содержание и общее количество необходимого кода уменьшается.в том числе
:before
переключатель не очистить плывет, но это предупреждает Верхние Поля от коллапса в современном броузеры. Это имеет два преимущества:
это обеспечивает визуальную согласованность с другими методами удержания float, которые создают новый контекст форматирования блока, например,
overflow:hidden
это обеспечивает визуальную согласованность с IE 6/7, когда это.
Б. Н.: есть обстоятельства, при которых IE 6/7 не будет содержать Нижние поля поплавков в новом контексте форматирования блока. Более подробную информацию можно найти здесь: лучше поплавок сдерживания в IE использование выражений CSS.
использование
content:" "
(обратите внимание на пробел в строке контент) избегает Ан Opera bug это создает пространство вокруг clearfixed элементов, еслиcontenteditable
атрибут также присутствует где-то в HTML. Спасибо Sergio Cerrutti за обнаружение этого исправления. Альтернативное исправление использоватьfont:0/0 a
.Наследие Firefox
Firefox visibility:hidden чтобы скрыть вставленный символ. Этот потому что устаревшие версии Firefox необходимо
content:"."
чтобы избежать дополнительное пространство междуbody
и его первый дочерний элемент, при определенных обстоятельствах (например, jsfiddle.net/necolas/K538S/.)альтернативные методы float-containment, которые создают новый блок форматирование контекста, например applying
overflow:hidden
илиdisplay:inline-block
для элемент-контейнер, также избегать этого поведение в старых версиях Firefox.
The :before
псевдо элемент не требуется для самого clearfix hack.
это просто дополнительная приятная функция, помогающая предотвратить падение маржи первого дочернего элемента. Таким образом, верхний край дочернего блочного элемента элемента "clearfixed" гарантированно расположен ниже верхней границы элемента clearfixed.
display:table
используется, потому что display:block
не делает трюк. Используя display:block
маржи коллапс даже с :before
элемент.
есть одно предостережение: если vertical-align:baseline
используется в ячейках таблицы с clearfixed <div>
элементы, Firefox не будет выравниваться хорошо. Тогда вы можете предпочесть использовать display:block
несмотря на потерю функции защиты от коллапса. В случае дальнейшего интереса прочитайте эту статью:Clearfix мешает вертикальному выравниванию.
когда clearfix используется в Родительском контейнере, он автоматически обертывает все дочерние элементы.
он обычно используется после плавающих элементов для очистки макета float.
когда используется float layout, он будет горизонтально выравнивать дочерние элементы. Clearfix очищает это поведение.
Пример-Панели Bootstrap
в bootstrap, когда используется панель класса, есть 3 дочерних типа: panel-header, panel-body, панель-футер. Все из которых имеют дисплей: макет блока, но панель-тело имеет предварительно примененное clearfix. panel-body-это основной тип контейнера, тогда как panel-header & panel-footer не предназначен для контейнера, он просто предназначен для хранения некоторого базового текста.
при добавлении плавающих элементов родительский контейнер не обертывается вокруг этих элементов, поскольку высота плавающих элементов не наследуется родительским контейнером.
Так для панели-коллектора и панели-футер, clearfix необходим для очистки float-макета элементов: Класс Clearfix дает визуальный вид, что высота родительского контейнера была увеличена для размещения всех его дочерних элементов.
<div class="container">
<div class="panel panel-default">
<div class="panel-footer">
<div class="col-xs-6">
<input type="button" class="btn btn-primary" value="Button1">
<input type="button" class="btn btn-primary" value="Button2">
<input type="button" class="btn btn-primary" value="Button3">
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-footer">
<div class="col-xs-6">
<input type="button" class="btn btn-primary" value="Button1">
<input type="button" class="btn btn-primary" value="Button2">
<input type="button" class="btn btn-primary" value="Button3">
</div>
<div class="clearfix"/>
</div>
</div>
</div>