淺談塊元素絕對定位的margin屬性

對於div的絕對定位一直覺得margin屬性是無效的,只是經過top,left,bottom,right定位,然而今天的卻發現不是這樣的,因而對其作了些實驗:css

 

使用的HTML原始測試文件: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.   
  8. <body>  
  9. <div class="wrapper">  
  10.     <div class="box">  
  11.         <div class="bottom"></div>  
  12.     </div>  
  13. </div>  
  14. </body>  
  15. </html>  

 

 

原始的測試css:app

 

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不進行定義,則以下圖:ui

 

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

 


 

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

 

 

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相加的值xml

下面的也是:htm

咱們把margin-top的值改成30px;it

則是下面的圖:io


說明上面的推斷可能正確,總的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中也一樣適用:

 


 

如今咱們能夠獲得結論了,當絕對定位塊和上層相對定位(或絕對定位)中間夾着一層標準流(或浮動)的塊時:

 

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

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

三、當同時使用二者時則按照上層相對定位(或絕對定位)的邊界進行定位,而且距離值爲二者的相加值

 

補充一點:

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

 

 

 

 

引伸應用:

 

上述特色能夠用來無hack地定位居中元素:

 

具體以下:

 

Css代碼   收藏代碼
  1. #con{  
  2.     position:absolute;  
  3.     left:50%;  
  4.     width:760px;  
  5.     margin-left:-380px;  
  6. }  

 上面的代碼就是應用了得出的觀點的第三點執行的,並且這種上面的定位方式是徹底遵循Css原則的無hack的模式

相關文章
相關標籤/搜索