面試考點有兩種:html
一、頁面效果,考察對浮動的理解。面試
二、清除浮動的方法。瀏覽器
例1:下面程序的效果圖bash
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#p1{
width:50px;
height:50px;
float: left;
background-color: red;
}
#p2{
width:100px;
height:50px;
background-color: green;
}
</style>
</head>
<body>
<p id="p1"></p>
<p id="p2">test</p>
</body>
</html>複製代碼
效果圖:ui
例2spa
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#p1{
width:50px;
height:50px;
float: left;
background-color: red;
}
#p2{
width:100px;
height:50px;
background-color: green;
}
</style>
</head>
<body>
<div id="p1"></div>
<div id="p2">test</div>
</body>
</html>複製代碼
效果圖:3d
之因此呈現出這種效果是由於浮動元素會脫離文檔流,塊級元素表現的像浮動框不存在同樣,而文字會圍繞在浮動元素旁邊。code
疑問:爲何p標籤和div呈現出來的效果稍有不一樣?cdn
緣由:p標籤默認存在margin值,將p的margin設爲0便可解決。htm
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#p1{
width:50px;
height:50px;
float: left;
background-color: red;
margin: 0;
}
#p2{
width:100px;
height:50px;
background-color: green;
}
</style>
</head>
<body>
<p id="p1"></p>
<p id="p2">test</p>
</body>
</html>複製代碼
效果圖
浮動的框能夠向左或向右移動,直到它的外邊緣碰到包含框或另外一個浮動框的邊框爲止。因爲浮動框脫離文檔的普通流中,因此文檔的普通流中的塊框表現得就像浮動框不存在同樣。
脫標:脫離標準文檔流。
貼邊:左浮動時,元素向左移動,直到它的左邊貼到包含塊的左邊緣。
字圍:文字會圍着浮動元素排開。
收縮:塊級元素設置浮動後,其寬度再也不佔滿一行,而是收縮爲包含內部元素的寬度便可。
例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#div1{
width:50px;
height:50px;
float: left;
background-color: red;
}
#div2,#div3{
width:50px;
height:50px;
background-color: green;
}
</style>
</head>
<body>
<div id="div1"></div>
<div id="div2">test</div>
<div id="div3">test</div>
</body>
</html>複製代碼
當#div2,#div3的 width:50px;時,div2其實是被div1浮動徹底遮蓋住了,因爲設置了寬度,文字又必須圍繞浮動元素,因此文字跑到下面去了。
當#div2,#div3的 width:100px;時,div2其實是被div1浮動遮蓋了一半,因爲寬度夠放文字,文字圍繞浮動元素,因此文字在其右面。
當#div2,#div3不設置寬度時,效果以下:
例2:解釋收縮
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#div1{
float: left;
background-color: red;
}
#div2,#div3{
width:50px;
height:50px;
background-color: green;
}
</style>
</head>
<body>
<div id="div1">我是浮動元素</div>
</body>
</html>複製代碼
效果:
例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#div1,#div2,#div3{
width:50px;
height:50px;
float: left;
}
#div1{
background-color: red;
}
#div2{
background-color: green;
}
#div3{
background-color: #00A0E9;
}
#parent{
border: 5px solid #000;
width: 150px;
}
</style>
</head>
<body>
<div id="parent">
<div id="div1"></div>
<div id="div2"></div>
<div id="div3"></div>
</div>
</body>
</html>複製代碼
效果:
本想讓父容器包裹着三個浮動元素,可是浮動帶來反作用----父容器高度塌陷,因而清理浮動就顯着相當重要。
清除浮動不是不用浮動,清除浮動產生的父容器高度塌陷。
法1、給浮動元素的父元素添加高度(擴展性很差)
例:
#parent{
border: 5px solid #000;
width: 150px;
height: 50px;
}複製代碼
法2、clear:both;
在最後一個子元素的後面添加一個塊級元素,而後將其設置clear:both,這樣就能夠清除浮動。
例:
<div id="parent">
<div id="div1"></div>
<div id="div2"></div>
<div id="div3"></div>
<br id="wrap"/>
</div>複製代碼
#wrap{
clear: both;
}複製代碼
法3、僞元素清除浮動 推薦使用
上面那種辦法當然能夠清除浮動,可是咱們不想在頁面中添加這些沒有意義的冗餘元素,此時如何清除浮動嗎? 結合 :after 僞元素和 IEhack ,能夠完美兼容當前主流的各大瀏覽器,這裏的 IEhack 指的是觸發 hasLayout。
#parent{
*zoom:1; //觸發haslayout
}
#parent:after{
content:'';
display:block;
clear: both;
}複製代碼
注意:上面的代碼爲必須有的。
法4、觸發造成BFC
這種方案讓父容器造成了BFC(塊級格式上下文),而BFC能夠包含浮動,一般用來解決浮動父元素高度坍塌的問題。
BFC的觸發方式
咱們能夠給父元素添加如下屬性來觸發BFC:
float 爲 left | right
overflow 爲 hidden | auto | scorll
display 爲 table-cell | table-caption | inline-block
position 爲 absolute | fixed
例:
#parent{
overflow: hidden;
}複製代碼
但這種辦法有個缺陷:若是有內容出了盒子,用這種方法就會把多的部分裁切掉,因此這時候不能使用。
總結:清除浮動的方法