HTML和CSS——定位詳解

當在這一個頁面上實現(xiàn)布局和定位有幾種不同的技術。使用哪種技術,很大程序上取決于內(nèi)容和目標頁面,因為有很多技術比別人的更牛。
例如,浮動可以讓頁面元素并排顯示,而且還可以制作一個干凈的布局。然而,有時候需要一些嚴格的定位,這時需要使用其他的技術,包括“relative”和“absolute”定位。
在這節(jié)課中,我們先來介紹一下浮動的使用,接下來詳細介紹定位的技巧,包括如何準確的給元素在X軸、Y軸和Z軸定位。

  • 包含浮動
  • 定位屬性
  • z-index屬性

包含浮動

創(chuàng)建一全頁面的布局時,浮動是一種常用的方法,也是頁面元素定位的一種基本功能。浮動可以讓元素一個挨著一個。浮動可以創(chuàng)建一個自然流布局,同時充許元素設置自身尺寸和其父元素容器的尺寸大小。

當元素浮動時,一個元素的位置依賴于放置在他周邊的其他元素。那么圍繞在他周邊的是哪個元素呢?這個元素會換行嗎?這一切都取決于圍繞于他的元素的DOM(文檔對象模型)。

DOM是什么?
DOM是Document Object Model的簡稱,被譯為文檔對象模型。是HTML或者XML文檔結構的API。在我們的例子中,我們說的是HTML的文檔,因此DOM就是代表所有元素以及這些元素之間的關系。
可以考慮樹形的表現(xiàn)方式,展元素元素之間的關系。元素嵌套時他們存在父子關系,相同級別的還存在兄弟關系。

雖然浮動相當?shù)慕o力,但他們自己還是存在一定的問題。最典型的問題就是一個父元素包含了多個浮動的子元素。頁面的內(nèi)容設置了一個寬度,子元素的浮動確定了他們的位置,但浮動元素不會影響父元素的寬度。這樣做會讓父元素塌陷,從而使父元素的高度為“0”,以及忽略其他的屬性。很多時候,這種現(xiàn)像都被忽略,特別是在父元素沒有任何樣式,以及其子元素看起來都正確的對齊。

嵌套的元素不會正確的排列,也會有錯誤的樣式出現(xiàn)。來看看下面的演示,在“.box-set”的div應該有一個高亮的灰色背景,因為所有的子元素浮動后,這個灰色的背景色并不看到。仔細檢查后,“.box-set”的高度變成了“0”。

HTML
<code><div class="box-set">
<div class="box">Box 1</div>
<div class="box">Box 2</div>
<div class="box">Box 3</div>
</div> </code>

CSS
<code>.box-set {
background: #e8eae9;
}
.box {
background: #8ec63f;
height: 100px;
float: left;
margin: 10px;
width: 200px;
} </code>

DEMO效果

包含浮動

有一種方法,在容器的結束標簽前添加一個空標簽,在空標簽上直接設置樣式“clear:both”。用這種方法來清除浮動,在大多數(shù)情況下是有效的,但這不太適合語義化。這取決于一個頁面有多少浮動需要清除,這樣造成頁面上的空標簽迅速堆積,而且在頁面中沒有上下文內(nèi)容。

幸運的是有幾種不同方法可以用來清除浮動,而其中用得最多的是“overflow”技巧和"clearfix"技巧。

Overflow技巧
一種清除浮動的技巧是使用“overflow”屬性。在具有浮動元素的父容器中設置“overflow”的屬性值為“auto”,這樣父容器就會有一個高度存在,在我們例子中的灰色背景也就能看得到了。

在IE6里面,父容器是需要設置一個“width”和“height”。因為高度可能是一個變量,寬度為100%,他們將能正常的工作。使用“overflow:auto;”,在IE瀏覽器中會給元素添加滾動條,這樣一來,最好是直接使用“overflow:hidden;”來清除浮動。

