2005年04月29日

CSS 排版觀念:Position

很多人都會用圖層來製作網頁,或許常會聽到所謂的絕對位置和相對位置。其實它們都是 CSS 中 position 的設定值,透過設定 position ,便能讓我們隨意移動元素的位置。

不過它們之間到底有什麼不同呢?本文做個簡單的說明。

參數說明

首先我把其中的關係整理成表:

CSS 排版觀念 position 參數說明
position 參數
/ 參數說明
absoluterelativestatic(預設值)fixed
中文意義 絕對位置 相對位置 靜態位置 固定位置
畫面位置參考基準 父元素內容區邊界 原本應該在的位置 不變 不指定:原本應該在的位置
指定:螢幕視窗最大可視範圍邊界 (或框架邊界)
移動參考基準 文件 文件 文件 螢幕視窗最大可視範圍
可改變顯示位置
可調整大小 display 為 block :是
display 為 inline :否
display 為 block :是
display 為 inline :否
從顯示流程中去除

當我們對元素的 position 屬性,指定了 absolute、 relative 或 fixed 後,這個元素就可以移動了。我們可以用 top, left, right, bottom 這四種屬性來指定元素要呈現的位置。

由於 IE 不支援 position: fixed ,使得固定位置這個好用的技巧一直不受大家的重視。但在這裡我還是提一下。你可以使用 FireFox 來感受一下固定位置的強大威力,或是等待新版的 IE 支援。

接下來我們來解釋上面的表列裡,每個參數說明的意義。

畫面位置參考基準

以絕對位置 (position: absolute) 而言,故名思義,它是以父元素的邊界為絕對起點。例如如果我們設定 top: 50px ,那麼這個元素就會在距離父元素內容區上邊界 50px 的地方呈現,如下圖:

position: absolute

補充:如果父元素的 position 不是 absolute 或 relative 時,那麼元素的位置就會再對應到父元素的上層元素;如果其親代元素的 position 都沒有設定 absolute 或 relative 時,就以螢幕視窗最大可視範圍邊界為基準。

而以相關位置 (position: relative) 而言,其意義就是相對於原本的位置。例如我們指定 top: 50px 時,那麼這個元素就會從原本應該呈現的位置往下移動 50px 。如下圖,紅色虛線部份就是未設定 position: relative 前,元素原該應該在的位置:

position: relative

而固定位置 (position: fixed) 指的就是固定在螢幕視窗最大可視範圍上,如果不指定位置 (top, left, right, bottom) 時,那元素就會固定在原本的位置;而指定位置後,就會以螢幕視窗最大可視範圍的邊界為絕對基準點。如果頁面內容超過螢幕視窗最大可視範圍大小時,那麼不論我們如何捲動頁面,元素都會固定在螢幕視窗最大可視範圍上我們所指定的位置。

移動參考基準

當頁面可以捲動的時候,absolute 、 relative 、 static 都會跟著移動。只有 fixed 會固定在螢幕視窗最大可視範圍上,不會跟著移動。

可改變顯示位置

就是我們可以透過指定元素的 top, left, right, bottom 四個屬性,使元素改變顯示位置。如果元素是 position: static 時,會自動忽略所設定的 top, left, right, bottom 。

可調整大小

我們可以透過 width, height 來調整元素內容區的大小,不過當 position 是 relative 或是 static 時,元素的 display 屬性必須為 block 才可調整其大小。

從顯示流程中去除

顯示流程的意義就是頁面上的每一個元素的呈現,換句話說,就是該元素會出現的位置,及其佔用的空間等等。

我們可以將原來的頁面想成是一個圖層,每個元素都是一個一個緊接在前一個元素後面。如下圖,在尚未指定 position 時,粉紫色區塊會緊接在淺藍色區塊後。

從顯示流程中去除_1

請注意,我在這裡提到的圖層,指的是瀏覽器去解譯 HTML 後,將元素呈現出來的圖層,而非一般我們所認為,以絕對位置呈現的圖層;你可以把它想像成是 Photoshop 裡的圖層。

當我們指定淺藍色區塊的 position 屬性為 absolute 或 fixed 後,淺藍色區塊就會跑到另一個圖層;而粉紫色區塊因為淺藍色區塊已經從原圖層的顯示流程中去除了,所以它就自動往上跑。如下圖,紅色虛線就是粉紫色區塊原本的位置。

從顯示流程中去除_2

而元素如果指定為 relative 時,雖然也能移動,但原本的頁面圖層還是會保留該元素所佔有的空間。

