CSS控制排版(轉載)

前言

  在用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不支持)。

[nextpage]

  相對定位(relative):對象不可層疊,依據left,right,top,bottom等屬性在正常文檔流中偏移自身位置。同樣可以用z-index分層設計。

  2.定位的形象解釋

  我先來架設一個虛擬的場景:有一個矩形的房間,裏面還有一個水桶裝了些水,水裏還浸泡着一個西瓜,這個房間半空中還有不少的鉤子用於掛東西用。現在我把網頁元素與上面物件對應上,那麼房間就是一個網頁,水桶是網頁中的一個板塊,桶中的水就是文本流,西瓜就是將要被定位的對象。

  (1)貢獻的絕對定位(absolute)

  對照前面解釋,如果西瓜被賦予絕對定位,那麼就等於把西瓜從水中撈起來掛在半空中的鉤子上,水桶中西瓜原來佔用的空間水會自動填補它(絕對定位對象會讓出自己原先佔用位置,所以說它是貢獻的)。此時如果之前沒有對水桶進行定位設定,那麼被拿起的西瓜位置不會再受水桶位置影響,水桶怎麼移動,西瓜還是掛在原來位置,至於西瓜要怎放,則以房間左上角(body左上角)爲準,用left,right,top,bottom值來定位。但是如果水桶也給出了定位設置(通常是相對定位,下面有講到這一實用技巧),此時西瓜的擺放就沒有那麼自由了,儘管此時西瓜被拿起來了不會影響水桶中的水(文本流),但它還是要聽桶的話,桶會告訴西瓜“你可以活動,但應該在我的範圍內走動,比方說我要你在我左上方1米處,你就要跟死這一點,我走你也要跟着走”,如果桶中有很多個西瓜,可以全部拿出來吊到半空中,它們將被安排在不同高度的空間(層),所以在房頂垂直往下看,有可能看到不同西瓜層疊在一起的情況(這個所謂的高度在網頁中是不存在的,就像FLASH動畫中的不同層上安排了元素,但它們在看時不會有深度感覺)。可見絕對定位的對象參考目標是它的父級,專業稱之爲包含塊。

[nextpage]

  (2)自私的相對定位(relative)

  相對定位一個最大特點是:自己通過定位跑開了還佔用着原來的位置,不會讓給他周圍的諸如文本流之類的對象。相對定位也比較獨立,做什麼事它自己說了算,要定位的時候,它是以自己本身所在位置偏移的(相對對象本身偏移)。再拿前邊作比如來解,那麼此時西瓜似乎是有魔法的,如果西瓜通過相對定位在水桶中偏移了你會看到一個現實生活中不存在的現象:水中有一個地方水凹下去了,周圍的水不能填補它,西瓜看起來在旁邊,如果攪動一下桶中的水,那個凹的位置會發現改變(文本流對相對定位對象還存在影響),但是凹處到西瓜出現的距離始終保持一致。可見文本流與它之間還會互相影響,因爲對象並沒有真正脫離文本流,就像有兩個人在同一層樓水平移動的過程中會有碰頭的機會。

  (3)總結兩種定位的特徵

  絕對定位就像是把不同對象安排到了一棟高樓的不同樓層(一般指不是第一層,我們這裏理解爲文本流就放在首層),它們互不影響,但是它們怎麼移動與你樓的地基和麪積(父級)有關。相對定位指對象還是在首層樓與文本流一起存放,它們之間肯定存在影響。

  (4)對特殊情況的補充

  在用相對定位和絕對定位的時候,有一種情況是它們的定位值用到了負值則對象可沿相反方向移動,剛纔說到的把對象安排在一棟樓的不同層,如果某個對象一開始就是背靠着最外邊牆的,此時再用一個負值定位它,它就會神奇般地跑出牆外去了,當然現實中可沒有這種驚險而又神奇的事發生,本人只爲了延用上面的比如作形象解釋。

  3.實例強化對定位屬性的理解

  (1)無定位設置,對象遵循HTML定位規則。一般是子級不會跑出父級外邊去(子級沒有使用負邊界情況),子級一般是靠在父級左上角的,父級放在最下層。

[nextpage]

  示例代碼瀏覽:http://tech.ddvip.com/yssl/29811/29813_1.html

  (2)給設定了定位屬性的對象指定left,right,top,bottom屬性中的至少一個,不然定位不起作用。下面實例中雖然給box2設定了定位屬性position: absolute,但是如果沒有指定其中一個方位定位值top: 0px,定位是不發生作用的,你可以刪除我註釋的樣式再測試效果進行前後對比。

  示例代碼瀏覽:http://tech.ddvip.com/yssl/29811/29813_2.html

  (3)絕對定位對象可以層疊,層疊順序用z-index控制,如果沒有指定則遵循其父對象的定位方法,就目前來說要做到不同瀏覽器正常瀏覽,最好不要給z-index指定負值,因爲像FF這樣標準的瀏覽器不支持負值,爲了解釋這一現象,下面實例中的最底層圖片我用到了負值,所以會出現在IE中可以看到3幅圖層疊,而轉到FF中你就只能看到兩幅圖層疊了。

  示例代碼瀏覽:http://tech.ddvip.com/yssl/29811/29813_3.html

  (4)相對定位對象會佔據它原來位置,在下面實例中,沒有設定相對定位前,綠色小盒子是在藍色盒子左上角的,之前也設定了綠色小盒子的浮動方式爲左浮動,可以看到文本環繞在它右邊,但是後來用相對定位方法把綠色小盒子重定位到外面去了,它還佔着自己原來位置,因爲你還可以看到文本流沒有發生自動填補流動。因此這種直接的相對定位方法較少用,因爲重定位對象後原來位置空了一塊。相對定位常與絕對定位結合用,一般是給父級設定相對定位方式,子級元素就可以相對它進行方便的絕對定位了(請注意看後面的實例)。

