CSS 教程Part5 [定位](摘錄自 W3C School)

來源:互聯網
上載者:User
文章目錄
  • CSS 定位 (Positioning)
  • CSS 相對定位
  • CSS 絕對位置
  • CSS 浮動
CSS 定位 (Positioning)CSS 定位和浮動

       CSS 為定位和浮動提供了一些屬性,利用這些屬性,可以建立列式布局,將布局的一部分與另一部分重疊,還可以完成多年來通常需要使用多個表格才能完成的任務。

       定位的基本思想很簡單,它允許你定義元素框相對於其正常位置應該出現的位置,或者相對於父元素、另一個元素甚至瀏覽器視窗本身的位置。顯然,這個功能非常強大,也很讓人吃驚。要知道,使用者代理程式對 CSS2 中定位的支援遠勝於對其它方面的支援,對此不應感到奇怪。

       另一方面,CSS1 中首次提出了浮動,它以 Netscape 在 Web 發展初期增加的一個功能為基礎。浮動不完全是定位,不過,它當然也不是正常流布局。

 

一切皆為框

       div、h1 或 p 元素常常被稱為區塊層級元素。這意味著這些元素顯示為一塊內容,即“塊框”。與之相反,span 和 strong 等元素稱為“行內元素”,這是因為它們的內容顯示在行中,即“行內框”。

       您可以使用 display 屬性改變產生的框的類型。這意味著,通過將 display 屬性設定為 block,可以讓行內元素(比如 <a> 元素)表現得像區塊層級元素一樣。還可以通過把 display 設定為 none,讓產生的元素根本沒有框。這樣的話,該框及其所有內容就不再顯示,不佔用文檔中的空間。

display 屬性規定元素應該產生的框的類型

 

       但是在一種情況下,即使沒有進行顯式定義,也會建立區塊層級元素。這種情況發生在把一些文本添加到一個區塊層級元素(比如 div)的開頭。即使沒有把這些文本定義為段落,它也會被當作段落對待:

<div>some text<p>Some more text.</p></div>

 

CSS 定位機制

CSS 有三種基本的定位機制:普通流、浮動和絕對位置。

       除非專門指定,否則所有框都在普通流中定位。也就是說,普通流中的元素的位置由元素在 X(HTML) 中的位置決定。

       塊級框從上到下一個接一個地排列,框之間的垂直距離是由框的垂直外邊距計算出來。

       行內框在一行中水平布置。可以使用水平內邊距、邊框和外邊距調整它們的間距。但是,垂直內邊距、邊框和外邊距不影響行內框的高度。由一行形成的水平框稱為行框(Line Box),行框的高度總是足以容納它包含的所有行內框。不過,設定行高可以增加這個框的高度。

 

CSS position 屬性

static

       元素框正常產生。區塊層級元素產生一個矩形框,作為文檔流的一部分,行內元素則會建立一個或多個行框,置於其父元素中。

relative 

       元素框位移某個距離。元素仍保持其未定位前的形狀,它原本所佔的空間仍保留。

absolute 

       元素框從文檔流完全刪除,並相對於其包含塊定位。包含塊可能是文檔中的另一個元素或者是初始包含塊。元素原先在正常文檔流中所佔的空間會關閉,就好像元素原來不存在一樣。元素定位後產生一個塊級框,而不論原來它在正常流中產生何種類型的框。

fixed 

       元素框的表現類似於將 position 設定為 absolute,不過其包含塊是視窗本身。

提示:相對定位實際上被看作普通流定位模型的一部分,因為元素的位置相對於它在普通流中的位置

 

CSS 定位屬性

 

overflow 屬性

       這個屬性定義溢出元素內容區的內容會如何處理。如果值為 scroll,不論是否需要,使用者代理程式都會提供一種滾動機制。因此,有可能即使元素框中可以放下所有內容也會出現捲軸。

 

clip 屬性

       當一幅映像的尺寸大於包含它的元素時會發生什麼呢?"clip" 屬性允許您規定一個元素的可見尺寸,這樣此元素就會被修剪並顯示為這個形狀。

 

vertical-align 屬性

       該屬性定義行內元素的基準相對於該元素所在行的基準的垂直對齊。允許指定負長度值和百分比值。這會使元素降低而不是升高。在表儲存格中,這個屬性會設定儲存格框中的儲存格內容的對齊。

 

z-index 屬性

       該屬性設定一個定位元素沿 Z 軸的位置,Z 軸定義為垂直延伸到顯示區的軸。如果為正數,則離使用者更近,為負數則表示離使用者更遠。

       Z-index 僅能在定位元素上奏效(例如 position:absolute;)!

 

top bottom left right 屬性 (座標屬性,隨舉一例即可)

 

CSS 相對定位CSS 相對定位

       相對定位是一個非常容易掌握的概念。如果對一個元素進行相對定位,它將出現在它所在的位置上。然後,可以通過設定垂直或水平位置,讓這個元素“相對於”它的起點進行移動。

       如果將 top 設定為 20px,那麼框將在原位置頂部下面 20 像素的地方。如果 left 設定為 30 像素,那麼會在元素左邊建立 30 像素的空間,也就是將元素向右移動。

