天天看點

js之offsetLeft屬性探讨

花了點時間研究了這幾個容易混的屬性,看看offsetLeft/offsetTop

本文假定你已經了解了DOM樹結構:

不如正題:

由于body的重要性,是以成為了document的一個屬性,可以document.body直接通路到。

html中body表明着我們要在浏覽器客戶區呈現的内容。

1.offsetLeft

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 

<head> 

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

<title>offsetLeft探讨</title> 

<style type="text/css"> 

margin:0; 

padding:0; 

html 

background-color:#fff; 

body 

width:1000px; 

padding:50px 0; 

background-color:#efeede; 

</style> 

</head> 

<body> 

  <div id="divTest" style="border:6px solid red;margin1:8px;padding:5px;"> 

    <div id="dd">呵呵</div> 

  </div> 

</body> 

  <script type="text/javascript"> 

  var elemTest=document.body; 

  elemTest.innerHTML=elemTest.offsetLeft+","+elemTest.offsetTop+":"+elemTest.offsetParent; 

  </script> 

</html>

上面代碼在FF3/ie6/Opera9/safari3結果都如下:

沒看出什麼不同來。

2.接着添加代碼

為body添加border:5px solid red;

border:5px solid red; 

出現了ie6/safari3/opera9都顯示:

0,0:null

而火狐3是

-5,-5:null

3.接着再為body加margin:5px 8px;

如下

margin:5px 8px; 

}

結果:

FF3沒變還是

opera9/safari3也沒變還是

但ie6變了:

8,5:null

看來ie6是算上了margin.

4.看一下裡面的 元素

/*margin:5px 8px;*/ 

  <div id="divTest"> 

  var elemTest=document.getElementById('divTest'); 

在FF3/safari3中:

0,50:[object HTMLBodyElement]

ie6裡

0,50:[object]

看來FF3/safari3/ie6顯示一樣

在Opera9

5,55:[object HTMLBodyElement]

加上了border寬度。

繼續添加

#divTest 

border:6px solid #393; 

結果都沒有變。

繼續修改如下:

padding:10px; 

margin:8px; 

結果如下:

FF3和蘋果Safari3:

8,58:[object HTMLBodyElement]

看來都加上了margin:8px但padding不影響自己。

Opera9:

13,63:[object HTMLBodyElement]

opera9的計算offsetLeft=5px+8px=13px,而offsetTop=55px+8px=63px

也是加上了8px的外margin.

但是ie6的margin重疊了

8,50:[object]

ie6左右計算同FF3/safari3,offsetLeft=0px+8px的margin=8px

但是上下margin重疊是以offsetTop=max(50,8)=50px

結論:

Firefox3.0+,  Safari3.0  , IE6

offsetLeft:元素的表框Border左上角距離Body内容區左上角的水準偏移。

Opera9:

offsetLeft:元素的表框Border左上角距離Body邊框Border左上角的水準偏移。

對于offsetTop計算,IE6有個上下margin重疊的問題。

為了驗證結論,再來幾個例子:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

<style type="text/css"> 

#dd 

  <div id="divTest"> 

    <div id="dd">呵呵</div> 

  <script type="text/javascript"> 

  var elemTest=document.getElementById('dd'); 

FF3,Safari3:

24,74:[object HTMLBodyElement]

實際上是其父容器的偏移加上左邊框和左内距padding

如#divTest的offsetLeft=8px;

則#dd的offsetLeft=8px+(borderleft+padding-left)=8px+(6px+10px)=24px;

同理offsetTop=50px+8px+6px+10px=74px

而IE6:

24,66:[object]

隻是offsetTop由于重疊少了個8px的margin-top

29,79:[object HTMLBodyElement]

opera9

offsetLeft=body.(5px+0px)+#divTest.(8px+6px+10px)+#dd.margin-left=29px

總結公式:

FF3  safari3:

#elem.offsetLeft=body.paddingLeft+...+parent .marginLeft+parent.BorderLeft+parent.PaddingLeft+#elem.marginLeft

解釋:一個元素的左偏移offsetLeft=body的左padding+...中間的祖先的(marginLeft+borderLeft+paddingLeft)+自身的marginLeft

#dd.offsetLeft=0px+(8px+6px+10px)+7px=31px

Opera9

#elem.offsetLeft=body.(borderLeft+paddingLeft)+...+parent .marginLeft+parent.BorderLeft+parent.PaddingLeft+#elem.marginLeft

#dd.offsetLeft=(5px+0px)+(8px+6px+10px)+7px=36px

不過這個公式,當body有margin時,又不好用了,亂了,先不整理了。

如果body有margin時

ff3和safari3還要加上margin,但不加border很奇怪

而Opera9也會加上margin

IE比較堅守陣地,死活不加。

于是總結

如果body具有border時,幾個浏覽器計算有差異,如果記不住,最好不要給body加Border

這點看來Opera比較标準些,FF3和Safari卻不計算body的border.

IE不會加margin.

是以不要給body加border,這樣可以分

ie6和FF3/safari3/opera9一共2類

本文轉自 xcf007 51CTO部落格,原文連結:http://blog.51cto.com/xcf007/107948,如需轉載請自行聯系原作者

繼續閱讀