CSS 定位機制
CSS 有三種基本的定位機制:普通流、浮動和絕對定位。
除非專門指定,否則所有框都在普通流中定位。也就是說,普通流中的元素的位置由元素在 X(HTML) 中的位置決定。
塊級框從上到下一個接一個地排列,框之間的垂直距離是由框的垂直外邊距計算出來。
行內(nèi)框在一行中水平布置。可以使用水平內(nèi)邊距、邊框和外邊距調(diào)整它們的間距。但是,垂直內(nèi)邊距、邊框和外邊距不影響行內(nèi)框的高度。由一行形成的水平框稱為行框(Line Box),行框的高度總是足以容納它包含的所有行內(nèi)框。不過,設(shè)置行高可以增加這個框的高度。
我們通過瀏覽器所看到得頁面是當瀏覽器在接收到服務(wù)器的響應(yīng)后,即收到一個HTML文件后,瀏覽器對該HTML文件進行解析渲染后所呈現(xiàn)的頁面,而該頁面默認是流布局的,為什么呢,因為瀏覽器解析這個HTML文件時是由上而下進行的,依次解析響應(yīng)的內(nèi)容,然后根據(jù)解析到的元素類型由上而下,從左至右的填充瀏覽器頁面。
HTML頁面中的元素大概可以分類為兩種:塊元素(或DISPLAY:BLOCK)和行內(nèi)元素(或DISPLAY:INLINE)。
塊元素默認會占滿父元素的一行寬(即使自身不夠一行寬)然后前后加換行,如div、h1 或 p 。
行內(nèi)元素則緊跟在前一元素的后面,如span 和 strong 。
(假設(shè)AX為行內(nèi)元素,BX為塊元素)
A1,A2,B1,B2,A3為瀏覽器接收到得服務(wù)器端的響應(yīng),這時會有在頁面中產(chǎn)生以下布局:
-----------------
A1 A2
B1
B2
A3
----------------
可以想象,AX和BX是一個一個的盒子,那么瀏覽器在解析服務(wù)器端的響應(yīng)(或說是在渲染頁面)時,就可以看做是在不斷地擺弄著一堆盒子的過程(塊元素由塊框裝載,而行內(nèi)元素由行內(nèi)框裝載,一行的中的行內(nèi)框又被行框裝載。)。
當然,一個BODY也是一個盒子,而且是一個頂級盒子,裝載著頁面中的所有盒子。
何以想象,瀏覽器是一名搬運工,它的職責(zé)是把盒子搬到特定的地方,如果沒有特別的指示,那么它就會以默認的方式來放置這些盒子(這個默認根據(jù)瀏覽器的不同有所差異哦),如果我想控制它擺放的位置,那么顯然的,我就需要一名監(jiān)工,去告訴瀏覽器如何搬,這就是CSS了。當然CSS不僅僅用于控制布局。
元素不是塊元素就是行內(nèi)元素,但他們是可以相互轉(zhuǎn)換的(通過將 display 屬性設(shè)置為 block,可以讓行內(nèi)元素(比如 <a> 元素)表現(xiàn)得像塊級元素一樣。還可以通過把 display 設(shè)置為 none,讓生成的元素根本沒有框。這樣的話,該框及其所有內(nèi)容就不再顯示,不占用文檔中的空間。display屬性設(shè)置為設(shè)置為inline則轉(zhuǎn)換為行內(nèi)元素)。這使得設(shè)計具有很大的靈活性,如A標簽是行內(nèi)元素,點擊這個標簽中的文字才能激活這個標簽,當文字比較小的時候,會增加瀏覽者的訪問難度,這時可以把它設(shè)置為塊元素,再設(shè)置它的相關(guān)CSS屬性(width和height)就可以增大點擊的有效區(qū)域,從而改善用戶體驗。
上面提到塊元素默認會占滿父元素的一行寬(實際上,默認塊框的寬度和行寬一致),這時通過設(shè)置設(shè)置WIDTH和HEIGHT你會發(fā)現(xiàn)塊框發(fā)生了變化(通過DREAMWEARVER觀察得到)。這種變化可以說是為CSS的一個很重要布局埋下伏筆---------POSITION。
下圖是該屬性的說明:

-
static
-
元素框正常生成。塊級元素生成一個矩形框,作為文檔流的一部分,行內(nèi)元素則會創(chuàng)建一個或多個行框,置于其父元素中。
-
relative
-
在使用相對定位時,無論是否進行移動,元素仍然占據(jù)原來的空間。因此,移動元素會導(dǎo)致它覆蓋其它框。
-
相對定位是一個非常容易掌握的概念。如果對一個元素進行相對定位,它將出現(xiàn)在它所在的位置上。然后,可以通過設(shè)置垂直或水平位置,讓這個元素“相對于”它的起點進行移動。
如果將 top 設(shè)置為 20px,那么框?qū)⒃谠恢庙敳肯旅?20 像素的地方。如果 left 設(shè)置為 30 像素,那么會在元素左邊創(chuàng)建 30 像素的空間,也就是將元素向右移動。
#box_relative {
position: relative;
left: 30px;
top: 20px;
}
-
absolute
-
元素框從文檔流完全刪除,并相對于其包含塊定位。包含塊可能是文檔中的另一個元素或者是初始包含塊。元素原先在正常文檔流中所占的空間會關(guān)閉,就好像元素原來不存在一樣。元素定位后生成一個塊級框,而不論原來它在正常流中生成何種類型的框。
-
絕對定位的元素的位置相對于最近的已定位祖先元素,如果元素沒有已定位的祖先元素,那么它的位置相對于最初的包含塊。
-
-
fixed
-
元素框的表現(xiàn)類似于將 position 設(shè)置為 absolute,不過其包含塊是視窗本身。
提示:相對定位實際上被看作普通流定位模型的一部分,因為元素的位置相對于它在普通流中的位置。
有一點要注意:如果父元素是相對定位,而子元素是絕對定位的,那么子元素的LEFT,TOP是相對于父元素的PADDING的左上角產(chǎn)生位移(或者以border的內(nèi)邊線為參考),而不是html頁面。

接下來看一個例子吧:

Code
<html>
<head>
<style type="text/css">
*{
margin:0;}
#waimian{
position:relative;
margin:20px;
border:20px #0000FF solid;
padding:20px;
}
.noab{
margin:20px;
border:20px #FF0000 solid;
padding:20px;}
.limian{
position:absolute;
margin:20px;
border:20px #00FF00 solid;
padding:20px;
left:15PX;
}
</style>
<script type="text/javascript">
function setTopEdge()
{
var bb=document.getElementById("kan").offsetParent;
alert(bb.id);
}
</script>
</head>
<body>
<div id="waimian">
<div class="noab">
world
</div>
<div class="limian" id="kan">
<input type="button" id="b1" onClick="setTopEdge()" value="Set top edge to 100 px" />
</div>
</div>
<a style="border:1px #659836 solid; display:block;" href="http://www.baidu.com">baidu</a>
<a href="#">dsfdfsdfds</a>
</body>
</html>
另外一個例子(一個簡陋的導(dǎo)航):
css部分:

Code
<style>
*{margin:0;padding:0}
body{background-color:#CCCCCC;}
ul li{text-align:center; vertical-align:middle;float:left;width:100px;height:40px; list-style:none;background-color:#FF9900;
border-width:0px 1px;border-style:solid;border-color:#FF0000;}
#content1,#content2,#content3,#content4{width:408px;height:150px;position:absolute;top:40px;left:0}
/*寬度為408px是考慮到有4個LI(每個寬度為100px)和Border的寬度,絕度定位很重要,如果不是會出現(xiàn)奇特的效果(去掉試試看哈),top40px剛好是LI的HEIGHT*/
.dis{display:none;}/*默認隱藏層*/
ul li:hover{
background-color:#FFFFCC;}
ul li:hover div{display:block}/*顯示層*/
#content1{
background-color:#33FF99}
#content2{
background-color:#33CC66}
#content3{
background-color:#006600}
#content4{
background-color:#003300}
</style>
body部分:

Code
<body>
<div class="meau">
<ul>
<li id="one"><a href="#">首頁</a><div id="content1" class="dis">index</div></li>
<li id="two"><a href="">服裝</a><div id="content2" class="dis">clothes</div></li>
<li id="three"><a href="">手機</a><div id="content3" class="dis">telephone</div></li>
<li id="fourt"><a href="">電腦</a><div id="content4" class="dis">pc</div></li>
</ul>
</div>
</body>