參考文章:http://www.cnblogs.com/gaohuijiao/p/6371010.html
http://www.cnblogs.com/gaohuijiao/p/6369138.html
CSS 有三種基本的定位機制:普通流、浮動和定位Position。影響元素定位的是浮動和Position。
在分析定位之前,理解一下行級元素和塊級元素。行級元素:元素在一行內排列,高度由內容決定。塊級元素:獨自佔一行且寬度會佔滿父元素寬度。
1、普通流
普通流:除非專門指定,否則所有框都在普通流中定位。普通流中元素框的位置由元素在(X)HTML中的位置決定。塊級元素從上到下依次排列,框之間的垂直距離由框的垂直margin計算得到。行內元素在一行中水平佈置。
2、浮動佈局
浮動佈局:CSS 的 Float(浮動),會使元素向左或向右移動,使元素共享一行,類似於給元素加了inline-block的作用。在w3c中這樣描述浮動:浮動的框可以向左或向右移動,直到它的外邊緣碰到包含框或另一個浮動框的邊框爲止。由於浮動框不在文檔的普通流中,所以文檔的普通流中的塊框表現得就像浮動框不存在一樣。
浮動佈局的影響
1、脫離文檔流,不佔據頁面空間
<html>
<head>
<title></title>
<style type="text/css">
.div1{
width: 150px;
height: 100px;
background: pink;
}
.div2{
width: 100px;
height: 150px;
background: lavender;
}
.div3{
width: 300px;
height: 200px;
background: skyblue;
}
</style>
</head>
<body>
<div class="div1">150 * 100</div>
<div class="div2">100 * 150</div>
<div class="div3">300 * 200</div>
</body>
</html>
div 是塊級元素,在標準文檔流中,div各佔一行,如果講div1,div2添加float:left。
粉色的div和紫色的div覆蓋在了藍色div的上面。這是因爲浮動元素脫離了標準流到了浮動層,浮動層比標準層要高並且不佔據頁面空間,所以我們看到div1和div2覆蓋在了div3上面,雖然是覆蓋但是div3裏面的文字會被擠走,此時div3仍然在標準層所以仍然是佔據頁面空間的。
2、浮動元素將行內元素和行塊元素轉化爲塊元素
<html>
<head>
<title></title>
<style type="text/css">
.span1{
width: 200px;
height: 200px;
background: red;
}
.span2{
width: 200px;
height: 200px;
background: green;
}
.span3{
width: 200px;
height: 200px;
background: blue;
}
</style>
</head>
<body>
<span class="span1">span1</span>
<span class="span2">span2</span>
<span class="span3">span3</span>
</body>
</html>
行內元素共享同一行,中間有間隔,寬度和高度屬性不起作用,此時,我們給每個span1加浮動屬性float:left
很顯然,浮動過後的元素寬度和高度屬性開始起作用,說明span元素從行標籤變成了塊標籤。
3、清除浮動
假如說我們要實現如下佈局,上方是導航部分,下方是內容部分,導航部分兩個塊左右浮動。
<html>
<head>
<title></title>
<style type="text/css">
.nav{
width: 100%;
background: #c0c0c0;
padding: 10px;
}
.left{
width: 300px;
height: 50px;
background: pink;
float: left;
}
.right{
width: 300px;
height: 50px;
background: #abcdef;
float: right;
}
.content{
height: 400px;
background: url("a.jpg");
background-size: cover;
}
</style>
</head>
<body>
<!-- 導航部分 -->
<div class="nav">
<div class="left">logo</div>
<div class="right">右邊區域</div>
<div class='clear'></div>
</div>
<!-- 內容部分 -->
<div class="content"></div>
</body>
</html>
結果解析: 塊級元素如果沒有給高度,那麼高度是由子元素還有padding值撐起來的,當left和right浮動之後脫離了文檔流,不再佔據頁面空間,所以它們的父級的高度只有padding值,因而造成了上圖的結果
1、給浮動元素的父級一個高度。
.nav{
height: 50px; //增加高度
}
給浮動元素的父級一個高度,使之佔據頁面空間,這種寫法的優點是簡單容易理解,但是缺點也很突出,不適用於高度不固定的div。
2、給浮動元素的父級加overflow:hidden
.nav{
overflow: hidden; //增加
}
overflow:hidden 的意思是超出的部分要裁切隱藏掉,那麼如果 float 的元素不佔普通流位置,普通流的包含塊要根據內容高度裁切隱藏。如果高度是默認值auto,那麼不計算其內浮動元素高度就裁切,就有可能會裁掉float元素。所以如果沒有明確設定容器高情況下,它要計算內容全部高度才能確定在什麼位置hidden,浮動的高度就要被計算進去,順帶達成了清理浮動的目標。
3、給浮動元素的兄弟元素加clear:both
<html>
<head>
<title></title>
<style type="text/css">
.nav{
width: 100%;
background: #c0c0c0;
padding: 10px;
}
.left{
width: 300px;
height: 50px;
background: pink;
float: left;
}
.right{
width: 300px;
height: 50px;
background: #abcdef;
float: right;
}
.content{
height: 400px;
background: url("a.jpg");
background-size: cover;
}
.clear{
/*clear: both;*/
}
</style>
</head>
<body>
<!-- 導航部分 -->
<div class="nav">
<div class="left">logo</div>
<div class="right">右邊區域</div>
<div class='clear'></div>
</div>
<!-- 內容部分 -->
<div class="content"></div>
</body>
</html>
這個也能達到目的的,但是個人傾向於 overflow: hidden;Position屬性有四個值,分別爲static、relative、absolute、fixed,定位元素通過屬性left和top來控制定位元素的位置,默認情況下爲0。
1、static 靜態定位
static是position屬性的默認值。表示沒有定位,元素出現在正常的流中。這個時候你給這個元素設置的left,right,bottom,top這些偏移屬性都是沒有效果的,不會生效,比如你設置一個距離左邊距偏移100px的聲明:left:100px 那麼這條聲明不會起到任何效果。還有z-index屬性在這時也不會生效。
2、relative 相對定位
relative 相對定位的元素在標準流中,relative相對於正常的位置。
<html>
<head>
<title></title>
<style type="text/css">
.father{
width: 500px;
height: 500px;
background: pink;
margin: 0 auto;
}
.son{
width: 200px;
height: 200px;
background: lavender;
margin: 0 auto;
/* position: relative; 增加後看圖二
left: 50px;
top: 20px;*/
}
</style>
</head>
<body>
<!-- 導航部分 -->
<div class="nav">
<div class="father">
<div class="son">son</div>
</div>
</body>
</html>
2、absolute 絕對定位
絕對定位元素會脫離文檔流,其次,我們來分析絕對定位元素是根據什麼來進行定位的,絕對定位元素首先會找其距離最近的定位(static除外)的父級元素,如果沒有定位父級元素,則會一直往上找,直到根元素html,也就是說絕對定位元素如果沒有定位父級元素,則會相對於html來進行定位。
<html>
<head>
<title></title>
<style type="text/css">
.father{
width: 500px;
height: 500px;
background: pink;
margin: 0 auto;
}
.son1{
width: 150px;
height: 150px;
background: lavender;
margin: 0 20px;
position: absolute;
left: 0px;
top: 0px;
}
.son2{
width: 150px;
height: 150px;
background: skyblue;
margin: 0 20px;
position: absolute;
left: 0px;
top: 0px;
}
</style>
</head>
<body>
<!-- 導航部分 -->
<div class="father">
<div class="son1">son1</div>
<div class="son2">son2</div>
</div>
</body>
</html>
效果分析:
絕對定位元素會脫離文檔流,後面定位的會覆蓋前面定位的,所以son2蓋在了son1上面。son1和son2沒有定位父級,所以相對於根元素html來進行定位。如果有定位元素又會怎麼樣,來看如下代碼:
.father{
position: relative;
width: 500px;
height: 500px;
background: pink;
margin: 0 auto;
}
.son1{
width: 150px;
height: 150px;
background: lavender;
margin: 0 20px;
position: absolute;
left: 0px;
top: 0px;
}
.son2{
width: 150px;
height: 150px;
background: skyblue;
margin: 0 20px;
position: absolute;
left: 50px;
top: 50px;
}
效果分析:
father是son1和son2的定位父級,所以son1和son2相對於father進行定位,因爲son2是後來定位的所以son2覆蓋在了son1的上面。因爲相對定位的特性,所以相對定位經常用來作爲絕對定位的包含盒。
4、fixed 固定定位
很多時候頁面中需要用到固定定位,比如說頁面右下角的回到頂部按鈕等。固定定位就是將元素根據瀏覽器窗口的大小始終固定在這個地方,即使頁面滑動,也不影響它的位置。我們來看如下案例:
這個是沒有定位時的效果。
添加css代碼
.backTop{
width: 70px;
height: 70px;
background: pink;
position: fixed;
right: 30px;
bottom: 30px;
}
即使隨着頁面的滾動,按鈕的位置也不會發生改變。頁面中很多廣告區域,即使頁面滾動,廣告的位置始終在那兒,這也是利用固定定位實現。注意,固定定位元素也是脫離文檔流的。
總結:
對於浮動的幾種情況,我們只需要從兩方面來考慮,一方面是定位元素根據什麼來進行定位的問題,另一方面是定位元素是否脫離文檔流的問題(關於脫離文檔流的問題此處不多加闡述)。只要這兩方面理解透徹了就很容易明白定位了,我們接下來對幾種定位來做一下總結:
position:static(靜態定位) fixed(固定定位) relative(相對定位) absolute(絕對定位)
static:position的默認值,相當於沒有定位。不脫離文檔流,佔據頁面空間。
relative:位置相對於自身的位置。不脫離文檔流,佔據頁面空間。
absolute:位置相對於已定位的父級元素。脫離文檔流,不佔據頁面空間。
fixed:位置相對於瀏覽器窗口。脫離文檔流,不佔據頁面空間。