<code>.box-set { background: #404853; overflow: auto;} </code>

清除浮動后效果

包含浮動

使用“overflow”技巧清除浮動,確實存在一些缺點。例如:當你添加樣式,或者將嵌套在里面的“span”元素移動到父容器的外面,或者你想給元素添加一個盒子陰影和制作一個下拉菜單。在下面的演示例子中,你可以看到元素的盒子陰影被切斷在父元素之內(nèi)。

不同的瀏覽器對“overflow”屬性解析不一樣,在瀏覽器的顯示風格也不一樣。看看下面的例子,注意列在不同瀏覽器的顯示效果。

包含浮動

clearfix技巧
根據(jù)上下文,清除浮動更好的方法是clearfix技巧。“clearfix”清除浮動的技術是有點復雜,但有有比使用“overflow”技巧清除浮動更好的方法?

“clearfix”技巧是基于在父元素上使用“:before”和“:after”兩個偽類。使用這些偽類,我們可以在浮動元素的父容器前面和后面創(chuàng)建隱藏元素。“:before”偽類是用來防止子元素頂部的外邊距塌陷,使用“display: table”創(chuàng)建一個匿名的“table-cell”元素。這也確保在IE6和IE7下具有一致性。“:after”偽類是用來防止子元素的底部的外邊距塌陷,以及用來清除元素的浮動。

在IE6和7的瀏覽器中,加上“*zoom”屬性來觸發(fā)父元素的hasLayout的機制。決定了元素怎樣渲染內(nèi)容,以及元素與元素之間的相互影響。

采取上面同樣的例子,你可以看到容器也清除了浮動,元素也可以移到父容器外面:
<code>.box-set:before,.box-set:after {
content: "";
display: table;
}
.box-set:after {
clear: both;
}
.box-set {
*zoom: 1;
} </code>

清除浮動后效果

包含浮動

有效的包含浮動
使用哪種技巧來清除浮動,終究要看你自己喜好。有些人堅持使用“clearfix”來清除浮動,因為這種方法可以貫穿整個項目。有些人認為“clearfix”技巧使用的代碼太多,他還是喜歡簡單點的。至于使用什么技巧由您來決定,只要在運用了浮動的元素的父容器需要清除浮動。

一個常見的方法是將定義一個類名,把這個類名加到需要清除浮動的容器上。例如使用“clearfix”清除浮動,Dan Cederholm為容器設置了一個類名“group”。在需要清除浮動的容器上添加這個類名“group”。
<code>.group:before,
.group:after {
content: "";
display: table;
}
.group:after {
clear: both;
}
.group {
*zoom: 1;
}</code>

單個偽類
值得注意的是,目前每個元素只有一個“:before”和“:after”偽類。當你嘗試使用其他的“:before”和“:after”的clearfix技巧,你的內(nèi)容可能無法達到想要的效果。

在上面的例子中,clearfix的樣式不應該直接插入到“.box-set”類中,應該是給需要清除浮動的元素中添加類名“group”。

定位屬性
很多情況下,你需要控制更多元素的位置,而且超過了浮動所能提供的范圍,這個時候我們就需要發(fā)揮“position”屬性的作用。“position”屬性提供五個不同的屬性值,每種不同的方式可以給元素提供不同的位置。

Position static
元素都有position屬性,其默認值是“static”,這也意味著,他們沒有也不接受位置屬性設置(top、right、bottom、left屬性值設置)。另外元素設置了position屬性,將會覆蓋元素的默認值“static”。

在下面的演示中,所有的盒子都是靜態(tài)的,每個盒子都在相鄰盒子頂部,因為他們都是塊元素,而且沒有進行浮動設置。

HTML
<code><div class="box-set">
<div class="box">Box 1</div>
<div class="box">Box 2</div>
<div class="box">Box 3</div>
</div> </code>

CSS
<code>.box-set {
background: #e8eae9;
}
.box {
background: #8ec63f;
height: 80px;
width: 80px;
}</code>

效果

包含浮動

Position relative
“relative”是“position”的另一個屬性值,他和“static”屬性值非常的相似。主要的區(qū)別是“relative”可以給元素設置位移(offset)“top、right、bottom和left”屬性。通過這些位移屬性設置可以給元素進行精確的定位。

盒子位移屬性是如何工作?
盒子的位移屬性有四個“top、right、bottom和left”,用來指定元素的定位位置和方向。這些屬性只能在元素的“position”屬性設置了“relative、absolute和fixed”屬性值,才生效。
對于相對定位元素,這些屬性的設置讓元素從默認位置移動。例如,top設置一個值“20px”在一個相對定位的元素上,這個元素會在原來位置向下移動“20px”。反之,“top”設置一個“-20px”,這個元素會在原來的位置向上移動“20px”。
對于絕對定位和固定定位鮮紅,這些屬性指定了元素與父元素邊緣之間的距離,例如,絕對定位的元素設置一個“top”值為“20px”,將使絕對定位元素相對于其設置了相對定位的祖先元素頂部邊緣向下移動“20px”,反之,如果設置一個“top”值為“-20px”,將使絕對定位元素相對于其設置了相對定位的祖先元素頂部邊緣向上移動“20px”。(絕對定位的參考點是其祖先元素設置了“relative”或者“absolute”值)。

設置了位移屬性的相對定位元素,他在頁面中仍然是正常的、靜態(tài)的,仍屬于自然流。在這種情況下,其他元素不會占用相對定們元素當初的位置。此外,其他元素沒有進行位置移動時,相對定位元素可能會和其他元素重疊。

在下面的演示中,每個元素還是在另一個元素頂部,然后他們根據(jù)自己移位屬性,從默認位置進行移動,由于他們移向方向不一樣,這些值使元素重疊在一起。當元素設置了相對定時,周邊的元素也能看到相對定位元素的默認位置。(也就是說,相對定位元素的默認位置還是被元素自身占用,別的元素是無法占用的。也就是說相對定位元素的位移是相對于元素自身的邊緣進行位移)。

HTML
<code><div class="box-set">
<div class="box">Box 1</div>
<div class="box">Box 2</div>
<div class="box">Box 3</div>
</div></code>

CSS
<code>.box-set {
background: #e8eae9;
}
.box {
background: #8ec63f;
height: 80px;
position: relative;
width: 80px;
}
.box-1 {
top: 20px;
}
.box-2 {
left: 40px;
}
.box-3 {
bottom: -10px;
right: 20px;
}</code>

效果:

相對定位

事實上,一個相對定位元素同時設置了“top”和“bottom”位移屬性值,實際上“top”優(yōu)先級高于“bottom”。然而,一個相對定位元素同時設置了“l(fā)eft”和“right”位移屬性,他們的優(yōu)先級取決于頁面使用的是哪種語言,例如,如果你的頁面是英文頁面,那么“l(fā)eft”位移屬性優(yōu)先級高,如果你的頁面是阿拉伯語,那么“right”的位移屬性優(yōu)先級高。

Position absolute
絕對定位元素也具有盒子位移屬性,然而,絕對定位元素會脫離文檔流。絕對定位元素直接從文檔流中移出,絕對定位元素的位置直接和父容器是否設置了相對定位(絕對定位)有直接關系。絕對定位元素需要至少一個祖先元素設置了相對定位(絕對定位),不然元素定位會相對于頁面的主體進行定位。

使用絕對定位的元素可以指定垂直和水平的位移屬性,使絕對定位元素相對于設置了相對定位的祖先元素邊緣進行移位。例如,一個絕對定位的元素設置了“top”值為“50px”和一個“right”值為“100px”,絕對定位元素會相對于其設置了相對定位的父元素的頂邊向下移動50px;向左移動100px。

然而,使用了絕對定位的元素并沒有進行任何盒子位移屬性設置,那么絕對定位元素的頂部和左部會和設置了相對定位的父元素的頂邊和左邊重合。如果設置了一個盒子位移屬性,比如說“top”,那么絕對定位元素垂直方向會進行移動,而水平位置默認還是左邊對齊。
在下面的演示中,你可以看到所有的盒子都相對于div的父元素進行絕對定位,每個元素都從特定的面使用定位值進行移動,而且使用了負值的,元素移動到盒子的外面。

HTML
<code><div class="box-set">
<div class="box">Box 1</div>
<div class="box">Box 2</div>
<div class="box">Box 3</div>
</div></code>

CSS
<code>.box-set {
background: #e8eae9;
height: 200px;
position: relative;
}
.box {
background: #8ec63f;
height: 80px;
position: absolute;
width: 80px;
}
.box-1 {
top: 6%;
left: 2%;
}
.box-2 {
top: 0;
right: -40px;
}
.box-3 {
bottom: -10px;
right: 20px;
}
.box-4 {
bottom: 0;
}</code>

效果

絕對定位

當一個絕對定位的元素有固定的高度和寬度,并且盒子位移同時設置了“top”和“bottom”時,“top”更具優(yōu)先組,另外和相對定位元素一樣,當同時設置了“l(fā)eft”和“right”時,優(yōu)先級取決于他的頁面使用的語言。

當一個絕對定位的元素沒有明確指定高度和寬度,同時使用盒子位移的“top”和“bottom”屬性時,會使整個元素的高度跨越整個容器。同樣的,當這個元素同時使用位移“l(fā)eft”和“right”屬性值,會使整個元素的寬度跨越整個容器。如果同時使用位移四個屬性,可以指定一個寬度和高度顯示元素。(這個時候絕對定位元素的寬度和高度都是100%。)

Position fixed
固定定位和絕對定位很類似,但是他定位是相對于瀏覽器窗口,并且不會隨滾動條進行滾動。也就是說,不管用戶停留在頁面那個地方,固定定位的元素將始終停留在頁面的一個地方。“position”屬性值中,僅有“fixed”屬性值不能在IE6瀏覽器下運行,如果你想在IE6正常使用固定定位,那么你就需要為他寫一些Hacks。
固定定位元素的盒子位移屬性的使用和絕對定位的一樣。
保持前面盒子移位,可以看到盒子固定定位是相對于瀏覽器窗口而不是設置了相對定位的父元素。

HTML
<code><div class="box-set">
<div class="box">Box 1</div>
<div class="box">Box 2</div>
<div class="box">Box 3</div>
</div></code>

CSS
<code>.box {
background: #8ec63f;
height: 80px;
position: fixed;
width: 80px;
}
.box-1 {
top: 6%;
left: 2%;
}
.box-2 {
top: 0;
right: -40px;
}
.box-3 {
bottom: -10px;
right: 20px;
}
.box-4 {
bottom: 0;
}</code>

效果

絕對定位

固定頁頭和頁腳
固定定位最常見的一種用途就是在頁面中創(chuàng)建一個固定頭部、或者腳部、或者固定頁面的一個側面。就算是用戶移動瀏覽器的滾動條,還是固定在頁現(xiàn)與用戶交流。
下面的示例代碼能實現(xiàn)。注意如何設置“l(fā)eft”和“right”兩個盒子位移,這使得“頁腳”跨越了頁面的整個寬度,而不需使用margin、border和padding來破壞盒模形就做了收縮自如。

HTML
<code>< footer >Fixed Footer </footer></code>

CSS
<code>footer {
bottom: 0;
left: 0;
position: fixed;
right: 0;
}</code>

固定定位

z-index屬性
通常都認為Web頁面是二維頁面,顯示的元素都在X軸和Y軸上。當你的元素有定位時,他們有時候會放置在另一個元素的頂部。要改變這些元素是一個 怎么樣的層疊順序,要知道z軸,z軸是用“z-index”屬性來控制的。

一般來說,在DOM中,元素出現(xiàn)的時候就放置在z軸上。在Dom中,元素在頂部的要低于底部的。改變這種層疊順序可以直接使用“z-index”來控制。元素的“z-index”值越高將會出現(xiàn)在越上面,不管元素在Dom哪個位置上。

給元素設置“z-index”屬性,首先要在這個元素上設置了“position”屬性值為“relatvie”、“absolute”或者“fixed”之一。同樣的,你要使用盒子位移屬性,你也要先確認元素設置了“positions”屬性值為“relative”、“absolute”或者“fixed”之一。
在下面的登例子中,如果每個盒子都不設置“z-index”,那么第一個box在第二個下面,第二個在第三個下面,第三個在第四個下面。如果在盒子中指定“z-index”的值,第二個盒子在第一個和第三個上面,第三個盒子在第四個上面。

HTML
<code><div class="box-set">
<div class="box">Box 1</div>
<div class="box">Box 2</div>
<div class="box">Box 3</div>
</div></code>

CSS
<code>.box-set {
background: #e8eae9;
height: 160px;
position: relative;
}
.box {
background: #8ec63f;
border: 3px solid #f7941d;
position: absolute;
}
.box-1 {
left: 10px;
top: 10px;
}
.box-2 {
bottom: 10px;
left: 70px;
z-index: 3;
}
.box-3 {
left: 130px;
top: 10px;
z-index: 2;
}
.box-4 {
bottom: 10px;
left: 190px;
z-index: 1;
}</code>

不設置z-index效果

固定定位

設置z-index效果
固定定位

本文由大漠根據(jù)Shay Howe的《An Adavnced Guide to HTML & CSS》第二課《Detailed Positioning》所譯,整個譯文帶有我們自己的理解與思想,如果譯得不好或不對之處還請同行朋友指點。如需轉載此譯文,需注明英文出處:http://learn.shayhowe.com/advanced-html-css/detailed-css-positioning,以及作者相關信息
作者:Shay Howe
譯者:大漠

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,794評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,750評論 2 370

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,774評論 1 92
  • 1.CSS基本概念 1.1 CSS的定義 CSS(Cascading Style Sheets)層疊樣式表,主要用...
    寥寥十一閱讀 1,857評論 0 6
  • 一,浮動元素有什么特征?對父容器、其他浮動元素、普通元素、文字分別有什么影響? 浮動模型是一種可視化格式模型,浮動...
    DeeJay_Y閱讀 888評論 0 4
  • 穿著大襠褲,裝一回胖了的阿凡提,或者騎著鳥,裝一回漂了白的阿凡達。就騎著驢,看著風景,救或不救落水老太太,...
    馬冬梅的向日葵閱讀 311評論 0 0
  • 昨天臨睡前,看到一位90后下屬在QQ上發(fā)來的信息,她要這個月的二十號之前辦好離職手續(xù),問我要離職申請表。 ...
    上孟默蒹閱讀 326評論 0 1