#box_relative {  position: relative;  left: 30px;  top: 20px;}

如所示:

在使用相對定位時,無論是否進行移動,元素仍然佔據原來的空間。因此,移動元素會導致它覆蓋其它框。

 

CSS 絕對位置

       設定為絕對位置的元素框從文檔流完全刪除,並相對於其包含塊定位,包含塊可能是文檔中的另一個元素或者是初始包含塊。元素原先在正常文檔流中所佔的空間會關閉,就好像該元素原來不存在一樣。元素定位後產生一個塊級框,而不論原來它在正常流中產生何種類型的框。

#box_relative {

    position: absolute;

    left: 30px;

    top: 20px;

}

       絕對位置的元素的位置相對於最近的已定位祖先元素,如果元素沒有已定位的祖先元素,那麼它的位置相對於最初的包含塊。

       因為絕對位置的框與文檔流無關,所以它們可以覆蓋頁面上的其它元素。可以通過設定 z-index 屬性來控制這些框的堆放次序。

 

CSS 浮動

       浮動的框可以向左或向右移動,直到它的外邊緣碰到包含框或另一個浮動框的邊框為止。由於浮動框不在文檔的普通流中,所以文檔的普通流中的塊框表現得就像浮動框不存在一樣。

請看,當把框 1 向右浮動時,它脫離文檔流並且向右移動,直到它的右邊緣碰到包含框的右邊緣:

 

再請看,當框 1 向左浮動時,它脫離文檔流並且向左移動,直到它的左邊緣碰到包含框的左邊緣。因為它不再處於文檔流中,所以它不佔據空間,實際上覆蓋住了框 2,使框 2 從視圖中消失。

如果把所有三個框都向左移動,那麼框 1 向左浮動直到碰到包含框,另外兩個框向左浮動直到碰到前一個浮動框。

 

如所示,如果包含框太窄,無法容納水平排列的三個浮動元素,那麼其它浮動塊向下移動,直到有足夠的空間。如果浮動元素的高度不同,那麼當它們向下移動時可能被其它浮動元素“卡住”:

 

float 屬性

       該屬性定義元素在哪個方向浮動。以往這個屬性總應用於映像,使文本圍繞在映像周圍,不過在 CSS 中,任何元素都可以浮動。浮動元素會產生一個塊級框,而不論它本身是何種元素。

 

行框和清理

浮動框旁邊的行框被縮短,從而給浮動框留出空間,行框圍繞浮動框。因此,建立浮動框可以使文本圍繞映像:

要想阻止行框圍繞浮動框,需要對該框應用 clear 屬性。clear 屬性的值可以是 left、right、both 或 none,它表示框的哪些邊不應該挨著浮動框。

為了實現這種效果,在被清理的元素的上外邊距上添加足夠的空間,使元素的頂邊緣垂直下降到浮動框下面:

clear 屬性

       該屬性定義了元素的哪邊上不允許出現浮動元素。在 CSS1 和 CSS2 中,這是通過自動為清除元素(即設定了 clear 屬性的元素)增加上外邊距實現的。在 CSS2.1 中,會在元素上外邊距之上增加清除空間,而外邊距本身並不改變。不論哪一種改變,最終結果都一樣,如果聲明為左邊或右邊清除,會使元素的上外邊框邊界剛好在該邊上浮動元素的下外邊距邊界之下。

 

       讓我們更詳細地看看浮動和清理。假設希望讓一個圖片浮動到文字區塊的左邊,並且希望這幅圖片和文本包含在另一個具有背景顏色和邊框的元素中。您可能編寫下面的代碼:

.news {

    background-color: gray;

    border: solid 1px black;

}

.news img {

    float: left;

}

.news p {

    float: right;

}

<div class="news">

    <img src="news-pic.jpg" />

    <p>some text</p>

</div>

這種情況下,出現了一個問題。因為浮動元素脫離了文檔流,所以包圍圖片和文本的 div 不佔據空間。

如何讓包圍元素在視覺上包圍浮動元素呢?需要在這個元素中的某個地方應用 clear:

不幸的是出現了一個新的問題,由於沒有現有的元素可以應用清理,所以我們只能添加一個空元素並且清理它。

這樣可以實現我們希望的效果,但是需要添加多餘的代碼。常常有元素可以應用 clear,但是有時候不得不為了進行布局而添加無意義的標記。

不過我們還有另一種辦法,那就是對容器 div 進行浮動:

       這樣會得到我們希望的效果。不幸的是,下一個元素會受到這個浮動元素的影響。為瞭解決這個問題,有些人選擇對布局中的所有東西進行浮動,然後使用適當的有意義的元素(常常是網站的頁尾)對這些浮動進行清理。這有助於減少或消除不必要的標記。

       事實上,W3School 網站上的所有頁面都採用了這種技術,如果您開啟我們使用 CSS 檔案,您會看到我們對頁尾的 div 進行了清理,而頁尾上面的三個 div 都向左浮動。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.