首页 » 编写高质量代码:改善JavaScript程序的188个建议 » 编写高质量代码:改善JavaScript程序的188个建议全文在线阅读

《编写高质量代码:改善JavaScript程序的188个建议》建议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)

};

}