CSS定位(Positioning)
CSS 定位和浮動
CSS 為定位和浮動提供了一些屬性,利用這些屬性,可以建立列式佈局,將佈局的一部分與另一部分重疊,還可以完成多年來通常需要使用多個表格才能完成的任務。
一切皆為框
div、h1 或 p 元素常常被稱為塊級元素。這意味著這些元素顯示為一塊內容,即“塊框”。與之相反,span 和 strong 等元素稱為行內元素,這是因為它們的內容顯示在行中,即“行內框”。
可以使用 display屬性改變生成的框的型別。這意味著,通過將 display 屬性設定為 block,可以讓行內元素(比如 <a> 元素)表現得像塊級元素一樣。還可以通過把 display 設定為 none,讓生成的元素根本沒有框。這樣的話,該框及
其所有內容就不再顯示,不佔用檔案中的空間。簡單點來說就是讓這個元素消失,不再顯示在html中。
但是在一種情況下,即使沒有進行顯式定義,也會建立塊級元素。這種情況發生在把一些文字新增到一個塊級元素(比如 div)的開頭。即使沒有把這些文字定義為段落,它也會被當作段落對待:
<div>
some text
<p>Some more text.</p>
</div>
在這種情況下,這個框稱為無名塊框,因為它不與專門定義的元素相關聯。
塊級元素的文字行也會發生類似的情況。假設有一個包含三行文字的段落。每行文字形成一個無名框。無法直接對無名塊或行框應用樣式,因為沒有可以應用樣式的地方(注意,行框和行內框是兩個概念)。但是,這有助於理解在螢幕上看到的所有東西都形成某種框。
CSS定位機制
CSS有三種基本的定位機制:普通流、浮動和絕對定位。
除非專門指定,否則所有框都在普通流中定位。也就是說,普通流中的元素的位置由元素在(X)HTML中的位置決定。
塊級框從上到下一個接一個地排列,框之間的垂直距離是由框的垂直外邊距計算出來的。
行內框在一行中水平佈置。可以使用水平內邊距、邊框和外邊距調整它們的間距。但是,垂直內邊距、外框和外邊距不影響行內框的高度。由一行形成的水平框稱為行框(Line Box),行框的高度總是足以容納它所包含的所有行內框。不過,設定行高可以增加這個框的高度。
CSS Position 屬性
通過使用 position 屬性,我們可以選擇 4 種不同型別的定位,這會影響元素框生成的方式。
position 屬性值的含義:
- static
- 元素框正常生成。塊級元素生成一個矩形框,作為檔案流的一部分,行內元素則會建立一個或多個行框,置於其父元素中。
- relative
- 元素框偏移某個距離。元素仍保持其未定位前的形狀,它原本所佔的空間仍保留。
- absolute
- 元素框從檔案流完全刪除,並相對於其包含塊定位。包含塊可能是檔案中的另一個元素或者是初始包含塊。元素原先在正常檔案流中所佔的空間會關閉,就好像元素原來不存在一樣。元素定位後生成一個塊級框,而不論原來它在正常流中生成何種型別的框。
- fixed
- 元素框的表現類似於將 position 設定為 absolute,不過其包含塊是視窗本身。
提示:相對定位實際上被看作普通流定位模型的一部分,因為元素的位置相對於它在普通流中的位置。
CSS 相對定位
相對定位是一個非常容易掌握的概念。如果對一個元素進行相對定位,它將出現在它所在的位置上。然後,可以通過設定垂直或水平位置,讓這個元素“相對於”它的起點進行移動。
如果將 top 設定為 20px,那麼框將在原位置頂部下面 20 畫素的地方。如果 left 設定為 30 畫素,那麼會在元素左邊建立 30 畫素的空間,也就是將元素向右移動。
#box_relative {
position: relative;
left: 30px;
top: 20px;
}
如下圖所示:
注意,在使用相對定位時,無論是否進行移動,元素仍然佔據原來的空間。因此,移動元素會導致它覆蓋其它框。
CSS 絕對定位
絕對定位使元素的位置與檔案流無關,因此不佔據空間。這一點與相對定位不同,相對定位實際上被看作普通流定位模型的一部分,因為元素的位置相對於它在普通流中的位置。
普通流中其它元素的佈局就像絕對定位的元素不存在一樣:
#box_relative {
position: absolute;
left: 30px;
top: 20px;
}
如下圖所示:
絕對定位的元素的位置相對於最近的已定位祖先元素,如果元素沒有已定位的祖先元素,那麼它的位置相對於最初的包含塊。
對於定位的主要問題是要記住每種定位的意義。所以,現在讓我們複習一下學過的知識吧:相對定位是“相對於”元素在檔案中的初始位置,而絕對定位是“相對於”最近的已定位祖先元素,如果不存在已定位的祖先元素,那麼“相對於”最初的包含塊。
註釋:根據使用者代理的不同,最初的包含塊可能是畫布或 HTML 元素。
提示:因為絕對定位的框與檔案流無關,所以它們可以覆蓋頁面上的其它元素。可以通過設定 z-index 屬性來控制這些框的堆放次序。
參考地址:https://www.w3school.com.cn/css/css_positioning.asp