在用CSS控制排版過程中,定位一直被人認為是一個難點,這主要是表現為很多網友在沒有深入理解清楚定位的原理時,排出來的雜亂網頁常讓他們不知所措,而另一邊一些高手則常常借助定位的強大功能做出些很酷的效果來,比如CSS相冊等等,因此自己雜亂的網頁與高手完美的設計形成鮮明對比,這在一定程度上打擊了初學定位的網友,也在他們心目中形成這樣的一種思想:當我熟練地玩轉CSS定位時,我就已是高手了。不管你怎麼想,我只希望下面的教程能讓你更深入地了解CSS定位屬性。
閱讀建議
先說說我這篇教程的思路,這對於你在正真開始閱教程前是有很大幫助的。我的思路是這樣的:先給出定位較專業化精煉的解釋,接下來再用打比如的方法形象地介紹它們,此時大家要和前面講到的專業解釋對比閱讀。介紹完理論,將通過實例來介紹定位的各知識點,雖然實例不美,但每一則實例都是精心挑選的,如果要完整掌握CSS定位方法,請務必弄懂每一個實例的原理。最後將會帶大家做一個較為酷的綜合實例。如果你想提高你閱讀本文的興趣或者動力,你可以先跳到最後看綜合實例的運行效果。
1.定位的專業解釋
(1)語法
position : static | absolute | fixed | relative
(2) 說明
從上面語法可以看出,定位的方法有很多種,它們分別是靜態(static),絕對定位(absolute),固定(fixed),相對定位(relative)。在這個教程裡,我不逐一講,只講最常用也是最實用的兩個定位方法:絕對定位(absolute)、相對定位(relative)。
絕對定位(absolute):將被賦予此定位方法的對象從文檔流中拖出,使用left,right,top, bottom等屬性相對於其最接近的一個最有定位設置的父級對象進行絕對定位,如果對象的父級沒有設置定位屬性,即還是遵循HTML定位規則的,則依據 body 對象左上角作為參考進行定位。絕對定位對象可層疊,層疊順序可通過 z-index 屬性控制,z-index值為無單位的整數,大的在最上面,可以有負值(目前負值FF不支持)。
相對定位(relative):對象不可層疊,依據left,right,top,bottom等屬性在正常文檔流中偏移自身位置。同樣可以用z-index分層設計。
2.定位的形象解釋
我先來架設一個虛擬的場景:有一個矩形的房間,裡面還有一個水桶裝了些水,水裡還浸泡著一個西瓜,這個房間半空中還有不少的鉤子用於掛東西用。現在我把網頁元素與上面物件對應上,那麼房間就是一個網頁,水桶是網頁中的一個板塊,桶中的水就是文本流,西瓜就是將要被定位的對象。
(1)貢獻的絕對定位(absolute)
對照前面解釋,如果西瓜被賦予絕對定位,那麼就等於把西瓜從水中撈起來掛在半空中的鉤子上,水桶中西瓜原來占用的空間水會自動填補它(絕對定位對象會讓出自己原先占用位置,所以說它是貢獻的)。此時如果之前沒有對水桶進行定位設定,那麼被拿起的西瓜位置不會再受水桶位置影響,水桶怎麼移動,西瓜還是掛在原來位置,至於西瓜要怎放,則以房間左上角(body左上角)為准,用left,right,top,bottom值來定位。但是如果水桶也給出了定位設置(通常是相對定位,下面有講到這一實用技巧),此時西瓜的擺放就沒有那麼自由了,盡管此時西瓜被拿起來了不會影響水桶中的水(文本流),但它還是要聽桶的話,桶會告訴西瓜“你可以活動,但應該在我的范圍內走動,比方說我要你在我左上方1米處,你就要跟死這一點,我走你也要跟著走”,如果桶中有很多個西瓜,可以全部拿出來吊到半空中,它們將被安排在不同高度的空間(層),所以在房頂垂直往下看,有可能看到不同西瓜層疊在一起的情況(這個所謂的高度在網頁中是不存在的,就像FLASH動畫中的不同層上安排了元素,但它們在看時不會有深度感覺)。可見絕對定位的對象參考目標是它的父級,專業稱之為包含塊。
(2)自私的相對定位(relative)
相對定位一個最大特點是:自己通過定位跑開了還占用著原來的位置,不會讓給他周圍的諸如文本流之類的對象。相對定位也比較獨立,做什麼事它自己說了算,要定位的時候,它是以自己本身所在位置偏移的(相對對象本身偏移)。再拿前邊作比如來解,那麼此時西瓜似乎是有魔法的,如果西瓜通過相對定位在水桶中偏移了你會看到一個現實生活中不存在的現象:水中有一個地方水凹下去了,周圍的水不能填補它,西瓜看起來在旁邊,如果攪動一下桶中的水,那個凹的位置會發現改變(文本流對相對定位對象還存在影響),但是凹處到西瓜出現的距離始終保持一致。可見文本流與它之間還會互相影響,因為對象並沒有真正脫離文本流,就像有兩個人在同一層樓水平移動的過程中會有碰頭的機會。
(3)總結兩種定位的特征
絕對定位就像是把不同對象安排到了一棟高樓的不同樓層(一般指不是第一層,我們這裡理解為文本流就放在首層),它們互不影響,但是它們怎麼移動與你樓的地基和面積(父級)有關。相對定位指對象還是在首層樓與文本流一起存放,它們之間肯定存在影響。
(4)對特殊情況的補充
在用相對定位和絕對定位的時候,有一種情況是它們的定位值用到了負值則對象可沿相反方向移動,剛才說到的把對象安排在一棟樓的不同層,如果某個對象一開始就是背靠著最外邊牆的,此時再用一個負值定位它,它就會神奇般地跑出牆外去了,當然現實中可沒有這種驚險而又神奇的事發生,本人只為了延用上面的比如作形象解釋。
3.實例強化對定位屬性的理解
(1)無定位設置,對象遵循HTML定位規則。一般是子級不會跑出父級外邊去(子級沒有使用負邊界情況),子級一般是靠在父級左上角的,父級放在最下層。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>無定位設定,對象遵循HTML定位規則</title>
<style type="text/css">
<!--
body {
margin:0px;
font-size: 9pt;
margin-top: 150px;
margin-left: 150px;
}
.box1 {
background-color: #33CCFF;
height: 200px;
width: 200px;
}
.box2 {
background-color: #66CC66;
height: 100px;
width: 100px;
}
-->
</style>
</head>
<body>
<div class="box1">
<div class="box2"></div>
</div>
</body>
</html>
(2)給設定了定位屬性的對象指定left,right,top,bottom屬性中的至少一個,不然定位不起作用。下面實例中雖然給box2設定了定位屬性position: absolute,但是如果沒有指定其中一個方位定位值top: 0px,定位是不發生作用的,你可以刪除我注釋的樣式再測試效果進行前後對比。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>給定位對象指定一個方位數值</title>
<style type="text/css">
<!--
body {
margin:0px;
font-size: 9pt;
margin-top: 150px;
margin-left: 150px;
}
.box1 {
background-color: #33CCFF;
height: 200px;
width: 200px;
}
.box2 {
background-color: #66CC66;
height: 100px;
width: 100px;
position: absolute;
top: 0px;/*如果沒有指定一個方位定位屬性和值,絕對定位不起作用,你可以刪除這一項看一下效果*/
}
-->
</style>
</head>
<body>
<div class="box1">
<div class="box2"></div>
</div>
</body>
</html>
(3)絕對定位對象可以層疊,層疊順序用z-index控制,如果沒有指定則遵循其父對象的定位方法,就目前來說要做到不同浏覽器正常浏覽,最好不要給z-index指定負值,因為像FF這樣標准的浏覽器不支持負值,為了解釋這一現象,下面實例中的最底層圖片我用到了負值,所以會出現在IE中可以看到3幅圖層疊,而轉到FF中你就只能看到兩幅圖層疊了。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>絕對定位對象可以層疊,層疊順序可用z-index控制,但最好不要用負值,因為FF不支持</title>
<style type="text/css">
<!--
body {
margin:0px;
font-size: 9pt;
margin-top: 150px;
margin-left: 150px;
}
.box1 {
background-color: #33CCFF;
height: 200px;
width: 270px;
background-image: url(htll_m.jpg);
background-repeat: no-repeat;
background-position: center center;
position: absolute;
left: 10px;
top: 10px;
z-index:-1;/*這裡用了負值,在標准浏覽器,如FF中是不能正常顯示的*/
}
.box2 {
background-color: #66CC33;
height: 200px;
width: 270px;
background-image: url(l_e50414fe42_m.jpg);
background-repeat: no-repeat;
background-position: center center;
position: absolute;
left: 50px;
top: 50px;
}
.box3 {
background-color: #996699;
height: 200px;
width: 270px;
background-image: url(172522117_410a1e87c1_m.jpg);
background-repeat: no-repeat;
background-position: center center;
position: absolute;
left: 100px;
top: 100px;
}
-->
</style>
</head>
<body>
<div class="box1"></div>
<div class="box2"></div>
<div class="box3"></div>
</body>
</html>
(4)相對定位對象會占據它原來位置,在下面實例中,沒有設定相對定位前,綠色小盒子是在藍色盒子左上角的,之前也設定了綠色小盒子的浮動方式為左浮動,可以看到文本環繞在它右邊,但是後來用相對定位方法把綠色小盒子重定位到外面去了,它還占著自己原來位置,因為你還可以看到文本流沒有發生自動填補流動。因此這種直接的相對定位方法較少用,因為重定位對象後原來位置空了一塊。相對定位常與絕對定位結合用,一般是給父級設定相對定位方式,子級元素就可以相對它進行方便的絕對定位了(請注意看後面的實例)。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>相對定位對象會占據原有位置</title>
<style type="text/css">
<!--
body {
margin:0px;
font-size: 9pt;
line-height:12pt;
margin-top: 150px;
margin-left: 150px;
}
.box1 {
background-color: #3CF;
height: 200px;
width: 200px;
}
.box2 {
background-color: #6C6;
height: 100px;
width: 100px;
position: relative;
float: left;
top:-120px;
}
-->
</style>
</head>
<body>
<div class="box1">
<div class="box2"></div>
[相對定位對象會占據原有位置]現在綠色小盒子是以子盒子形式存在藍色大盒子中,並設定了浮動方式為左浮動,所以這些文字能環繞在它右邊,當綠色小盒子用相對定位方法重定位到外邊去了,文字還是不能流入它的區域,即左上角空白區域,那是因為綠色盒子還占用著它原來位置。</div>
</body>
</html>