本文概述
本文的框架圖如下:
一第焰、浮動(dòng)到底是什么驶睦?
W3school中給出的浮動(dòng)定義為<b>浮動(dòng)的框可以向左或向右移動(dòng),直到它的外邊緣碰到包含框或另一個(gè)浮動(dòng)框的邊框?yàn)橹埂?lt;/b>由于浮動(dòng)框脫離文檔的普通流中,所以文檔的普通流中的塊框表現(xiàn)得就像浮動(dòng)框不存在一樣侧但。
二介评、浮動(dòng)有什么特點(diǎn)库北?
浮動(dòng)的特點(diǎn)爬舰,可以用八個(gè)字總結(jié):脫標(biāo)、貼邊寒瓦、字圍和收縮情屹。
為了更好說(shuō)明,請(qǐng)看下圖:
當(dāng)框 1 向左浮動(dòng)時(shí)杂腰,它脫離文檔流(脫標(biāo))并且向左移動(dòng)(貼邊)垃你,直到它的左邊緣碰到包含框的左邊緣。因?yàn)樗辉偬幱谖臋n流中喂很,所以它不占據(jù)空間惜颇,實(shí)際上覆蓋住了框 2,使框 2 從視圖中消失少辣。如果框2中有文字凌摄,就會(huì)圍著框1排開(kāi)(字圍)。
如果把所有三個(gè)框都向左浮動(dòng)漓帅,那么框 1 向左浮動(dòng)直到碰到包含框锨亏,另外兩個(gè)框向左浮動(dòng)直到碰到前一個(gè)浮動(dòng)框。
下面著重講解下第四個(gè)特點(diǎn)--收縮
一個(gè)浮動(dòng)的內(nèi)聯(lián)元素(比如span img標(biāo)簽)不需要設(shè)置display:block就可以設(shè)置寬度煎殷。
<style>
div{
float: left;
background-color: greenyellow;
}
</style>
</head>
<body>
<div>
這是一段文字
</div>
</body>
得到以下的效果:
我們都知道div標(biāo)簽是塊級(jí)元素屯伞,會(huì)獨(dú)占一行,然而上面的例子中將div設(shè)置為左浮后豪直,其寬度不再是占滿一行劣摇,而是收緊為內(nèi)部元素的寬度,這就是浮動(dòng)第四個(gè)特征的含義弓乙。
三末融、浮動(dòng)有什么缺點(diǎn)?
先看下面這段代碼:
<style>
.parent{
border: solid 5px;
width:300px;
}
.child:nth-child(1){
height: 100px;
width: 100px;
background-color: yellow;
float: left;
}
.child:nth-child(2){
height: 100px;
width: 100px;
background-color: red;
float: left;
}
.child:nth-child(3){
height: 100px;
width: 100px;
background-color: greenyellow;
float: left;
}
</style>
</head>
<body>
<div class="parent">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>
</body>
我們想讓父容器包裹著三個(gè)浮動(dòng)元素暇韧,然而事與愿違勾习,得到卻是這樣的結(jié)果:
這就是浮動(dòng)帶來(lái)副作用----父容器高度塌陷,于是清理浮動(dòng)就顯著至關(guān)重要懈玻。
四巧婶、如何清理浮動(dòng)?
清除浮動(dòng)不是不用浮動(dòng)涂乌,清除浮動(dòng)產(chǎn)生的父容器高度塌陷艺栈。
套路1:給浮動(dòng)元素的父元素添加高度(擴(kuò)展性不好)
如果一個(gè)元素要浮動(dòng),那么它的父元素一定要有高度湾盒。高度的盒子湿右,才能關(guān)住浮動(dòng)》9矗可以通過(guò)直接給父元素設(shè)置height毅人,實(shí)際應(yīng)用中我們不大可能給所有的盒子加高度吭狡,不僅麻煩,并且不能適應(yīng)頁(yè)面的快速變化丈莺;另外一種划煮,父容器的高度可以通過(guò)內(nèi)容撐開(kāi)(比如img圖片),實(shí)際當(dāng)中此方法用的比較多场刑。
套路2:clear:both;
在最后一個(gè)子元素新添加最后一個(gè)冗余元素般此,然后將其設(shè)置clear:both,這樣就可以清除浮動(dòng)蚪战。這里強(qiáng)調(diào)一點(diǎn)牵现,即在父級(jí)元素末尾添加的元素必須是一個(gè)塊級(jí)元素,否則無(wú)法撐起父級(jí)元素高度邀桑。
<div id="wrap">
<div id="inner"></div>
<div style="clear: both;"></div>
</div>
#wrap{
border: 1px solid;
}
#inner{
float: left;
width: 200px;
height: 200px;
background: pink;
}
套路3:偽元素清除浮動(dòng)
上面那種辦法固然可以清除浮動(dòng)瞎疼,但是我們不想在頁(yè)面中添加這些沒(méi)有意義的冗余元素,此時(shí)如何清除浮動(dòng)嗎壁畸?
結(jié)合 :after 偽元素和 IEhack 贼急,可以完美兼容當(dāng)前主流的各大瀏覽器,這里的 IEhack 指的是觸發(fā) hasLayout捏萍。
<div id="wrap" class="clearfix">
<div id="inner"></div>
</div>
#wrap {
border: 1px solid;
}
#inner {
float: left;
width: 200px;
height: 200px;
background: pink;
}
/*開(kāi)啟haslayout*/
.clearfix {
*zoom: 1;
}
/*ie6 7 不支持偽元素*/
.clearfix:after {
content: '';
display: block;
clear: both;
height:0;
line-height:0;
visibility:hidden;//允許瀏覽器渲染它太抓,但是不顯示出來(lái)
}
給浮動(dòng)元素的父容器添加一個(gè)clearfix的class,然后給這個(gè)class添加一個(gè):after偽元素令杈,實(shí)現(xiàn)元素末尾添加一個(gè)看不見(jiàn)的塊元素來(lái)清理浮動(dòng)走敌。這是通用的清理浮動(dòng)方案,推薦使用
套路4:給父元素使用overflow:hidden;
這種方案讓父容器形成了BFC(塊級(jí)格式上下文)逗噩,而B(niǎo)FC可以包含浮動(dòng)掉丽,通常用來(lái)解決浮動(dòng)父元素高度坍塌的問(wèn)題。
<b>BFC的觸發(fā)方式</b>
我們可以給父元素添加以下屬性來(lái)觸發(fā)BFC:
float 為 left | right
overflow 為 hidden | auto | scorll
display 為 table-cell | table-caption | inline-block
position 為 absolute | fixed
這里可以給父元素設(shè)置overflow:auto异雁,但是為了兼容IE最好使用overflow:hidden捶障。
但這種辦法有個(gè)缺陷:如果有內(nèi)容出了盒子,用這種方法就會(huì)把多的部分裁切掉纲刀,所以這時(shí)候不能使用项炼。
BFC的主要特征:
BFC容器是一個(gè)隔離的容器,和其他元素互不干擾示绊;所以我們可以用觸發(fā)兩個(gè)元素的BFC來(lái)解決垂直邊距折疊問(wèn)題锭部。
BFC不會(huì)重疊浮動(dòng)元素
BFC可以包含浮動(dòng),這可以清除浮動(dòng)。
套路5:br標(biāo)簽清浮動(dòng)
br標(biāo)簽存在一個(gè)屬性:clear耻台。這個(gè)屬性就是能夠清除浮動(dòng)的利器空免,在br標(biāo)簽中設(shè)置屬性clear,并賦值all盆耽。即能清除掉浮動(dòng)蹋砚。
<div id="wrap">
<div id="inner"></div>
<br clear="all" />
</div>
#wrap {
border: 1px solid;
}
#inner {
float: left;
width: 200px;
height: 200px;
background: pink;
}
本文于2018.11.9重新修改扼菠,如果對(duì)你有些許幫助,歡迎在我的GitHub博客點(diǎn)贊和關(guān)注坝咐,感激不盡循榆!