HTML之position:absolute relative static fixed的區別和理解
HTML之position:absolute relative static fixed的區別
在理解position:absolute relative static fixed的區別時,我們先需要清楚什麼是文件流。
一、文件流:將窗體自上而下分成一行一行,並在每行中按從左至右的挨次排放元素,即為文件流。
每個非浮動塊級元素都獨有一行, 浮動元素則按規則浮在行的一端. 若當時行容不下,
則另起新行再浮動。內聯元素也不會獨有一行. 一切元素(包括塊級,內聯和列表元素)均可生成子行, 用於擺放子元素。有三種狀況將使得元素離開文件流而存在,分別是浮動、絕對定位、固定定位.
然則在IE中浮動元素也存在於文件流中,浮動元素不佔任何正常文件流空間,而浮動元素的定位照樣基於正常的文件流,然後從文件流中抽出並盡能夠遠的挪動至左側或許右側。當一個元素脫離正常文件流後,依然在文件流中的其他元素將忽略該元素並填補其原先的空間。
基於文件流,理解以下的定位形式:
相對定位:元素框偏移某個距離。元素仍保持其未定位前的形狀,它原本所佔的空間仍保留。
絕對定位:即完全離開文件流, 相關於position屬性非static值的比來父級元素進行偏移。
固定定位:即完全離開文件流,相關於視區進行偏移。
文件流是文件中可顯示物件在排列時所佔用的位置。比如網頁的div標籤它預設佔用的寬度位置是一整行,p標籤預設佔用寬度也是一整行,因為div標籤和p標籤是塊狀物件。
網頁中大部分物件預設是佔用文件流,也有一些物件是不佔文件流的,比如表單中隱藏域。當然我們也可以讓佔用文件流的元素轉換成不佔文件流,這就要用到CSS中屬性position來控制。
二、CSS
2.0對position的定義:檢索物件的定位方式。共有4種取值。
absolute:絕對定位。將物件從文件流中拖出,使用left,right,top,bottom等屬性相對於其最接近的一個最有定位設定的父物件進行絕對定位。如果不存在這樣的父物件,則依據body物件。而其層疊通過z-index屬性定義
。當物件定位在瀏覽器視窗以外,瀏覽器因此顯示滾動條。
fixed:固定定位。物件定位遵從絕對(absolute)方式。但是要遵守一些規範。當物件定位在瀏覽器視窗以外,瀏覽器不會因此顯示滾動條,而當滾動條滾動時,物件始終固定在原來位置。
relative:相對定位。物件不可層疊,但將依據left,right,top,bottom等屬性在正常文件流中偏移位置。當物件定位在瀏覽器視窗以外,瀏覽器因此顯示滾動條。
static:元素框正常生成。塊級元素生成一個矩形框,作為文件流的一部分,行內元素則會建立一個或多個行框,置於其父元素中。
inherit:繼承值,物件將繼承其父物件相應的值。
所有的塊元素在html文件中是按照它們出現在文件中的先後順序排列的(當然,巢狀不在此列),每一個塊都會另起一行。如下圖
他們對應的html如下:
<html>
<head>
<title>DIV+CSS</title>
<style>
#div1 {
border: 1px solid #000099;
height: 60px;
width: 200px;
margin:2px;
}
#div2 {
border: 1px solid #000099;
height: 60px;
width: 200px;
margin:2px;
}
#div3 {
border: 1px solid #000099;
height: 60px;
width: 200px;
margin:2px;
}
</style>
</head>
<body>
<div id="div1">div1</div>
<div id="div2">div2</div>
<div id="div3">div3</div>
</body>
</html>
三、CSS中的相對定位和絕對定位模型
在文件流中,每個塊元素都會被安排到流中的一個位置,我們可以通過CSS中的定位屬性來重新安排它的位置。定位分為相對定位和絕對定位, 相對定位是相對於該塊元素在文件流中的位置的,比如,我們可以使用相對定位把div2放到div1的右側,CSS程式碼如下:
#div1 {
border: 1px solid #000099;
height: 60px;
width: 200px;
margin:2px;
}
#div2 {
border: 1px solid #000099;
height: 60px;
width: 200px;
margin:2px;
position: relative;
top: -64px;
left: 204px;
}
#div3 {
border: 1px solid #000099;
height: 60px;
width: 200px;
margin:2px;
}
下面是效果:可以看到一個有趣的現象,那就是雖然我們把div2移走了,但是div1和div3中間還是有一個空間,說明相對定位的元素是會佔據文件流空間的,這裡的div2就是典型的“站著茅坑不拉屎”。
使用絕對定位也是可以把div2擺到div1的右邊的,而且絕對定位是不會佔據文件流空間的,如下圖,div1和div3之間沒有空白:
div2的CSS程式碼:
#div2 {
border: 1px solid #000099;
height: 60px;
width: 200px;
margin:2px;
position: absolute;
top: 15px;
left: 214px;
}
絕對定位是個好東西,可以把內容顯示到頁面上的任何位置,但是對於我們程式設計師來說,卻不能使用太多的絕對定位,因為使用程式動態向div中新增內容,div的大小是不可知的,無法將每一個div的位置都定死。
四、CSS中的浮動和清除模型
在CSS中,最讓人不好理解的應該算是float和clear意義了。float可以達到這樣一個效果,就是本來應該一行一個的塊元素,如果定義了float屬性,則只要行的空間足夠,它會跑別的float元素的屁股後面,而不再會單獨佔用一行,如下圖:
這裡把div2和div3都定義了為浮動,程式碼如下:
#div2 {
border: 1px solid #000099;
height: 60px;
width: 200px;
margin:2px;
float:left;
}
#div3 {
border: 1px solid #000099;
height: 60px;
width: 200px;
margin:2px;
float:left;
}
那什麼情況下需要clear呢?這是因為float的元素和絕對定位的元素一樣,也是不佔用文件空間的,因此,如果我們把div2和div3都巢狀在div1中,並且把div2和div3都定義為浮動,那麼由於它們不佔用文件空間,設定為浮動後div2和div3都不屬於div1的內容了,所以作為父元素的div1沒有內容填充,不知道自動擴充套件大小,以至於顯示出來div2和div3會跑到div1的外面,如下圖下面是它們的html程式碼:
<div id="div1">div1
<div id="div2">div2</div>
<div id="div3">div3</div>
</div>
下面是它們的css程式碼: #div1 {
border: 1px solid #000099;
height: 60px;
width: 450px;
margin:2px;
}
#div2 {
border: 1px solid #000099;
height: 60px;
width: 200px;
margin:2px;
float:left;
}
#div3 {
border: 1px solid #000099;
height: 60px;
width: 200px;
margin:2px;
float:left;
}
因為float的元素不佔用文件流空間,有時候元素還會重疊到float元素上,這裡我就不舉例了。
為了解決上面的問題,就需要在float之後的元素上面使用clear,在此例中,我們在div3後面加入一個空段落,並設定其為clear,如下:
<div id="div1">div1
<div id="div2">div2</div>
<div id="div3">div3</div>
<p class="clear"></p>
</div>
clear 屬性定義了元素的哪邊上不允許出現浮動元素。下面是新增加的空段落的CSS程式碼:
.clear{
clear:left;
}
這時div1有了p這塊內容(儘管p裡面是空的),並且clear:為left, 使得p的上外邊框邊界剛好在其上浮動元素的下外邊距邊界之下
效果圖;
相關文章
- CSS中position屬性( absolute | relative | static | fixed )詳解CSS
- CSS position fixed和absolute區別CSS
- 動態HTML解釋:static absolute relative fixedHTML
- CSS - 定位屬性position使用詳解(static、relative、fixed、absolute)CSS
- position absolute與fixed 區別
- 前端~定位屬性position(relative、absolute、fixed)的分析前端
- CSS position:sticky與position:fixed 區別CSS
- css定位中position:absolute與float的區別CSS
- Fixed with absolute
- CSS之float vs position:absoluteCSS
- css的position:absoluteCSS
- SciTech-BigDataAIML-LLM-PE(Positional Encoding)位置編碼: Absolute(絕對)Position + Relative(相對)Position + Rotate(旋轉)PositionAIEncoding
- static 和extern的區別
- 不受控制的 position:fixed
- CSS position定位(fixed、sticky)CSS
- 不受控制的 position-fixed
- self::class和static::class的區別
- const、define 和 static 的區別
- CSS position:absolute 絕對定位CSS
- CSS position: absolute 絕對定位CSS
- CSS position:relative 相對定位CSS
- CSS position: relative 相對定位CSS
- CSS 屬性篇(一):relative與absoluteCSS
- position:fixed顯示錯位
- CSS position:fixed 固定定位CSS
- CSS position: fixed 固定定位CSS
- PHP new self()和new static()的區別PHP
- JAVA 裡static 和volatile的區別Java
- 有關float、position:absolute及a元素
- 【轉】理解 CI 和 CD 之間的區別
- CSS深入理解之absolute定位CSS
- position:fixed 相對父元素定位
- position:fixed作用簡單介紹
- java和html的區別JavaHTML
- CSS深入理解之relative定位CSS
- jquery position()函式和offset()函式的區別jQuery函式
- PHP 中 bind 的用法 self 和 static 的區別PHP
- css position:absolute align center bottomCSS