1. 程式人生 > >margin對css絕對定位的影響

margin對css絕對定位的影響

試驗css絕對定位時,跟自己預想的不太一樣,有點迷,查了之後才發現還有margin的影響。。。。

正文:

對於div的絕對定位一直以為margin屬性是無效的,只是通過top,left,bottom,right定位,然而今天的卻發現不是這樣的,於是對其做了些實驗:

使用的HTML原始測試檔案:

Html程式碼  收藏程式碼
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html xmlns
    ="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />  
  5. <title>test</title>  
  6. </head>  
  7. <body>  
  8. <div class="wrapper">  
  9.     <div class="box">  
  10.         <div class="bottom"></div>  
  11.     </
    div>  
  12. </div>  
  13. </body>  
  14. </html>  

原始的測試css:

Html程式碼  收藏程式碼
  1. <style>  
  2. *{  
  3.     margin:0;  
  4.     padding:0;  
  5. }  
  6. .wrapper{  
  7.     width:400px;  
  8.     overflow:hidden;  
  9.     background:#000;  
  10.     margin:20px auto;  
  11.     position:relative;  
  12. }  
  13. .box{  
  14.     width:200px;  
  15.     height:400px;  
  16.     background:#F00;  
  17.     margin-left:40px;  
  18. }  
  19. .bottom{  
  20.     width:200px;  
  21.     height:40px;  
  22.     position:absolute;  
  23.     background:#0F0;  
  24.     top:0;  
  25.     left:0;  
  26. }  
  27. </style>  


   上面的圖是普通的定義了top和left的,絕對定位的元素在父元素中尋找相對或絕對定位的並進行定位。

而要是這top和left不進行定義,則如下圖:

Css程式碼  收藏程式碼
  1. .bottom{  
  2.     width:200px;  
  3.     height:40px;  
  4.     position:absolute;  
  5.     background:#0F0;  
  6. }  


則絕對定位元素對位參照上層父級元素。

Css程式碼  收藏程式碼
  1. .bottom{  
  2.     width:200px;  
  3.     height:40px;  
  4.     position:absolute;  
  5.     background:#0F0;  
  6.     top:30px;  
  7.     margin-top:-30px;  
  8. }  

上面程式碼的顯示和上面的圖是一樣的。top的值是top和margin-top相加的值

下面的也是:

我們把margin-top的值改為30px;

則是下面的圖:


說明上面的推斷可能正確,總的top值是兩個值的疊加。

下面我們用left方向來說明一下中間的.box的margin值對定位的作用:

Css程式碼  收藏程式碼
  1. .bottom{  
  2.     width:200px;  
  3.     height:40px;  
  4.     position:absolute;  
  5.     background:#0F0;  
  6.     top:30px;  
  7.     margin-top:30px;  
  8.     left:20px;  
  9. }  

 單單是left定位的話很容易猜到下圖:



 而用單單用margin-left呢?

Css程式碼  收藏程式碼
  1. .bottom{  
  2.     width:200px;  
  3.     height:40px;  
  4.     position:absolute;  
  5.     background:#0F0;  
  6.     top:30px;  
  7.     margin-top:30px;  
  8.     margin-left:20px;  
  9. }  



 可以看到它是根據未用position定位的父級元素的邊界進行margin定位的。

如果margin和left一起出現呢?

為了和前面的區別開來,我採用left:10px

Css程式碼  收藏程式碼
  1. .bottom{  
  2.     width:200px;  
  3.     height:40px;  
  4.     position:absolute;  
  5.     background:#0F0;  
  6.     top:30px;  
  7.     margin-top:30px;  
  8.     margin-left:20px;  
  9.     left:10px;  
  10. }  


可以看到綠色的塊元素左溢位紅塊,以為現在的left值為30px。

這個在IE6中也同樣適用:


現在我們可以得到結論了,當絕對定位塊和上層相對定位(或絕對定位)中間夾著一層標準流(或浮動)的塊時:

1、只使用left等定位是按照上層相對定位(或絕對定位)的邊界進行定位

2、只使用margin相關屬性定位時按照上層標準流(或浮動)塊的邊界進行定位

3、當同時使用兩者時則按照上層相對定位(或絕對定位)的邊界進行定位,並且距離值為兩者的相加值

4、對於不使用left也沒有margin的,自動按照上層標準流進行定位

補充一點:

元素的上下和左右分別對應於哪層塊互不干擾。

引申應用:

上述特點可以用來無hack地定位居中元素:

具體如下:

Css程式碼  收藏程式碼
  1. #con{  
  2.     position:absolute;  
  3.     left:50%;  
  4.     width:760px;  
  5.     margin-left:-380px;  
  6. }  
 上面的程式碼就是應用了得出的觀點的第三點執行的,而且這種上面的定位方式是完全遵循Css原則的無hack的模式

以下內容個人補充,與轉載無關:

<P>元素的margin同樣有影響,可以個人試驗一下;

首先<p>標籤在主流瀏覽器是有預設的margin值的:預設margin:12px 0;所以實驗之前先設定所有的p標籤margin:0;