本文共 5535 字,大约阅读时间需要 18 分钟。
花了点时间研究了这几个容易混的属性,看看offsetLeft/offsetTop
由于body的重要性,所以成为了document的一个属性,可以document.body直接访问到。
html中body表明着我们要在浏览器客户区呈现的内容。
< !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结果都如下:
为body添加border:5px solid red;
< !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;
border:5px solid red;
}
</ 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 > 出现了ie6/safari3/opera9都显示:
3.接着再为body加margin:5px 8px;
body {
width :
1000px ;
padding :
50px 0 ;
background-color :
#efeede ;
border :
5px solid red ;
margin :
5px 8px ;
}
< !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;
border:5px solid red;
/*margin:5px 8px;*/
}
</ style > </ head > < body > < div id ="divTest" > < div id ="dd" > 呵呵
</ div > </ div > </ body > < script type ="text/javascript" > var elemTest=document.getElementById('divTest');
elemTest.innerHTML=elemTest.offsetLeft+","+elemTest.offsetTop+":"+elemTest.offsetParent;
</ script > </ html > 0,50:[object HTMLBodyElement]
5,55:[object HTMLBodyElement]
#divTest
{
border:6px solid #393;
}
#divTest
{
border:6px solid #393;
padding:10px;
margin:8px;
}
8,58:[
object HTMLBodyElement]
看来都加上了margin:8px但padding不影响自己。
13,63:[
object HTMLBodyElement]
opera9的计算offsetLeft=5px+8px=13px,而offsetTop=55px+8px=63px
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内容区左上角的水平偏移。 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"> <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; border:5px solid red; /*margin:5px 8px;*/ } #divTest { border:6px solid #393; padding:10px; margin:8px; } #dd { } </style> </head> <body> <div id="divTest" > <div id="dd" >呵呵</div> </div> </body> <script type="text/javascript" > var elemTest=document.getElementById('dd'); elemTest.innerHTML=elemTest.offsetLeft+"," +elemTest.offsetTop+":" +elemTest.offsetParent; </script> </html> 24,74:[
object HTMLBodyElement]
实际上是其父容器的偏移加上左边框和左内距padding
如#divTest的offsetLeft=8px;
则#dd的offsetLeft=8px+(borderleft+padding-left)=8px+(6px+10px)=24px;
同理offsetTop=50px+8px+6px+10px=74px
24,66:[
object ]
只是offsetTop由于重叠少了个8px的margin-top
29,79:[
object HTMLBodyElement]
offsetLeft=body.(5px+0px)+#divTest.(8px+6px+10px)+#dd.margin-left=29px
#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 #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 如果body具有border时,几个浏览器计算有差异,如果记不住,最好不要给body加Border 这点看来Opera比较标准些,FF3和Safari却不计算body的border. ie6和FF3/safari3/opera9一共2类 转载地址:http://ydyxi.baihongyu.com/