先來看看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)
應用:
在要獲取元素距離網頁左側距離的時候就要考慮offsetParent的定位問題,不能簡單的用ele.offsetLeft/Top獲取,必須通過循環累加的方式才能獲得正確值(chrome的結果和IE、Firefox不一樣,相差1px,原因是chrome沒有把邊框計算進去),下面是代碼
var getOffset = { left:function(obj){ return obj.offsetLeft + (obj.offsetParent ? this.left(obj.offsetParent) : 0); }, top:function(){ return obj.offsetTop + (obj.offsetParent ? this.top(obj.offsetParent) : 0); } };
Tips:代碼中的this.left、this.top可以用arguments.callee代替,但根據ECMAScript 5規范不建議使用,strict model下已經被禁用,因為arguments是一個比較龐大的對象,非常耗資源