CSS定位屬性詳解

Ruheng發表於2019-03-03

最近學習CSS相關知識,定位是其中的一個難點。不瞭解其中細節,有時候在使用的時候會弄得一團糟。本篇文章整理下關於定位屬性的具體理解與應用。

一、簡介

1.文件流

在介紹postion之前,有必要先了解下文件流。

簡單說就是元素按照其在 HTML 中的位置順序決定排布的過程。HTML的佈局機制就是用文件流模型的,即塊元素(block)獨佔一行,內聯元素(inline),不獨佔一行。

一般使用margin是用來隔開元素與元素的間距;padding是用來隔開元素與內容的間隔。margin用於佈局分開元素使元素與元素互不相干;padding用於元素與內容之間的間隔,讓內容(文字)與(包裹)元素之間有一段“距離”。

只要不是float和絕對定位方式佈局的,都在文件流裡面。

表現如下:

    <div style="border:1px solid black">div1</div>
    <div style="border:1px solid red">div2</div>
    這是一張圖片
    <img src="test.png">複製程式碼

2.position屬性介紹

  • static,預設值。位置設定為static的元素,它始終會處於文件流給予的位置。
  • inherit,規定應該從父元素繼承 position 屬性的值。但是任何的版本的 Internet Explorer (包括 IE8)都不支援屬性值 “inherit”。
  • fixed,生成絕對定位的元素。預設情況下,可定位於相對於瀏覽器視窗的指定座標。元素的位置通過 “left”, “top”, “right” 以及 “bottom” 屬性進行規定。不論視窗滾動與否,元素都會留在那個位置。但當祖先元素具有transform屬性且不為none時,就會相對於祖先元素指定座標,而不是瀏覽器視窗。
  • absolute,生成絕對定位的元素,相對於距該元素最近的已定位的祖先元素進行定位。此元素的位置可通過 “left”、”top”、”right” 以及 “bottom” 屬性來規定。
  • relative,生成相對定位的元素,相對於該元素在文件中的初始位置進行定位。通過 “left”、”top”、”right” 以及 “bottom” 屬性來設定此元素相對於自身位置的偏移。

不管是哪種定位,都必須有一個參照物。找對了參照物,就成功了一半。

二、相對定位

relative生成相對定位的元素,相對於其正常位置進行定位。

相對定位完成的過程如下:

  • 按預設方式(static)生成一個元素(並且元素像層一樣浮動了起來)。
  • 相對於以前的位置移動,移動的方向和幅度由 left、right、top、bottom 屬性確定,偏移前的位置保留不動。

例項

<style type="text/css">
        #box1 {
            margin: 20px;
            width: 200px;
            height: 200px;
            background-color: yellow;
        }
        #box2 {
            margin: 20px;
            width: 200px;
            height: 200px;
            background-color: red;
            /*position: relative;
            left: 100px;
            top: 100px;*/
        }
    </style>

    <div id="box1"></div>
    <div id="box2"></div>複製程式碼

其中box2中的註釋程式碼未生效前,是按照文件流進行排序呈現。

但是,當註釋程式碼取消註釋生效後,就會相對文件流中應當呈現的位置進行移動。

所以,相對定位的參照物是它本身。

三、絕對定位

絕對定位與相對定位的一大不同之處就是,當我們把一個元素設定成絕對定位,那麼這個元素將會脫離文件流,其他元素就會認為這個元素不存在於文件流中而填充它原來的位置。絕對定位元素根據它的參照物移動自己的位置,而參照物則需要根據它祖先元素的定位設定來確定。

所謂根據它祖先元素的定位設定來確定簡單理解為:相對於該元素最近的已定位的祖先元素,如果沒有一個祖先元素設定定位,那麼參照物是body層。

例項

以上面的圖形來展示絕對定位的特性。可以看出最裡層是兩個盒子,外面巢狀了兩層祖先元素。

1.祖先元素沒定位

在祖先元素沒定位的情況下,使用absolute。

#box1 {
            width: 150px;
            height: 150px;
            margin-left: 20px;
            margin-bottom: 20px;
            background-color: yellow;
            position: absolute;
            top: 30px;
            left: 30px;
        }複製程式碼

在這種情況下,參考物就是body。

2.祖先元素有定位

祖先元素只要設定了值不為position:static之外的值,都視為有定位,並且最近的祖先元素會被設定為絕對定位元素的參照物。

#orange {
            width: 400px;
            height: 400px;
            background-color: orange;
            position: absolute;


        }
        #box1 {
            width: 150px;
            height: 150px;
            margin-left: 20px;
            margin-bottom: 20px;
            background-color: yellow;
            position: absolute;
            top: 30px;
            left: 220px;
        }複製程式碼

在這種情況下,參考物就是最近的祖先元素。

除了上述兩種情況外,在使用者沒給absolute元素設定left/right、top/bottom的情況下,所對應的參考物會有變化。

3.未設定left/right、top/bottom

在沒設定left/right、top/bottom的情況下,absolute元素的位置就是該元素在文件流裡的位置

#box1 {
            width: 150px;
            height: 150px;
            margin-left: 20px;
            margin-bottom: 20px;
            background-color: yellow;
            position: absolute;
        }複製程式碼

上圖可以看出兩個盒子重疊了,這是因為:absolute元素由於沒有設定left/right、top/bottom就按照其應該在文件流中出現的位置進行定位,而absolute元素脫離文件流,紅色的盒子元素並不知道absolute元素的存在,就繼續放置在該位置,並且absolute元素會覆蓋正常文件流中的元素。

四、總結

主要介紹了相對定位和絕對定位,其他定位方式比較簡單,試一試就知道了。另外,相對定位和絕對定位的應用也比較靈活,適用於多種場景。

相關文章