[nextpage]

  示例代碼瀏覽:http://tech.ddvip.com/yssl/29811/29813_4.html

  (5)相對定位的對象不可以重疊。這一點也許比較難理解,先來這樣理解吧,因爲相對定位的對像沒有脫離文本流,就像兩個還是住在同一層樓的人,任何時候,他們腳下踩的地方不可能被另一個人踩着的,如果可以就意味着兩個人共享一塊地方了。在下面的實例中,兩個小盒子都剛好排在大盒子上方,所以在大盒子中輸入的文字被擠到了下面。上面兩個盒子我再用相對定位的方法對調了它們的位置,當前它們下方的空間其實不是自己的,也正因爲它們沒有重疊,所以盒子上方還是有兩個盒子佔用的空間,下面文字無法向上流動(我已對盒子設定了浮動屬性的了,如果不設定,即使有空間文本也不會往上流,上面盒子是塊級元素,會獨立佔據一行)。

  示例代碼瀏覽:http://tech.ddvip.com/yssl/29811/29813_5.html

  (6)高度自適應的妙用。在下面實例中,右邊的紫色小盒子高度是沒有設定的,它的高度是隨着裏面內容的增加而增高的,但我們又可以通過絕對定位方法把它始終定位在父盒子的右上角。同理,我們也可以只設定高度而讓寬度自動隨內容增加而變寬。

  示例代碼瀏覽:http://tech.ddvip.com/yssl/29811/29813_6.html

  (7)給包含塊一個高度,或者說給定位對象的父級設定一個高度。不然也許顯示的結果並不是你想要的。在下面的例子中,如果你本意要實現下面效果:把小盒子在父盒子中的左上角垂直往下偏移,上方留出一塊區域,如果你刪除了box1的高度會怎麼樣呢?自己測試一下吧。

[nextpage]

  示例代碼瀏覽:http://tech.ddvip.com/yssl/29811/29813_7.html

  (8)放置絕對定位對像到可視區外會出現滾動條。一般情況下,絕對定位是用來方便定位網頁要看得見元素的,而不是拿它來隱藏對象的,一般隱藏對象常用到display與margin,如果你試圖把絕對定位的對象移出可視區域,嘿嘿,瀏覽器會爲你準備滾動條去看望它。

  示例代碼瀏覽:http://tech.ddvip.com/yssl/29811/29813_8.html

  (9)放置相對定位對像到可視區外不會出現滾動條。此現象很好理解,因爲相對定位對象原來位置沒有變,原來位置沒有出去滾動條就不會出現。在下面實例中,如果你縮小瀏覽器窗口,相對定位的對象還會出現完全消失的情況呢。

  示例代碼瀏覽:http://tech.ddvip.com/yssl/29811/29813_9.html

  (10)定位的特殊值情況。如果定位設置是這樣的:position:relative ,right:200px, left:10px會出現什麼情況呢?一邊叫對象向右偏移10px,另一邊又叫對象向左偏移200px,到底是聽那邊的呢,還是那個先,那個後呢。針對這種矛盾情況,CSS規定只聽左邊的left,而右邊怎麼設置都被重定爲-left,即-left =right。上下值top與bottom矛盾的話,就以top爲準,所以在下面的實例中,你如何改變right的值,對象位置不會發生改變的。

  示例代碼瀏覽:http://tech.ddvip.com/yssl/29811/29813_10.html

  4.綜合實例見證定位的魅力

  先看最終演示效果,具體教程請繼續關注,本人正抽空整理。

  示例代碼瀏覽:http://tech.ddvip.com/yssl/29811/29813_11.html

[nextpage]

  相對定位(relative):對象不可層疊,依據left,right,top,bottom等屬性在正常文檔流中偏移自身位置。同樣可以用z-index分層設計。

  2.定位的形象解釋

  我先來架設一個虛擬的場景:有一個矩形的房間,裏面還有一個水桶裝了些水,水裏還浸泡着一個西瓜,這個房間半空中還有不少的鉤子用於掛東西用。現在我把網頁元素與上面物件對應上,那麼房間就是一個網頁,水桶是網頁中的一個板塊,桶中的水就是文本流,西瓜就是將要被定位的對象。

  (1)貢獻的絕對定位(absolute)

  對照前面解釋,如果西瓜被賦予絕對定位,那麼就等於把西瓜從水中撈起來掛在半空中的鉤子上,水桶中西瓜原來佔用的空間水會自動填補它(絕對定位對象會讓出自己原先佔用位置,所以說它是貢獻的)。此時如果之前沒有對水桶進行定位設定,那麼被拿起的西瓜位置不會再受水桶位置影響,水桶怎麼移動,西瓜還是掛在原來位置,至於西瓜要怎放,則以房間左上角(body左上角)爲準,用left,right,top,bottom值來定位。但是如果水桶也給出了定位設置(通常是相對定位,下面有講到這一實用技巧),此時西瓜的擺放就沒有那麼自由了,儘管此時西瓜被拿起來了不會影響水桶中的水(文本流),但它還是要聽桶的話,桶會告訴西瓜“你可以活動,但應該在我的範圍內走動,比方說我要你在我左上方1米處,你就要跟死這一點,我走你也要跟着走”,如果桶中有很多個西瓜,可以全部拿出來吊到半空中,它們將被安排在不同高度的空間(層),所以在房頂垂直往下看,有可能看到不同西瓜層疊在一起的情況(這個所謂的高度在網頁中是不存在的,就像FLASH動畫中的不同層上安排了元素,但它們在看時不會有深度感覺)。可見絕對定位的對象參考目標是它的父級,專業稱之爲包含塊。

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