简单理解offsetleft、offsetTop、offsetParent
先来看看offsetParent返回的是什么值
ele.offsetParent返回的是ele元素最近的并且是定位过(relative,absolute)的⽗元素,如果没有⽗元素或者是⽗元素中没有⼀个是定位过的,返回值就是body元素
ele.offsetLeft和ele.offsetTop取值问题,分多种情况:
如果ele是body的直接⼦元素,返回值则是ele距离body左侧或顶部的距离
如果ele不是body的直接⼦元素,在⽗元素进⾏定位(relative,absolute)的情况下,各浏览器返回值都是ele距离⽗元素左侧或者是顶部的距离(唯⼀的区别就是chrome没有把边框计算进去,IE,firefox都计算进去了)
如果ele不是body的直接⼦元素,⽗元素也没有进⾏定位的情况下,各浏览器返回的直接是ele元素距body的距离
从上⾯可以看出offsetLeft、offsetTop返回的值就是ele到offsetParent的距离,这个offsetParent是什么元素要看ele的⽗元素有没有进⾏定位(relative、absolute)
应⽤:
absolute relative在要获取元素距离⽹页左侧距离的时候就要考虑offsetParent的定位问题,不能简单的⽤ele.offsetLeft/Top获取,必须通过循环累加的⽅式才能获得正确值(chrome的结果和IE、Firefox不⼀样,相差1px,原因是chrome没有把边框计算进去),下⾯是代码
(Tips:代码中的this.left、p可以⽤arguments.callee代替,但根据ECMAScript 5规范不建议使⽤,strict model下已经被禁⽤,因为arguments是⼀个⽐较庞⼤的对象,⾮常耗资源)
var getOffset = {
left:function(obj){
return obj.offsetLeft + (obj.offsetParent ? this.left(obj.offsetParent) : 0);
},
top:function(){
return obj.offsetTop + (obj.offsetParent ? p(obj.offsetParent) : 0);
}
}