在css中,絕對(duì)定位是使元素的位置與文檔流無(wú)關(guān)的定位方式。設(shè)置為絕對(duì)定位的元素框從文檔流完全刪除,并相對(duì)于其包含塊定位;默認(rèn)情況下,絕對(duì)定位的位置是相對(duì)于瀏覽器而言,配合top、right、bottom、left進(jìn)行定位。
本教程操作環(huán)境:windows7系統(tǒng)、CSS3&&HTML5版、Dell G3電腦。
在css中,絕對(duì)定位是使元素的位置與文檔流無(wú)關(guān)的定位方式。
設(shè)置為絕對(duì)定位的元素框從文檔流完全刪除,并相對(duì)于其包含塊定位,包含塊可能是文檔中的另一個(gè)元素或者是初始包含塊。默認(rèn)情況下,絕對(duì)定位的位置是相對(duì)于瀏覽器而言,配合top、right、bottom、left進(jìn)行定位。
元素原先在正常文檔流中所占的空間會(huì)關(guān)閉,就好像該元素原來(lái)不存在一樣。元素定位后生成一個(gè)塊級(jí)框,而不論原來(lái)它在正常流中生成何種類(lèi)型的框。
下面我們來(lái)詳細(xì)了解一下絕對(duì)定位(absolute)。其實(shí)絕對(duì)定位absolute和浮動(dòng)float有部分相似性;如果能理解浮動(dòng)float,對(duì)理解絕對(duì)定位absolute會(huì)大有幫助。
先說(shuō)absolute和float的相似處:包裹性 和 高度欺騙
包裹性
所謂一圖勝千言(唯一的區(qū)別是:下圖的p增加了absolute)
<p style="border:4px solid blue;"> <img src="img/25/1.jpg" /> </p> <p style="border:4px solid red; position: absolute;"> <img src="img/25/2.jpg" /> </p>
一旦給元素加上absolute或float就相當(dāng)于給元素加上了display:block;。什么意思呢?比如內(nèi)聯(lián)元素span默認(rèn)寬度是自適應(yīng)的,你給其加上width是不起作用的。要想width定寬,你需要將span設(shè)成display:block。但如果你給span加上absolute或float,那span的display屬性自動(dòng)就變成block,就可以指定width了。因此如果看到CSS里absolute/float和display:block同時(shí)出現(xiàn),那display:block就是多余的CSS代碼。
高度欺騙
上例中給圖片外層的p加上absolute,因此高度欺騙未能很好的體現(xiàn)出來(lái),將absolute移到內(nèi)部圖片上,效果就出來(lái)了:
<p style="border:4px solid blue;"> <img src="img/25/1.jpg" /> </p> <p style="border:4px solid red;"> <img style="position: absolute;" src="img/25/2.jpg" /> </p>
如果你看過(guò)CSS浮動(dòng)float詳解會(huì)發(fā)現(xiàn)效果是一樣的。但其背后的原理其實(shí)是有區(qū)別的,并不完全相同。加點(diǎn)文字就看出來(lái)了:
<p style="border:4px solid blue;"> <img src="img/25/1.jpg" /> </p> <p style="border:4px solid red;"> <img style="position: absolute;" src="img/25/2.jpg" /> 我是一個(gè)絕對(duì)定位的absolute元素 </p>
從圖中明顯看出文字被圖片遮蓋了,這點(diǎn)和float不同。float是欺騙父元素,讓其父元素誤以為其高度塌陷了,但float元素本身仍處于文檔流中,文字會(huì)環(huán)繞著float元素,不會(huì)被遮蔽。
但absolute其實(shí)已經(jīng)不能算是欺騙父元素了,而是出現(xiàn)了層級(jí)關(guān)系。如果處于正常的文檔流中的父元素算是凡人的話(huà),那absolute已經(jīng)得道成仙,用現(xiàn)在的話(huà)說(shuō)已經(jīng)不在一個(gè)次元上。從父元素的視點(diǎn)看,設(shè)成absolute的圖片已經(jīng)完全消失不見(jiàn)了,因此從最左邊開(kāi)始顯示文字。而absolute的層級(jí)高,所以圖片遮蓋了文字。
記得我剛開(kāi)始接觸CSS尚處于戰(zhàn)斗力為5的渣渣時(shí),知道了absolute可以出現(xiàn)層級(jí)的概念,就誤以為已經(jīng)徹底懂了,現(xiàn)在想想真是圖樣圖森破(當(dāng)然這不是件壞事,每當(dāng)你覺(jué)得以前的自己渣像塊豆腐渣時(shí),就代表你進(jìn)步了。反過(guò)來(lái)總說(shuō)想當(dāng)年自己如何如何,那說(shuō)明你還在吃老本)。
有了上面的基礎(chǔ)后,你還需要了解absolute以下特性
- 如何確定定位點(diǎn)
- 和relative相愛(ài)相殺
- 和z-index的關(guān)系
- 減少重繪和回流的開(kāi)銷(xiāo)
如何確定定位點(diǎn)
一旦absolute分層后,第一個(gè)出現(xiàn)的問(wèn)題就是讓瀏覽器在何處顯示該元素。普通文檔流里的元素,瀏覽器可以根據(jù)其父子兄弟元素的大小和位置,計(jì)算出該元素的位置。但分層后怎么辦?基本思路如下:
第一種情況:用戶(hù)只給元素指定了absolute,未指定left/top/right/bottom。此時(shí)absolute元素的左上角定位點(diǎn)位置就是該元素正常文檔流里的位置。如上面圖例中,圖片熊貓是父元素的第一個(gè)孩子,因此左上角定位點(diǎn)就是父元素的content的左上角。
如果將圖片熊貓和下面的文字順序改一下,讓其成為父元素的第二個(gè)孩子,一圖勝千言:
<p style="border:4px solid red;"> 我是一個(gè)絕對(duì)定位的absolute元素 <img style="position: absolute;" src="img/25/2.jpg" /> </p>
結(jié)論重復(fù)一遍:未指定left/top/right/bottom的absolute元素,其在所處層級(jí)中的定位點(diǎn)就是正常文檔流中該元素的定位點(diǎn)。
第二種情況:用戶(hù)給absolute元素指定了left/right,top/bottom
先簡(jiǎn)單點(diǎn),讓absolute元素沒(méi)有position:static以外的父元素。此時(shí)absolute所處的層是鋪滿(mǎn)全屏的,即鋪滿(mǎn)body。會(huì)根據(jù)用戶(hù)指定位置的在body上進(jìn)行定位。
只指定left時(shí),元素的左上角定位點(diǎn)的left值會(huì)變成用戶(hù)指定值。但top值仍舊是該元素在正常文檔流中的top值:
<p style="border:4px solid red;"> 我是一個(gè)絕對(duì)定位的absolute元素 <img style="position: absolute;left:50px;" src="img/25/2.jpg" /> </p>
只指定right時(shí),元素的右上角定位點(diǎn)的right值會(huì)變成用戶(hù)指定值。但top值仍舊是該元素在正常文檔流中的top值:
<p style="border:4px solid red;"> 我是一個(gè)絕對(duì)定位的absolute元素 <img style="position: absolute;right:50px;" src="img/25/2.jpg" /> </p>
只指定top時(shí),元素的左上角定位點(diǎn)的top值會(huì)變成用戶(hù)指定值。但left值仍舊是該元素在正常文檔流中的left值:
<p style="border:4px solid red;"> 我是一個(gè)絕對(duì)定位的absolute元素 <img style="position: absolute;top:50px;" src="img/25/2.jpg" /> </p>
只指定bottom時(shí),元素的左下角定位點(diǎn)的bottom值會(huì)變成用戶(hù)指定值。但left值仍舊是該元素在正常文檔流中的left值:
<p style="border:4px solid red;"> 我是一個(gè)絕對(duì)定位的absolute元素 <img style="position: absolute;bottom:50px;" src="img/25/2.jpg" /> </p>
通過(guò)對(duì)left/top/right/bottom的組合設(shè)置,由于沒(méi)有position:static以外的父元素,此時(shí)absolute元素可以去任意它想去的地方,天空才是它的極限。
和relative相愛(ài)相殺
通常我們對(duì)relative的認(rèn)識(shí)是(好吧,我承認(rèn),這是我戰(zhàn)5渣渣時(shí)的認(rèn)識(shí)。如果你是弗利薩,可以鄙視這句話(huà)):relative主要用于限制absolute
上面已經(jīng)說(shuō)了,如果absolute元素沒(méi)有position:static以外的父元素,那將相對(duì)body定位,天空才是它的極限。而一旦父元素被設(shè)為relative,那absolute子元素將相對(duì)于其父元素定位,就好像一只腳上被綁了繩子的鳥(niǎo)。
比如你要實(shí)現(xiàn)下圖iOS里APP右上角的紅色圈圈
通常的做法是將APP圖片所處的p設(shè)成relative,然后紅色圈圈設(shè)成absolute,再設(shè)top/right即可。這樣無(wú)論用戶(hù)怎么改變APP圖片的位置,紅色圈圈永遠(yuǎn)固定在右上角,例如:
.tipIcon { background-color: #f00; color: #fff; border-radius:50%; text-align: center; position: absolute; width: 20px; height: 20px; right:-10px; //負(fù)值為自身體積的一半 top:-10px; } <p style="display: inline-block;position:relative;"> <img src="img/25/2.jpg" /> <span class="tipIcon">6</span> </p>
這樣做效果是OK的,兼容性也OK。但CSS的世界里要實(shí)現(xiàn)一個(gè)效果可以有很多種方式,具體選用哪個(gè)方案是見(jiàn)仁見(jiàn)智的。我比較看重的標(biāo)準(zhǔn):一個(gè)是簡(jiǎn)潔,另一個(gè)是盡量讓每個(gè)屬性干其本職工作。
用這兩個(gè)標(biāo)準(zhǔn)看待上述實(shí)現(xiàn)方法,應(yīng)該是有改進(jìn)的空間的。首先外層p多了relative未能簡(jiǎn)潔到極致。其次relative的本職工作是讓元素在相對(duì)其正常文檔流位置進(jìn)行偏移,但父層p并不需要任何位置偏移,之所以設(shè)成relative唯一的目的是限制absolute子元素的定位點(diǎn)。因此在我看來(lái)這并沒(méi)有讓relative干其本職工作。好比小姐的本職工作是服務(wù)業(yè),順便陪客戶(hù)聊聊天,但純聊天聊完一個(gè)鐘,恐怕會(huì)被投訴。
(學(xué)習(xí)視頻分享:css視頻教程)