讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議136:正確獲取相對位置 >

建議136:正確獲取相對位置

在複雜的嵌套結構中,僅僅獲取元素相對於瀏覽器窗口的位置並沒有多大利用價值,因為定位元素是根據最近的上級非靜態元素進行的。同時對於靜態元素來說,它是根據父元素的位置來決定自己的顯示位置的。

要獲取相對父級元素的位置,不能簡單地讀取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)

};

}