【憤怒的菜鳥惡補css系列 一】 原來我一直理解錯了css的position


對position錯誤的理解

每次做層浮動效果時,我都將position設置為absolute, 再通過js來計算left,top來給元素來定位。也許是之前做的頁面非常簡單,整個頁面里面沒有嵌套設置position的情況,故一直都認為當position:absolute時,是相對於document.body來偏移的, 其實並不是這樣的, 我們先看下position的屬性。

position的屬性

static

relative

absolute

fixed

 

對每個屬性的理解

static: 這是默認值,即按照正常的文檔流的順序來放元素。 這個時候你設置left,top是沒有效果的。

relative: 位置會以元素本身的位置進行偏移,即你設置了left,top ,他會以此元素原來的位置做為坐標偏移。

absolute: 位置會從父元素開始查找,如果父元素的position不是 static的,那么他就以這個父元素的位置進行偏移,否則就會一直向上查找,直至查找到body,就以body的位置偏移,所以以前理解absolute是以body為位置偏移是錯的,那是因為你處理的元素的父元素的position都是默認static的, 但當你的父元素是非static的,算位置時就出現不一樣的效果。

fixed: 這個才是以document.body的位置偏移的, 無論你要設置的元素的父元素或往上的元素的position是absolute,relative,fixed, 他都是以document.body的位置偏移的。

這樣理解后,就消除了以前的一些疑惑。 但在定位方面,我們可以試一下更復雜的情況。

可以進一步理解

在實際position定位時會遇到很多種情況,比如父元素設置了margin,padding,border. 那么定位原則是怎樣的呢?

1. 當元素的position:relative時,位置偏移時是從此元素自身的margin的最左上側開始算的。

2. 當元素的position:absolute時 這里也分兩種情況:

    (1) 無論它的父元素是怎樣的,如果它自身有margin ,那么他的位置偏移也是要算上它自身的margin的。

    (2) 如果它的父元素不是默認的static ,而它父元素有border 和 padding, margin.

            則它的位置偏移要算上父元素的margin和border,當時不會算上padding.  

可能上面說的比較有點亂,不太好理解,在這里上個例子,大家也可以改這個例子來看看效果,例子僅僅只是測試位置,命名和文字請不要太在意。

<!DOCTYPE>
<html>
 <head>
  <title> New Document </title>
  <meta name="Generator" content="EditPlus">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <style>

  div {
    border:1px solid red;
    
  }

  .ap {
  
    position:relative;
    border:30px solid red;
    margin:200px;
    padding:20px;
    left:20px;
    top:20px;
    width:400px;
    height:400px;
  }

  .a {
    border:1px solid blue;
    position:absolute;
    margin:100px;
    left:0px;
    top:0px;
  }
  </style>
 </head>

 <body>
 <div>
 fdsfdsds
 <div>
    qq
    <div class="ap">
    fffdfdfd<br>
    7777
        <div class="a">kkkk</div>
    </div>
 </div>
 </div>
  <script>
  </script>
 </body>
</html>

總結

現在終於基本上對position的定位有一定的了解了,也希望可以幫助到大家,如果有什么問題請給我留言,大家一起進步。 另外,對於position還會結合到通過js操作dom元素的

offsetWidth,offsetLeft, offsetParent等等屬性,下一期我會繼續討論這方面的問題,希望大家一起將這些吃透。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM