CSS 定位機(jī)制
CSS 有三種基本的定位機(jī)制:普通流、浮動(dòng)和絕對(duì)定位。
一、普通流
除非專(zhuān)門(mén)指定,否則所有框都在普通流中定位。普通流中元素框的位置由元素在(X)HTML中的位置決定。塊級(jí)元素從上到下依次排列,框之間的垂直距離由框的垂直margin計(jì)算得到。行內(nèi)元素在一行中水平布置。
二、定位
?。?、相對(duì)定位
被看作普通流定位模型的一部分,定位元素的位置相對(duì)于它在普通流中的位置進(jìn)行移動(dòng)。使用相對(duì)定位的元素不管它是否進(jìn)行移動(dòng),元素仍要占據(jù)它原來(lái)的位置。移動(dòng)元素會(huì)導(dǎo)致它覆蓋其他的框。
<html>
<head>
<style type="text/css"> .box1{ background-color: red; width:100px; height:100px;
} .box2{ background-color: yellow; width:100px; height:100px; position: relative; left: 20px;
} .box3{ background-color: blue; width:100px; height:100px; position: relative; right: 20px;
}
</style>
</head>
<body>
<div class="box1">box1</div>
<div class="box2">box2</div>
<div class="box3">box3</div>
</body>
</html>
效果如下圖所示:

?。?、絕對(duì)定位
相對(duì)于已定位的最近的祖先元素,如果沒(méi)有已定位的最近的祖先元素,那么它的位置就相對(duì)于最初的包含塊(如body)。絕對(duì)定位的框可以從它的包含塊向上、右、下、左移動(dòng)。
絕對(duì)定位的框脫離普通流,所以它可以覆蓋頁(yè)面上的其他元素,可以通過(guò)設(shè)置Z-Iindex屬性來(lái)控制這些框的堆放次序。
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<style>
*{
margin: 0;
padding: 0;
}
#div1 {
width: 200px;
height: 200px;
background: yellow;
}
#div2 {
width: 50%;
height: 50%;
background: red;
top: 100px;
left: 100px;
position: absolute;
}
</style>
</head>
<body>
<div id="div1">
<div id="div2"></div>
</div>
</body>
</html>
效果如下圖所示:

備注:相對(duì)于已相對(duì)定位的祖先元素對(duì)框進(jìn)行絕對(duì)定位,在大多數(shù)現(xiàn)代瀏覽器中都可以實(shí)現(xiàn)的很好。
?。场⒐潭ǘㄎ?/strong>
相對(duì)于瀏覽器窗口,其余的特點(diǎn)類(lèi)似于絕對(duì)定位。
三、浮動(dòng)
浮動(dòng)的框可以在左右移動(dòng),直到它的外邊框邊緣碰到包含框或另一個(gè)浮動(dòng)框的邊緣。浮動(dòng)的框脫離普通流。
如果包含塊太窄,無(wú)法容納水平排列的浮動(dòng)元素,那么其他浮動(dòng)塊向下移動(dòng),直到有足夠多的空間。如果浮動(dòng)元素的高度不同,那么當(dāng)它們向下移動(dòng)時(shí)可能會(huì)被其他浮動(dòng)元素卡住。
行內(nèi)元素會(huì)圍繞著浮動(dòng)框排列。
請(qǐng)看下圖,當(dāng)把框 1 向右浮動(dòng)時(shí),它脫離文檔流并且向右移動(dòng),直到它的右邊緣碰到包含框的右邊緣:

再請(qǐng)看下圖,當(dāng)框 1 向左浮動(dòng)時(shí),它脫離文檔流并且向左移動(dòng),直到它的左邊緣碰到包含框的左邊緣。因?yàn)樗辉偬幱谖臋n流中,所以它不占據(jù)空間,實(shí)際上覆蓋住了框 2,使框 2 從視圖中消失。
如果把所有三個(gè)框都向左移動(dòng),那么框 1 向左浮動(dòng)直到碰到包含框,另外兩個(gè)框向左浮動(dòng)直到碰到前一個(gè)浮動(dòng)框。

如下圖所示,如果包含框太窄,無(wú)法容納水平排列的三個(gè)浮動(dòng)元素,那么其它浮動(dòng)塊向下移動(dòng),直到有足夠的空間。如果浮動(dòng)元素的高度不同,那么當(dāng)它們向下移動(dòng)時(shí)可能被其它浮動(dòng)元素“卡住”:

清除浮動(dòng)
簡(jiǎn)單介紹下清除浮動(dòng)的2中方法。
方法一:結(jié)合:after選擇器清除浮動(dòng)。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style> .box1 { border: 1px solid red; background-color: yellow;
} .clear:after { content: "." ; display: block; height: 0; visibility: hidden; clear: both;
} .box2 { width: 50px; height: 50px; float: left; background-color: orange;
} p { float: right;
}
</style>
</head>
<body>
<div class="box1 clear">
<div class="box2"> box2 </div>
<p> lallalalalalal啦啦啦
lallalalalalal啦啦啦
lallalalalalal啦啦啦
lallalalalalal啦啦啦
lallalalalalal啦啦啦
lallalalalalal啦啦啦
lallalalalalal啦啦啦
lallalalalalal啦啦啦
lallalalalalal啦啦啦
lallalalalalal啦啦啦
lallalalalalal啦啦啦
lallalalalalal啦啦啦 </p>
</div>
</body>
</html>
方法二,在容器最后添加一個(gè)空元素并且清理它。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style> .box1 { border: 1px solid red; background-color: yellow;
} .empty{ clear: both;
} .box2 { width: 50px; height: 50px; float: left; background-color: orange;
} p { float: right;
}
</style>
</head>
<body>
<div class="box1 clear">
<div class="box2"> box2 </div>
<p> lallalalalalal啦啦啦
lallalalalalal啦啦啦
lallalalalalal啦啦啦
lallalalalalal啦啦啦
lallalalalalal啦啦啦
lallalalalalal啦啦啦
lallalalalalal啦啦啦
lallalalalalal啦啦啦
lallalalalalal啦啦啦
lallalalalalal啦啦啦
lallalalalalal啦啦啦
lallalalalalal啦啦啦 </p>
<br class="empty" />
</div>
</body>
</html>
效果均如下所示:

附錄:
CSS position 屬性總結(jié):
所有主流瀏覽器都支持 position 屬性。position屬性規(guī)定元素的定位類(lèi)型,影響元素框生成的方式。
可能的值
absolute
生成絕對(duì)定位的元素,相對(duì)于 static 定位以外的第一個(gè)父元素進(jìn)行定位,如果不存在這樣的父元素,則依據(jù)最初的包含快。根據(jù)用戶(hù)代理的不同,最初的包含塊可能是畫(huà)布或 HTML 元素。
元素的位置通過(guò) "left", "top", "right" 以及 "bottom" 屬性進(jìn)行規(guī)定,也可以通過(guò)z-index進(jìn)行層次分級(jí)。
(元素框從文檔流完全刪除,并相對(duì)于其包含塊定位。包含塊可能是文檔中的另一個(gè)元素或者是初始包含塊。元素原先在正常文檔流中所占的空間會(huì)關(guān)閉,就好像元素原來(lái)不存在一樣。元素定位后生成一個(gè)塊級(jí)框,而不論原來(lái)它在正常流中生成何種類(lèi)型的框。)
fixed
生成固定/絕對(duì)定位的元素,相對(duì)于瀏覽器窗口進(jìn)行定位。
元素的位置通過(guò) "left", "top", "right" 以及 "bottom" 屬性進(jìn)行規(guī)定。
(元素框的表現(xiàn)類(lèi)似于將 position 設(shè)置為 absolute,不過(guò)其包含塊是視窗本身。)
relative
生成相對(duì)定位的元素,相對(duì)于其正常位置進(jìn)行定位。
因此,"left:20" 會(huì)向元素的 LEFT 位置添加 20 像素。
(相對(duì)定位實(shí)際上被看作普通流定位模型的一部分,因?yàn)樵氐奈恢孟鄬?duì)于它在普通流中的位置。元素框偏移某個(gè)距離。元素仍保持其未定位前的形狀,仍保留原本所占的空間。 )
static
默認(rèn)值。沒(méi)有定位,元素出現(xiàn)在正常的流中(忽略 top, bottom, left, right 或者 z-index 聲明,即上述聲明無(wú)效)。
(元素框正常生成。塊級(jí)元素生成一個(gè)矩形框,作為文檔流的一部分,行內(nèi)元素則會(huì)創(chuàng)建一個(gè)或多個(gè)行框,置于其父元素中。)
inherit :規(guī)定應(yīng)該從父元素繼承 position 屬性的值。
CSS 定位屬性
CSS 定位屬性允許你對(duì)元素進(jìn)行定位。
| 屬性 | 描述 |
|---|---|
| position | 把元素放置到一個(gè)靜態(tài)的、相對(duì)的、絕對(duì)的、或固定的位置中。 |
| top | 定義了一個(gè)定位元素的上外邊距邊界與其包含塊上邊界之間的偏移。 |
| right | 定義了定位元素右外邊距邊界與其包含塊右邊界之間的偏移。 |
| bottom | 定義了定位元素下外邊距邊界與其包含塊下邊界之間的偏移。 |
| left | 定義了定位元素左外邊距邊界與其包含塊左邊界之間的偏移。 |
| overflow | 設(shè)置當(dāng)元素的內(nèi)容溢出其區(qū)域時(shí)發(fā)生的事情。 |
| clip | 設(shè)置元素的形狀。元素被剪入這個(gè)形狀之中,然后顯示出來(lái)。 |
| vertical-align | 設(shè)置元素的垂直對(duì)齊方式。 |
| z-index | 設(shè)置元素的堆疊順序。 |