在複雜的嵌套結構中,僅僅獲取元素相對於瀏覽器窗口的位置並沒有多大利用價值,因為定位元素是根據最近的上級非靜態元素進行的。同時對於靜態元素來說,它是根據父元素的位置來決定自己的顯示位置的。
要獲取相對父級元素的位置,不能簡單地讀取CSS樣式的left和top屬性,因為這兩個屬性值是相對最近的上級非靜態元素來說的。可以調用建議135中定義的getW擴展函數分別獲取當前元素和父元素距離窗口的距離,然後求兩個值的差即可。
為了提高執行效率,可以先判斷offsetParent屬性是否指向父級元素,如果是,則可以直接使用offsetLeft和offsetTop屬性獲取元素相對父元素的距離;否則調用getW擴展函數分別獲得當前元素和父元素距離窗口的坐標,然後對這兩個值求差。詳細代碼如下:
//獲取指定元素距離父元素左上角的偏移坐標
//參數:e表示獲取位置的元素
//返回值:返回對像直接量,其中屬性x表示x軸偏移距離,屬性y表示y軸偏移距離
function getP(e){
if(e.parentNode==e.offsetParent){
var x=e.offsetLeft;
var y=e.offsetTop;
}
else{
var o=getW(e);
var p=getW(e.parentNode);
var x=o.x-p.x;
var y=o.y-p.y;
}
return{
"x":x,
"y":y
};
}
下面就可以調用該擴展函數獲取指定元素相對父元素的偏移坐標了,代碼如下:
var box=document.getElementById("box");
var o=getP(box);
alert(o.x);
alert(o.y);
獲取元素相對包含塊的位置與獲取元素相對父級元素的位置不同,所謂包含塊,就是定位元素參照的對象,即定位元素所根據的元素。包含塊一般為距離當前定位元素最近的上級非靜態元素。獲取元素相對包含塊的位置可以直接讀取CSS樣式中left和top屬性值,這兩個值記錄了定位元素的坐標值。
下面定義一個擴展函數getB,它調用了getStyle擴展函數,該函數能夠獲取元素的CSS樣式屬性值(參考建議135的代碼)。對於默認狀態的定位元素或靜態元素,它們的left和top屬性值一般為auto,因此,獲取left和top屬性值後,可以嘗試使用parseInt方法把它們轉換為數值。如果轉換失敗,則說明其值為auto,設置為0,否則返回轉換的數值。代碼如下:
//獲取指定元素距離包含塊元素左上角的偏移坐標
//參數:e表示獲取位置的元素
//返回值:返回對像直接量,其中屬性x表示x軸偏移距離,屬性y表示y軸偏移距離
function getB(e){
return{
"x":(parseInt(getStyle(e,"left"))||0),
"y":(parseInt(getStyle(e,"top"))||0)
};
}