1. 程式人生 > 其它 >position:absolute 的深入探討

position:absolute 的深入探討

今天給大家說說,position:absolute 參考誰進行定位的問題。之前大家可能會認為如果absolute元素的父級(祖父)元素沒有設定position屬性的時候,該元素的position:absolute會參考body進行定位。

換句話說是如果父級設定了position(且值為非static),參照(最近的)父級的內容區域的左上角為初始點,結合top left right bottom 進行定位; 如果沒有設定,往其父級繼續尋找,直到找到為止,如果一直沒有,則相對與body進行定位(我們猜想是這樣的,但是不一定是對哦~~)。

測試例項:

<!doctype html>
<html>
<head>
  <meta charset="UTF-8">
  <title>HTML5Course - 夢幻雪冰</title>
  <link rel="stylesheet" href="reset.css">
  <style>
    /*正常是不能這麼設定的,這邊主要是用來測試*/
    html {
      margin: 20px;
      border: 20px solid red;
    }
    /*正常是不能這麼設定的,這邊主要是用來測試*/
    body {
      height: 400px;
      margin: 30px;
      border: 20px solid green;
    }
    .wrap {
      position: absolute;
      top: 0;
      left: 0;
      width: 100px;
      height: 100px;
      background-color: pink;
    }
  </style>
</head>
<body>
  <div class="wrap">夢幻雪冰</div>
</body>
</html>

測試結果:

Tips:圖中紅色邊框為html元素,綠色邊框為body元素

結論:測試資料發現如果定位的元素的父級(祖父)沒有設定position屬性的時候,不會參考body進行定位。

為了再次驗證我們的結論,我們給body設定position屬性(值為非static),看看結果會是如何?

測試例項:

<!doctype html>
<html>
<head>
  <meta charset="UTF-8">
  <title>HTML5Course - 夢幻雪冰</title>
  <link rel="stylesheet" href="reset.css">
  <style>
    /*正常是不能這麼設定的,這邊主要是用來測試*/
    html {
      margin: 20px;
      border: 20px solid red;
    }
    /*正常是不能這麼設定的,這邊主要是用來測試*/
    body {
      position: relative;
      height: 400px;
      margin: 30px;
      border: 20px solid green;
    }
    .wrap {
      position: absolute;
      top: 0;
      left: 0;
      width: 100px;
      height: 100px;
      background-color: pink;
    }
  </style>
</head>
<body>
  <div class="wrap">夢幻雪冰</div>
</body>
</html>

測試結果:

Tips:圖中紅色邊框為html元素,綠色邊框為body元素

看到結果,發現如果給body設定了position屬性就正常了,所以我們之前的猜想是錯誤的,不是參考body進行定位的。

那麼position:absolute是參考哪一個父級(祖父)元素進行定位的?

當給元素設定absolute的時候,它會往上查詢 absolute 元素的第一個父元素,如果該父元素的 position 值存在(且不為 static),那麼就是根據該父元素進行的定位,否則將會繼續查詢該父元素的父元素,一直追溯到某個父元素具備不為 static 的 position 值為止,如果不存在滿足條件的父元素,則會根據最外層的 window 進行定位。

英文描述如下:

歡迎溝通交流~HTML5學堂