一、Float的特性
1. 應用於文字圍繞圖片
2. 建立一個塊級框
3. 多列浮動布局
4. 浮動元素的寬度、高度自適應,但可以設定其值。
二、核心解決的問題
文字圍繞圖片:img標籤與多個文字標籤放置在一個容器中,如果img浮動,文字標籤會圍繞圖片。
<imgsrc="../img/a.jpg"style=" width: 100px; height: 200px; float: left;"alt="">
<p>001檔案內容檔案內容文內容檔案內容<br/>
檔案內容檔案內容檔案內容檔案內容檔案內內容檔案內容<br/>
檔案內容檔案內容檔案內容檔案內容檔案內容<br/>
檔案內容檔案內容檔案內容檔案內容文內容檔案內容檔案內容<br/>
<p>p標籤檔案內容檔案內容檔案內容檔案內容檔案內容文容檔案內容檔案內容檔案內容</p>
<div>Div標籤檔案內容檔案內容檔案內容檔案內容檔案內容檔案內容</div>
檔案內容檔案內容檔案內容檔案件內容檔案內容檔案內容<br/>
檔案內容檔案內容檔案內容檔案內容檔案內容檔案內容檔案內容檔案內容<br/>
檔案內容檔案內容檔案內容檔案內容檔案內容檔案內內容檔案內容<br/>
檔案內容檔案內容檔案內容檔案容檔案內容檔案內容<br/>
檔案內容檔案內容檔案內容檔案容檔案內容檔案內容<br/>
</p>
|
2.1 這是一個問題
浮動元素與正常元素相鄰,且浮動元素與正常元素之間沒有清除浮動,此時正常元素會被浮動元素蓋住,但包含的內容會圍繞浮動元素顯示。
<divstyle="width: 100px; height: 200px; background: red;float: left;">001</div>
<divstyle="width: 100px; height: 200px; background: gray;float: none;"><p>002</p></div>
|
001浮動,002沒有浮動,但002元素本身被001蓋住,但內容卻圍繞001顯示。
三、非核心且主要應用領域
分欄布局:讓區塊先水平排列,然後超出部分另起一行。
主要特點
1.父級高度塌陷(這也是一個嚴重的問題)
.wrap{
background:red;
padding:10px;
width:auto;
}
.left{
background:gray;
width:200px;
height:100px;
float:left;
}
.right{
background:yellow;
width:100px;
height:100px;
float:left;
}
|
<divclass="wrap">
<divclass="left">left</div>
<divclass="right">right</div>
</div>
|
2.寬、高變成自適應子項目,但寬、高的設定有效
.wrap{
background:red;
padding:10px;
float:left;
}
.left{
width:100px;
background:gray;
}
.right:{
width:200px;
background:yellow;
}
|
<divclass="wrap">
<divclass="left">left</div>
<divclass="right">right</div>
</div>
|
2. 解決高度塌陷的問題
首先我們需要瞭解BFC和IFC這兩人個基本的概念,因為他與瀏覽器的渲染有著密切的關係。
1.BFC(塊級格式化上下文)
他是一個獨立渲染的地區,規定地區內部如何布局,且與外部毫不相干,主要規則如下:
1.1 內部的box會垂直方向,一個接一個地放置
1.2 Box垂直方向的距離由margin決定,屬於同一個BFC的兩個相鄰box的Margin會發生重疊
1.3 BFC地區不會與float重疊
.head{
background:pink;
margin:20px0px;
height:100px;
}
.wrap{
background:red;
padding:10px;
margin:20px0px;
overflow:hidden;
}
.left{
width:100px;
background:gray;
margin:10px0px;
}
.right:{
width:200px;
background:yellow;
margin:20px0px;
}
|
<divclass="head">head</div>
<divclass="wrap">
<divclass="left">left</div>
<divclass="right">right</div>
</div>
|
.head與.wrap兩個box之間上下各設定有20px的外邊距,但發生了重疊;
.head與.left兩個之間,.head有20px的外邊距,.left有10px的外邊距,沒有發生重疊,因為.wrap使其建立了BFC(overflow:hidden)。
1.4 每個box的margin 左邊,與包含border box的左邊相接觸(右邊一樣),浮動也是如此
2. IFC(行級格式化上下文)
框從包含塊的頂部開始,一個接一個水平放置。水平方向上的外邊距、邊框、內邊距所佔空間都放在一起(display為inline、inline-block;元素本身具有inline特性的元素都具體以下特徵)。規則如下:
2.1 不能指定寬高
2.2 Margin、Padding、border垂直方向的無效
2.3 行框的左邊緊貼包含塊的左邊,而行框的右邊緊貼其包含框的右邊,而浮動塊可以插入在包含塊邊緣與行框之間。
2.4 行內框高度由line-height決定。
此節例子可以參考display章節的inline元素。
3. 解決方案
主要根據BFC的原理實現,因為BFC的渲染的是整塊地區,也就會計算出寬、高。這也是傳說中的清除浮動的方案
3.1 父容器建立BFC方法
3.1.1 建立BFC的方法
a) Float除了none以外的取值;
b) Overflow除了visible以外的值;
c) Display值為table-cell、table-caption、inline-block、flex、inline-flex等
d) Position值為absloute、fixed
e) Fieldset元素
3.1.2 清除浮動
a) Float、overflow、display三種方式都可以清除浮動,但position、fieldset雖然建立了bfc但不可以清除浮動(也就是不能解決高度塌陷的問題)。主要原因為:position、fieldset都需要子項目來撐開父容器的高度,但子項目浮動後又不存在高度,所以失效。
b) Float、overflow、display範例程式碼:
.wrap{
background:gray;
padding:10px;
overflow:auto;
}
.left, .right{
background:red;
float:left;
width:200px;
height:100px;
}
.right{
background: yellow;
}
.footer{
background: pink;
}
|
<divclass="wrap">
<divclass="left">left</div>
<divclass="right">right</div>
</div>
<divclass="footer">footer</div>
|
3.1.3 最後一個子項目clear:both
利用clear:both觸發父容器重新計算高度的原理實現,範例程式碼如下:
.wrap{
background:gray;
padding:10px;
}
.left, .right{
background:red;
float:left;
width:200px;
height:100px;
}
.right{
background: yellow;
}
.footer{
background: pink;
}
.clear{
clear:both;
zoom:1;
}
|
<divclass="wrap">
<divclass="left">left</div>
<divclass="right">right</div>
<divclass="clear"></div>
</div>
<divclass="footer">footer</div>
|
3.1.4 After添加最後一個子項目
利用css的:after虛擬元素實現,動態插入元素並清除浮動:
.wrap{
background:gray;
padding:10px;
}
.wrap:after{
content:'';
display:block;
overflow:hidden;
clear:both;
}
.left, .right{
background:red;
float:left;
width:200px;
height:100px;
}
.right{
background: yellow;
}
.footer{
background: pink;
}
|
<divclass="wrap">
<divclass="left">left</div>
<divclass="right">right</div>
</div>
<divclass="footer">footer</div>
|
4. 總結
1. 利用bfc方式清除浮動,簡單、瀏覽器支援良好,但在IE6-版本支援存在問題。但是存在以下局限性,要適環境而用:
a) Overflow方式:捲軸會被隱藏,如果子內容超高則存在顯示不全的問題;
b) Float方式:讓父容器浮動,那麼就存在對父容器同輩元素的影響;
c) Dipslay方式:讓父容器變為table或者flex等,都存在不明確的影響,大家都不推薦使用。
2. 最佳解決方案:利用:after添加一個虛擬元素並給予clear:both和zoom:1來實現清除浮動,相容性好,對環境影響最小。