BFC 即 Block Formatting Contexts (塊級格式化上下文),它是頁面中的一塊渲染區域,而且有一套渲染規則,它決定了其子元素將如何定位,以及和其餘元素的關係和相互做用。html
具備 BFC 特性的元素能夠看做是隔離了的獨立容器,容器裏面的元素不會在佈局上影響到外面的元素,而且 BFC 具備普通容器所沒有的一些特性。佈局
通俗一點來說,能夠把 BFC 理解爲一個封閉的大箱子,箱子內部的元素不管如何翻江倒海,都不會影響到外部。flex
只要元素知足下面任一條件便可觸發 BFC 特性:spa
<!doctype html> <html> <head> <meta charset="utf-8"/> <title>BFC</title> <style> div{ width:100px; height:100px; background:#f0f; margin:50px; } </style> </head> <body> <div></div> <div></div> <body> </html>
從效果上看,由於兩個 div 元素都處於同一個 BFC 容器下 (這裏指 body 元素) 因此第一個 div 的下邊距和第二個 div 的上邊距發生了重疊,因此兩個盒子之間距離只有 50px,而不是 100px3d
<!doctype html> <html> <head> <meta charset="utf-8"/> <title>BFC</title> <style> .box{ width:200px; margin:0 auto; overflow:hidden; } .btn{ width:100px; height:100px; background:#f0f; margin:50px; } </style> </head> <body> <div class="box"> <div class="btn"></div> </div> <div class="box"> <div class="btn"></div> </div> <body> </html>
咱們都知道,浮動的元素會脫離文檔流,看例子:code
<!doctype html> <html> <head> <meta charset="utf-8"/> <title>BFC</title> <style> .box{ width:300px; margin:0 auto; border:1px solid #000; } .float{ width:100px; height:80px; background:#f00; float:left; </style> </head> <body> <div class="box"> <div class="float"></div> </div> <body> </html>
因爲浮動元素脫離文檔流,因此容器只剩下了2px的高度,若是觸發BFC,那麼容器就會包裹浮動元素orm
<!doctype html> <html> <head> <meta charset="utf-8"/> <title>BFC清除浮動的影響</title> <style> .box{ width:300px; margin:0 auto; border:1px solid #000; overflow:hidden; } .float{ width:100px; height:80px; background:#f00; float:left; } </style> </head> <body> <div class="box"> <div class="float"></div> </div> <body> </html>
<!doctype html> <html> <head> <meta charset="utf-8"/> <title>BFC</title> <style> .box{ width:300px; margin:0 auto; border:1px solid #000; overflow:hidden; } .float{ width:100px; height:80px; background:#f00; float:left; } .right{ width:200px; height:300px; background:#f0f; } </style> </head> <body> <div class="box"> <div class="float"></div> <div class="right">我是一個沒有浮動,沒有觸發BFC的元素.width:200px; height:300px; background:#f0f;</div> </div> <body> </html>
這個時候,第一個浮動的元素已經覆蓋了第二個元素,可是文本內容不會被覆蓋,若是第二個元素觸發BFC,即第二個元素添加overflow:hidden;就會變成htm