格式化上下文(Block Formatting Context),是 Web 頁面中盒模型佈局的 CSS 渲染模式,主要指一個獨立的渲染區域或一個隔離的獨立容器。css
float
除 none
之外的值;position: [absolute | fixed]
;display: [inline-block | table-cell | table-caption]
;overflow: [hidden | auto | scroll]
, 即除 visible
之外的值;<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>BFC 對齊</title>
<style> * { margin: 0; padding: 0; } .absolute { position: absolute; } .left { float: left; } .section { width: 520px; } .section1 { background-color: red; min-height: 40px; } .section2 { background-color: orange; min-height: 40px; } .section3 { background-color: yellow; width: 100px; min-height: 40px; } .section4 { background-color: green; min-height: 60px; } </style>
</head>
<body>
<div class="section">
<div class="section1">section1</div>
<div class="section2">section2</div>
<div class="section3 left">section3 float</div>
<div class="section4">section4</div>
</div>
</body>
</html>
複製代碼
哪怕浮動元素(section3)也接着上一個盒子垂直排列(全部的盒子都左對齊)。html
例子1git |
例子2github |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>BFC margin</title>
<style> * { margin: 0; padding: 0; } .hidden { overflow: hidden; } .section { margin: 20px auto; border:1px solid red; width: 800px; } .section1 { background-color: orange; margin: 10px; min-height: 40px; } .section2 { background-color: green; margin: 30px; min-height: 60px; } </style>
</head>
<body>
<div class="section">
<div class="section1"></div>
<div class="section2"></div>
</div>
<div class="section">
<div class="hidden">
<div class="section1"></div>
</div>
<div class="section2"></div>
</div>
</body>
</html>
複製代碼
例子1:兩個內部盒子 section1
和 section2
的垂直距離爲 30px
而不是 40px
,由於垂直外邊距會摺疊,間距以較大的爲準;面試
例子2:如何解決垂直外邊距不折疊呢?其實只要讓 BFC 容器裏的元素不會影響外面元素,一樣外面元素不影響 BFC 容器裏的元素,即讓 section1
或 section2
中一個盒子處於一個 BFC 容器中中就好了;瀏覽器
例子1佈局 |
例子2 和 例子3post |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>BFC float</title>
<style> * { margin: 0; padding: 0; } .hidden{ overflow: auto;} .left { float: left; } .right { float: right; } .section { margin: 20px auto; border: 1px solid red; width: 800px; } .section1 { background-color: orange; width: 100px; min-height: 40px; margin-right: 10px; } .section2 { min-height: 60px; background-color: green;} .section3 { background-color: pink; width: 100px; min-height: 40px; margin-left: 10px; } </style>
</head>
<body>
<div class="section">
<div class="section1 left">
<p>section1</p>
<p>section1</p>
</div>
<div class="section2">
<p>section2</p>
<p>section2</p>
<p>section2</p>
<p>section2</p>
</div>
</div>
<div class="section">
<div class="section1 left">
<p>section1</p>
<p>section1</p>
</div>
<div class="section2 hidden">
<p>section2</p>
<p>section2</p>
<p>section2</p>
<p>section2</p>
</div>
</div>
<div class="section">
<div class="section1 left">
<p>section1</p>
<p>section1</p>
</div>
<div class="section3 right">
<p>section3</p>
<p>section3</p>
</div>
<div class="section2 hidden">
<p>section2</p>
<p>section2</p>
<p>section2</p>
<p>section2</p>
</div>
</div>
</body>
</html>
複製代碼
其實就是清浮動(利用 overflow:hidden
),可看面試之道之 CSS 佈局字體
總結下特徵(能解決哪些問題)ui
margin
決定(外間距之和);float
元素區域重疊(阻止文字環繞和實現多欄佈局);