BOM中的那点事-window(二)

3. 窗口的位置

       我们有很多的方式来获取和修改窗体的位置,IE,Safari,Opera和Chrome都提供了screenLeft和screenRight属性,分别表示window的相对于屏幕左边和上边的位置。但是FireFox提供的两个对应的属性为screenX和screenY,Safari和Chrome同时支持这两个属性。虽然Opera也支持screenX和screenY这两个属性,但是和screenLeft和screenTop并不等价,因此建议不在Opera中使用screenX和screenY。我在IE9上测试了screenX和screenY,虽然也支持,但是也和screenLeft和screenTop表示不同的含义,后面说到。可以通过如下代码跨浏览器获取窗口的位置:

1 var leftPos = (typeof window.screenLeft == 'number') ? window.screenLeft : window.screenX;
2 var topPos = (typeof window.screenTop == 'number') ? window.screenTop : window.screenY;

在使用这两个属性的时候,有些问题需要注意:

<1>. 在IE,Opera和Chrome中,screenLeft和screenTop保存的是当前window对象到屏幕左上角的垂直和水平距离,不包括边框;这里有一点需要提一下就是在IE9中screenX和screenY保存的位置包括边框(IE以前的版本大家可以试一下),以IE为例如下图所示:

<2>. 在FireFox,Safari和Chrome中screenX和screenY始终返回top到屏幕左上角的水平和垂直距离,而IE和Opera会返回对应window的精确位置坐标。

终上所述,无法跨浏览器取得窗口左边和上边的精确坐标,但是window提供的moveTo和moveBy可以把窗口移动到精确的新位置。moveTo接受新坐标的x和y坐标,而moveBy接受水平或者垂直移动的像素,需要注意的是这两个方法只能对最外层window起作用,而且这两个方法可能被浏览器禁用(IE7以后以及Opera默认禁用)。如下示例:

1 //将窗口移动到屏幕左上角
2 window.moveTo(0, 0);
3 //将窗口向下移动100像素
4 window.moveBy(0, 100);
5 //将窗口向左移动50像素
6 window.moveBy(-50, 0);

4.窗口大小

      前面提到不能跨浏览器精确确定window的位置,同样,想确定窗口的大小也不是一件简单的事。FireFox,Safari,Opera和Chrome都提供了innerWidth, innerHeight, outerWidth, outerHeight四个属性。在Safari和FireFox中outerWidth和outerHeight返回浏览器本身的大小,而在Opera中返回页面视图容器的大小。而innerWidth和innerHeight表示页面中试图区域的大小。而在Chrome中四个属性都返回页面视图的大小,而非浏览器的大小。特别的,IE旧版本没有提供获取当前浏览器大小的接口,但是通过DOM提供了页面可视区域的信息。但是通过测试,在IE9中已经提供这四个属性,同样的innerWidth和innerHeight保存着页面可视区域的大小,而outerWidth和outerHeight保存着浏览器窗体本身的大小。用一个表总结如下:

  IE9 FireFox Safari Opera Chrome
innerWidth 页面视图宽度 页面视图宽度 页面视图宽度 页面视图宽度 页面视图宽度
innerHeight 页面视图高度 页面视图高度 页面视图高度 页面视图高度 页面视图高度
outerWidth 浏览器宽度 浏览器宽度 浏览器宽度 页面视图宽度 页面视图宽度
outerHeight 浏览器高度 浏览器高度 浏览器高度 页面视图高度 页面视图高度

除了通过BOM可以访问窗体大小外,通过DOM同样也可以获取窗体的大小信息,在IE,FireFox,Safari,Opera以及Chrome中通过如下代码可以获取窗体大小信息,但是返回的都是页面可视区域的大小:

1 //用于标准模式
2 var viewPortHeight = document.documentElement.clientHeight;
3 var viewPortWidht = document.documentElement.clientWidth;
4 //用于混杂模式
5 var viewPortHeight1 = document.body.clientHeight;
6 var viewPortWidth1 = document.body.clientWidth;

另外通过resizeTo和resizeBy两个函数可以修改窗口的大小,resizeTo把窗口大小修改为参数表示的大小,而resizeBy在原有基础上修改参数表示的大小,如下代码:

1 //调整窗口大小为100X100
2 window.resizeTo(100, 100);
3 //调整窗口长宽各增大100
4 window.resizeBy(100, 100);

和上一节提到的moveTo和moveBy一样,resizeTo和resizeBy同样也可能会被浏览器禁用,而且这两个方法只对最外层window起作用,不支持内部框架。

 

欢迎批评指正。

posted @ 2012-08-06 08:10  GyyCyy.Xap  阅读(1246)  评论(0编辑  收藏  举报