css定位

參考文章:http://www.cnblogs.com/gaohuijiao/p/6371010.html

                http://www.cnblogs.com/gaohuijiao/p/6369138.html

CSS 有三種基本的定位機制:普通流、浮動和定位Position。影響元素定位的是浮動和Position。

 在分析定位之前,理解一下行級元素和塊級元素。行級元素:元素在一行內排列,高度由內容決定。塊級元素:獨自佔一行且寬度會佔滿父元素寬度。

1、以設置weith和height,行內元素設置width和height無效,而且塊級元素即使設置寬度也還是獨佔一行。
2、塊級元素可以設置margin和padding屬性,行內元素水平方向的margin和padding如margin-left、padding-right可以產生邊距效果,但是豎直方向的如padding-top和margin-bottom不會產生邊距效果。
3、其中塊級元素對應display:block,行內元素對應display:inline。可以通過修改元素的display屬性來切換行內元素和塊級元素。
4、補充說明一個屬性:display:inline-block;可以讓元素具有塊級元素和行內元素的特性:既可以設置長寬,可以讓padding和margin生效,又可以和其他行內元素並排。是一個很實用的屬性

 

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:位置相對於瀏覽器窗口。脫離文檔流,不佔據頁面空間。


   


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章