先拋兩個小問題:css
position
設置爲relative/absolute/fixed
的父元素來定位。那若是全部父元素的position
都沒有設置上面三個值,那又是相對誰來定位呢?position:relative
,B設置position:absolute;left:0;top:0
,這個left:0;top:0
是相對於A元素的content-box、padding-box仍是margin-box的左上角?若是你還不是頗有把握說出來答案,能夠先思考一下或者實踐一下,而後再閱讀後面的內容。html
top
right
bottom
left
四個屬性決定的margin
不會和其餘元素的margin
摺疊上面說到絕對定位元素的大小是由top
right
bottom
left
四個屬性決定的,這四個屬性是相對於絕對定位元素的包含塊
來定位的。瀏覽器
絕對定位元素的包含塊是由其最近的position
屬性設置爲relative
、absolute
或fixed
的祖先元素,按照如下方式生成的:函數
padding edge
組成(即相對於祖先元素padding-box進行定位)若是絕對定位元素的全部祖先元素的position
屬性都沒有設置relative
、absolute
或fixed
,則其包含塊爲初始包含塊
。佈局
根元素(在HTML文檔中即<html>元素
)所在的包含塊便是初始包含塊,對於瀏覽器來講:初始包含塊的大小便是視口的大小,可是是以畫布原點爲錨點的。
瀏覽器的視口是固定在那不變的,可是一個文檔可能會很長,能夠上下滾動,視口中的內容會不斷變化。初始包含塊能夠簡單理解爲第一個視口區域(這句話是我本身造的),上圖:
spa
<!-- demo1 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>初始包含塊</title>
<style> html { margin: 10px; padding: 10px; border: 1px solid red; } body { padding: 10px; border: 1px solid blue; } .abs { position: absolute; /*left: 0;*/ /*bottom: 0;*/ padding: 5px; background-color: #9089e4; color: #fff; } </style>
</head>
<body>
<h3>絕對定位之初始包含塊</h3>
<div>
<div>初始包含塊不是html,也不是body,而是指視口。</div>
<div>初始包含塊不是html,也不是body,而是指視口。</div>
<div>初始包含塊不是html,也不是body,而是指視口。</div>
<div>初始包含塊不是html,也不是body,而是指視口。</div>
<div>初始包含塊不是html,也不是body,而是指視口。</div>
<div>初始包含塊不是html,也不是body,而是指視口。</div>
<div>初始包含塊不是html,也不是body,而是指視口。</div>
<div>初始包含塊不是html,也不是body,而是指視口。</div>
<div>初始包含塊不是html,也不是body,而是指視口。</div>
<div>滾到底啦,沒有更多內容啦~~~</div>
<div class="abs">我是絕對定位元素。</div>
</div>
</body>
</html>複製代碼
一個元素的靜態位置能夠簡單理解爲這個元素在普通文檔流中的位置,就是這個元素的position
爲static
,float
爲none
時,元素在文檔中所處的位置。 3d
<!-- demo2 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>初始包含塊</title>
<style> body { position: relative; padding: 10px; border: 1px solid blue; } .abs { position: absolute; margin-left: 5px; padding: 5px; background-color: #9089e4; border: 1px solid orange; color: #fff; } .abs2 { position: absolute; top: 50px; left: 10px; margin-left: 5px; padding: 5px; background-color: #9089e4; color: #fff; border: 1px solid orange; } </style>
</head>
<body>
<div class="abs">絕對定位元素1</div>
<div class="abs2">絕對定位元素2</div>
<div>body的其餘子元素body的其餘子元素body的其餘子元素body的其餘子元素body的其餘子元素body的其餘子元素body的其餘子元素body的其餘子元素body的其餘子元素body的其餘子元素</div>
</body>
</html>複製代碼
從上面代碼能夠看出,.abs
和.abs2
兩個元素的靜態位置的left值都爲10px(即body的padding-left值),咱們不設置.abs
的left值,即默認auto,而.abs2
的left設置爲10px,會看到兩個元素距離包含塊左邊的距離是同樣的。
code
計算公式(width表示內容寬度,即標準盒子模型):cdn
'left' + 'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' + 'right' = width of containing block
left、width、right默認值是auto
margin-left、margin-right默認值是0htm
以水平方向(從左至右:ltr)爲例說明一下絕對定位元素的位置(或大小)是如何定義的。起決定因素的有left
right
width
,每一個屬性均可以設置或者不設置值,默認爲auto,設置了值的在表格中用1表示,總共有2 * 2 * 2 = 8 種狀況:
Left | Width | Right | 佈局 |
---|---|---|---|
auto | auto | auto | 把margin-left和margin-right爲auto的設置爲0;把left設置爲靜態位置的left值;寬度自適應:margin-right邊緣最遠到right爲0的位置(若是margin-right爲0,則取border-right邊緣,若是border-right-width也爲0,則取padding-right邊緣,下同) |
1 | auto | auto | 把margin-left和margin-right爲auto的設置爲0;寬度自適應:margin-right邊緣最遠到right爲0的位置 |
auto | auto | 1 | 把margin-left和margin-right爲auto的設置爲0;寬度自適應:margin-left邊緣最遠到left爲0的位置 |
auto | 1 | auto | 把margin-left和margin-right爲auto的設置爲0;把left設置爲靜態位置的left值; |
1 | 1 | auto | 把margin-left和margin-right爲auto的設置爲0;從左至右按照各屬性值佈局 |
auto | 1 | 1 | 把margin-left和margin-right爲auto的設置爲0;從右到左按照個屬性值佈局 |
1 | auto | 1 | 把margin-left和margin-right爲auto的設置爲0;寬度自動拉伸 |
1 | 1 | 1 | ① 若是margin-left和margin-right都爲auto,此時兩者相等,則按照上述方程計算出對應的margin值;若是此時計算出來的margin值爲負值,則設置margin-left爲0,而後根據方程再計算出margin-right的值。 ② 若是margin-left、margin-right中有一個爲auto,則按照方程計算出這個值; ③ 若是margin-left、margin-right都設置了值,且致使方程左右不相等,則忽略right值。 |
上面是以水平方向佈局講述了絕對定位元素的寬度是如何定義的,高度是相似的,就再也不詳細闡述了,想進一步瞭解細節的同窗請參考 www.w3.org/TR/CSS22/vi…
本文主要參考資料:
www.w3.org/TR/CSS22/vi…
篇幅已經很長了,還有一部分知識點沒講到:
包含塊部分:
絕對定位元素的包含塊是由其最近的position
屬性設置爲relative
、absolute
或fixed
的祖先元素,按照如下方式生成的:
若是這個祖先元素是行內元素...
(包含塊是如何定義的?)佈局部分:
上述所講的絕對定位元素的佈局是針對非可替換元素
,若是是可替換元素
,佈局又是怎樣的?這些內容將在下一篇文章中作進一步闡述。