後記

或許你在看完這篇文章之後,還是無法很清楚地了解 position 屬性的運作方式。建議你打開你的瀏覽器 (最好是用 FireFox),再用你慣用的 HTML 編輯器去試試它們之間的差異。然後回來看看這篇文章,你也許就能明白我的意思。

補充:如果頁面在框架裡時 (frame 或 iframe) ,所有參照螢幕視窗最大可視範圍邊界的元素就會改為參照框架邊界。

範例

以下這個範例,你可以看到設定 position 前及設定 position 後的關係:



Posted by jaceju at 樂多Roodo! │12:31 │CSS
樂多分類:網路/3C 共同主題:CSS設計排版 工具:編輯本文
Ads by Roodo! 
引用列表:
在樂多的首頁上搜尋到了jaceju的網站製作學習誌
裡面的介紹了許多網頁CSS排版的架構與觀念,
且用了淺顯易懂的說明再加上清楚的圖片
jaceju的有關網頁排版CSS解說網誌。【omuraisu】 at 2005年05月28日 17:13
最近覺得網頁設計是越來越有趣了,特別是加強了 CSS 的應用.......
CSS 的使用(一)【ch3128】 at 2005年07月7日 16:08
 position:absolute?把繁簡弄好之後,想把繁體、簡體的連結擺放到適當的位置。但是總是無法放好,今天看到了這一篇文章,文中寫道:補充:如果父元素的 position 不是 absolute 或 relative 時,那麼元素的位置就會再對應到父元素的上層元素;如果其親代元素的 position 都沒有設定 absolute 或 relative 時,就以螢幕視窗最大可視範圍邊界為基準。徒然豁然開朗。原來新版本的 xuite blog CSS 把整個版面分為好幾部分,難怪我的 position
xuite blog 物件如何使用絕對位置?【工作小錦囊】 at 2005年12月30日 13:59
回覆設定的一些問題【e-Totem】 at 2006年01月10日 13:42
回應文章
我打算把一系列的 CSS 排版觀念文章放上來,這是第一篇。
Posted by jaceju at 2005年04月30日 08:50
寫得真好呀,
期待續集!
Posted by 庭爸 at 2005年04月30日 09:16
補充一下:

上述的「螢幕」要改成「瀏覽視窗最大可視範圍」。
Posted by jaceju at 2005年05月24日 09:15
您好
我讀完以上文章
想請問
http://customer.manufacture.com.tw/~gt/yuanhosp/
中的圖層
要如何在800 及1024都不會偏移
目前用1024是偏左
用800600是正常
謝謝
Posted by mina at 2005年07月4日 17:24
請參考:

http://blog.roodo.com/jaceju/archives/77741.html

可確保 800x600 以上的任何解析度都不會跑位。
Posted by jaceju at 2005年07月5日 08:59
TO mina:

抱歉沒有注意到你說的是圖層式的下拉選單,我想你應該是用 Dreamweaver 之類的程式直接產生的吧?

如此一來,除了用「固定寬度且置中的版型」外,你的圖層位置計算方式也必須以 #container 的左邊界作為基準。

參考看看吧。
Posted by jaceju at 2005年07月5日 12:13
謝謝你的回覆
我試將#container 加在left#container :11px
是這個意思嗎
但好像不行
不好意思ㄚ麻煩您的指點
Posted by mina at 2005年07月5日 13:08
不太懂你的意思。

你現在應該做的,是用一個 <div="container"></div> 把 <body> 及 </body> 間的網頁內容包起來。然後用 CSS 把這個 #container 置中,這樣一來, #container 裡的所有圖層位置就會以 #container 的邊界為基準,而不是以視窗可視範圍為基準。

如果真的還是不清楚,那麼建議你先用簡單的方式來學習,把 CSS 圖層的觀念建立起來。

至於 CSS 語法,你還是得先弄熟。書的話可以參考我前面提到的幾本書,把相關的撰寫方式看懂。

釣竿給你了,魚就請你自己釣囉。
Posted by jaceju at 2005年07月5日 13:34
成功了非常感謝您
Posted by mina at 2005年07月5日 16:13
感謝您的教學,我試出了一些東西了
Posted by 文鄒鄒 at 2005年12月4日 01:20
呵呵..這位大大寫得很清楚..本來對CSS的position這幫面很有疑問..經妳說明後..有比較清楚哩..^^
Posted by tellies at 2006年09月10日 10:24