Что такое БФК
BFC (контекст блочного форматирования): является частью CSS для визуального рендеринга веб-страниц и представляет собой область, в которой в процессе компоновки создаются блоки блочного уровня. Это также ограниченная область для взаимодействия между плавающими элементами и другими элементами.
Простое понимание состоит в том, что элемент с характеристиками BFC подобен контейнеру, и элементы внутри контейнера не будут влиять на внешние элементы с точки зрения макета.
Общие приложения BFC
Решить проблему схлопывания полей для обычных элементов блока документооборота.
<style>
* {
margin: 0;
padding: 0;
}
.demo div {
width: 40px;
height: 40px;
}
.demo1 {
margin: 10px 0;
background: pink;
}
.demo2 {
margin: 20px 0;
background: blue;
}
</style>
<div class="demo">
<div class="demo1"></div>
<div class="demo2"></div>
</div>
Два элемента блока видны с отступом в 20 пикселей.
Мы можем использовать BFC для решения этой проблемы, просто поместив два элемента в разные BFC для изоляции.
<style>
* {
margin: 0;
padding: 0;
}
.demo {
overflow: hidden;
}
.demo div {
width: 40px;
height: 40px;
}
.demo1 {
margin: 10px 0;
background: pink;
}
.demo2 {
margin: 20px 0;
background: blue;
}
</style>
<div class="demo">
<div class="demo1"></div>
</div>
<div class="demo">
<div class="demo2"></div>
</div>
Четкий поплавок BFC
Демо Демо:
<style>
* {
margin: 0;
padding: 0;
}
.demo {
border: 1px solid pink;
}
.demo p {
float: left;
width: 100px;
height: 100px;
background: blue;
}
</style>
<div class="demo">
<p></p>
</div>
Дочерние элементы в видимом элементе-контейнере являются плавающими, вне потока документа, а высота элемента-контейнера составляет всего 2 пикселя.
Решение:
.demo {
border: 1px solid pink;
overflow: hidden;
}
Предотвратить перекрытие обычных элементов потока документов плавающими элементами
демо демо:
<style>
* {
margin: 0;
padding: 0;
}
.demo1 {
width: 100px;
height: 100px;
float: left;
background: pink
}
.demo2 {
width: 200px;
height: 200px;
background: blue;
}
</style>
<div class="demo">
<div class="demo1">我是一个左侧浮动元素</div>
<div class="demo2">我是一个没有设置浮动, 也没有触发BFC的元素</div>
</div>
Часть области demo2 перекрывается плавающим элементом demo1, но текст не перекрывается, то есть эффект обтекания текстом.
Решение состоит в том, чтобы запустить BFC demo2.
.demo2 {
width: 200px;
height: 200px;
background: blue;
overflow: hidden;
}
Адаптивный двухколоночный макет
демо демо:
<style>
* {
margin: 0;
padding: 0;
}
.container {
}
.float {
width: 200px;
height: 100px;
float: left;
background: red;
opacity: 0.3;
}
.main {
background: green;
height: 100px;
overflow: hidden;
}
</style>
<div class="container">
<div class="float">
浮动元素
</div>
<div class="main">
自适应
</div>
</div>
Как активировать BFC
1. 根元素或包含根元素的元素
2. 浮动元素(元素的 float 不是 none)
3. 绝对定位元素(元素的 position 为 absolute 或 fixed)
4. 行内块元素(元素的 display 为 inline-block)
5. 表格单元格(元素的 display为 table-cell,HTML表格单元格默认为该值)
6. 表格标题(元素的 display 为 table-caption,HTML表格标题默认为该值)
7. 匿名表格单元格元素(元素的 display为 table、table-row、 table-row-group、table-header-group、table-footer-group(分别是HTML table、row、tbody、thead、tfoot的默认属性)或 inline-table)
8. overflow 值不为 visible 的块元素
9. display 值为 flow-root 的元素
10. contain 值为 layout、content或 strict 的元素
11. 弹性元素(display为 flex 或 inline-flex元素的直接子元素)
12. 网格元素(display为 grid 或 inline-grid 元素的直接子元素)
13. 多列容器(元素的 column-count 或 column-width 不为 auto,包括 column-count 为 1)
14. column-span 为 all 的元素始终会创建一个新的BFC,即使该元素没有包裹在一个多列容器中(标准变更,Chrome bug)。