CSS盒模型之文件流與BFC
文件流:文件中可顯示的元素在排列時候的開始位置以及他們所佔的區域
原因:頁面元素不同,按照各自的特點去顯示,在頁面中所佔的區域是不一樣的
順序:從上到下,從左到右
css浮動float
概念:使元素脫離文件流,按照指定的方向發生移動,遇到父級元素或者相鄰的元素就會停下來
特徵:1)塊元素可以在一行顯示
2)按照一個方向移動
3)行內元素支援寬高
4)脫離文件流(元素不在頁面中佔位置了)
注意:浮動後跟的元素(沒有浮動)的位置是從前面浮動的元素位置開始的
非浮動元素裡的內容會留出前面浮動元素的位置(盒模型位置)
5)塊元素的預設寬度(預設撐滿一行)會改變(由內容撐開,也可以設定寬)
程式碼
1.container div { 2 width: 100px; 3 height: 100px; 4 background: green; 5 float: left; 6 }
<div class='container'> <div></div> <span>浮動後跟的元素(沒有浮動)的位置是從前面浮動的元素位置開始的 非浮動元素裡的內容會留出前面浮動元素的位置(盒模型位置) 浮動後跟的元素(沒有浮動)的位置是從前面浮動的元素位置開始的 非浮動元素裡的內容會留出前面浮動元素的位置(盒模型位置)浮動後跟的元素(沒有浮動)的位置是從前面浮動的元素位置開始的 非浮動元素裡的內容會留出前面浮動元素的位置(盒模型位置)浮動後跟的元素(沒有浮動)的位置是從前面浮動的元素位置開始的 非浮動元素裡的內容會留出前面浮動元素的位置(盒模型位置)浮動後跟的元素(沒有浮動)的位置是從前面浮動的元素位置開始的 非浮動元素裡的內容會留出前面浮動元素的位置(盒模型位置)浮動後跟的元素(沒有浮動)的位置是從前面浮動的元素位置開始的 非浮動元素裡的內容會留出前面浮動元素的位置(盒模型位置)浮動後跟的元素(沒有浮動)的位置是從前面浮動的元素位置開始的 非浮動元素裡的內容會留出前面浮動元素的位置(盒模型位置)</span>
結果:
6)父級高度塌陷(破壞性),子元素如果有浮動,父級高度不會自動撐開了
//css程式碼 .container { border:2px solid red; } .container div { width: 100px; height: 100px; /*float: left;*/ background: green; } //html程式碼 <div class='container'> <div></div> </div>
清除浮動
1) clear 元素的某個方向上不能有浮動元素
clear :left 元素的左邊不能有浮動元素
right 元素的右邊不能有浮動元素
both 元素的兩邊不能有浮動元素 (常用)
2)overflow:hidden
如果子級有定位(position)並且超出了父級的範圍這樣子級定位的內容就開不見了,就不能有這樣命令了
3)空標籤
空標籤是沒有內容的,但他用於清楚浮動,不符合行為、結構、樣式相分離
<div class='container'> <div class='box'></div> <div style='clear:both;'></div> </div>
4)after偽類清除浮動,是目前主流方法
after 代表選擇到的元素的內容的最後面(預設新增的內容是行內元素),配合content使用
content 設定的內容
CSS程式碼
.container { border: 2px solid red; } .container .box { width: 100px; height: 100px; float: left; background: green; } .clearfix:after { content: ''; display: block; clear: both; }
HTML程式碼
<div class='container clearfix'> <div class='box '></div>
</div>
執行結果
BFC Block Formatting Contexts 塊級元素格式化上下文
決定了塊級元素如何對它的內容進行佈局,及與其他元素的關係與相互作用
關鍵詞解釋:塊級元素:指的是父級(塊級元素)
內容:子元素(塊級元素)
其他元素:與內容級別的兄弟元素
相互作用:BFC裡的元素與外面的元素不會發生影響
普通文件流的佈局規則
1:浮動的元素不會被父級計算高度(父級高度塌陷)
2:非浮動元素會覆蓋浮動元素的位置
3:margin會傳遞給父級
4:2個相鄰的元素上下元素會重疊
BFC的佈局規則
1:浮動的元素會被父級計算高度( 父級觸發了BFC)
2: 非浮動元素不會覆蓋浮動元素的位置(非浮動元素觸發了BFC)
3:margin不會傳遞給父級(父級觸發了BFC)
4:兩個相鄰的元素上下margin不會重疊(給其中一個元素新增一個單獨的父級,然後讓他的父級觸發BFC)
觸發BFC的方式(以下任意一條就可以)
1:float的值不為null
2:overflow的值不為visible
3:display的值為table-cell,table-caption,inline-block
4:position的值不為static,relative
舉幾個栗子:
1:自適應兩欄佈局:
程式碼
<style> body { width: 300px; position: relative; } .aside { width: 100px; height: 150px; float: left; background: #f66; } .main { height: 200px; background: #fcc; } </style> <body> <div class="aside"></div> <div class="main"></div> </body>
頁面顯示:
注意:非浮動元素會覆蓋浮動元素的位置,就是主區和左欄開始位置重疊了,解決辦法,讓非浮動元素觸發BEC
.main {
overflow: hidden;
}
觸發main生成BFC
後,這個新的BFC
不會與浮動的aside重疊。因此會根據包含塊(父級)的寬度,和aside的寬度,自動變窄。效果如下
2:清除內部浮動
1 <style> 2 .par { 3 border: 5px solid #fcc; 4 width: 300px; 5 } 6 7 .child { 8 border: 5px solid #f66; 9 width:100px; 10 height: 100px; 11 float: left; 12 } 13 </style> 14 <body> 15 <div class="par"> 16 <div class="child"></div> 17 <div class="child"></div> 18 </div> 19 </body>
頁面效果:
為達到清除內部浮動,我們可以觸發par生成BFC
,那麼par在計算高度時,par內部的浮動元素child也會參與計算
1 .par { 2 overflow: hidden; 3 }
3:防止頁面margin重疊問題
1 <style> 2 p { 3 color: #f55; 4 background: #fcc; 5 width: 200px; 6 line-height: 100px; 7 text-align:center; 8 margin: 100px; 9 } 10 </style> 11 <body> 12 <p>Haha</p> 13 <p>Hehe</p> 14 </body>
頁面顯示:
margin重疊問題造成了兩個P之間的上下距離還是100
我們可以在p外面包裹一層容器,並觸發該容器生成一個BFC
。那麼兩個P便不屬於同一個BFC
,就不會發生margin重疊了。
程式碼:
1 <p>Haha</p> 2 <div style='overflow:hidden;'> 3 <p>Hehe</p> 4 </div
頁面顯示: