js操作浏览器窗口及元素大小

1、窗口位置 

(1)获取窗口位置   

     窗口对象对应的是window对象。在window对象中使用属性screenTop、screenLeft、screenY和screenX(单位为像素)两组属性来表示窗口相对于屏幕上边和左边的位置。

    明明只是表示两个变量,为什么会有两组属性?那是因为在各个浏览器中,对这两组属性的支持有所不同,有的浏览器只支持其中的一组,例如,IE只支持ScreenTop和ScrennLeft,Firefox只支持screenX和screenY;有的同时支持两组,例如,Safari、Opera。其中最特殊的就是Opera浏览器,它同时支持这两组属性,但screenX和screenY表示的却并不是窗口相对于屏幕上边和左边的位置。因此,为了获取跨浏览器窗口位置的代码,应该先尝试使用screenTop和screenLeft,然后在使用screenX和screenY,代码如下:

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

 

     另外需要说的一点是,如果window对象表示的是页面中的框架时,在IE和Opera中screenLeft和ScreenTop这两个属性表示的是从屏幕左上角到window对象表示的页面的可见区域的距离,而不是最外层的窗口到屏幕左上角的距离。但在Firefox、Safari和Chrome中,则不论window对象代表的是否是内部框架,screenX和screenY始终代表最外层的window对象相对于左上角的距离,也就是top.screenX和top.screenY。因此,不可能精准的跨浏览器获取每个窗口的位置,只能获取最外层窗口的位置:

   

 var leftPos = (typeof top.screenLeft === "number") ? top.screenLeft : top.screenX;
 var topPos = (typeof top.screenTop === "number") ? top.screenTop : top.screenY;

     

    (2)改变窗口位置 

     使用moveTo( )和moveBy( )这两个方法,可以将窗口移动到一个新位置。它们都是接受两个参数,moveTo()方法的两个参数代表新位置的坐标;moveBy( )方法的两个参数代表偏移的位置,第一个表示窗口在水平方向上移动的像素数,第二个参数表示窗口垂直方向上移动的像素数。例如:

    

    /*将窗口移动到(150,360)*/
    window.moveTo(150,360);

    /*将窗口向下移动100px*/
    window.moveBy(0,100);

 

     对于这两个方法需要注意的是:

     (1)这两个方法可能会被浏览器禁用,在IE7及更高版本和Opera中默认就是禁用的。

     (2)这两个方法只能在最外层window对象也就是top对象中使用,不能用于内部框架

 

2、窗口大小   

     IE9+和其他主流浏览器都提供了下面的四个属性来表示浏览器窗口的尺寸:

     innerWidth:表示该容器中页面视图区的宽度(减去边框)

     innerHeight:表示该容器中页面视图区的高度(减去边框)

     outerWidth:表示浏览器窗口自身的宽度(在框架中也适用)

     outerHeight:表示浏览器窗口自身的高度(在框架中也适用)

 

     在Opera中outerWidth和outerHeight两个属性,表示的单个标签页对应的浏览器窗口的大小。在Chrome中上面的两组属性相同,都表示视口的大小,而不是浏览器窗口的大小。

     在IE8及更早的浏览器中,没有提供获取浏览器窗口的尺寸的属性。但它通过DOM提供了页面可见区域的相关信息,并且这些信息,在其他浏览器中都可以使用。document.documentElement.clientWidth 和 document.documentElement.clientHeight 中保存了页面视口的宽度和高度。而在IE6的混杂模式下,则需要通过document.body中的相应属性去获取。

     在跨浏览器的情况下,虽然不能获取窗口的大小,但可以获取视口的大小,在不兼容IE6混杂模式的情况下,可以使用下面的代码:

    var viewWidth = (typeof window.innerWidth === "number") ? window.innerWidth : document.documentElement.clientWidth;
    var viewHeight = (typeof window.innerHeight === "number") ? window.innerHeight : document.documentElement.clientHeight;

 

     对于移动设备,window.innerHeight 和 window.innerWidth 保存和可见视口,而移动IE不支持这两个属性,但在document.documentElement.clientHeight  和 document.documentElement.clientWidth 中保存这同样的属性。但在其他浏览器中,后面的这两个属性表示的是整个页面布局视口,也就是页面渲染后的实际大小。而IE把后面的这两属性,保存在document.body.clientWidth和document.documentElemtn.clientHeight中。

 

     使用 resizeTo( ) 和 resizeBy( )两个方法可以调整窗口的大小,resizeTo( )方法接收两个参数,新的宽度和高度; resizeBy( )方法也接收两个参数,新窗口和元窗口的宽度和高度差。例如:

     

    /*将窗口调整到300*300*/
    window.resizeTo(300,300);
    /*将窗口扩大的100*50*/
    window.resizeBy(100,50);

 

 

 

3、元素大小

     

     获取或设置元素大小的属性和方法,不属于DOM的规范,但各个浏览器都已经支持。

 

     3.1偏移量 

     

     通过下面的4个属性(都以像素计)可以或得元素的偏移量:

     offsetHeight:元素在垂直方向上占用的空间大小。包括元素的上下边框和滚动条(如果有),但不包括外边距。

     offsetWidht:元素在水平方向桑占用的空间的大小。同上。

     offsetLeft:元素的左外边框到包含元素的左内边框的距离

     offsetTop:元素的上外边框到包含元素的上内边框的距离

     

     另外,还有一个offsetParent 属性,指向包含该元素的引用。offsetParent属性与ParentNode属性不一定相等,例如,<td>元素的offsetParent属性指向的就是他的祖先元素<table>。

     通过offsetTop、offsetLeft和offsetParent属性,通过不断的向上循环叠加,可以基本准确的获取元素的偏移量,例如:

     /*获取元素的偏移量*/
    function getElementLeft(elem){
        var actualLeft = elem.offsetLeft,
            current = elem.offsetParent;
        while(current != null){
            actualLeft += current.offsetLeft;
            current = current.offsetParent;
        }
        return actualLeft;
    }

    function getElementTop(elem){
        var actualTop = elem.offsetTop,
            current = elem.offsetParent;
        while(current != null){
            actualTop += current.offsetTop;
            current = current.offsetParent;
        }
        return actualTop;
    }

 

 

     上面的两个函数,通过不断的叠加offsetLeft 和 offsetTop 值,获取相对精确(不包括所有的的边框的宽度)的元素相对于页面的偏移量。

 

注:这4个属性是只读的

 

     3.2 客户区大小

     

     元素的客户区大小指的是元素的内容,及其内边距占据的空间的大小。使用下面的两个属性表示:

     clientWidth:元素内容区域加左右内边距的宽度

     clientHeight:元素内容区域加上下内边距的宽度

 

     注:这两个属性是只读的

 

     3.3 滚动大小

     

     滚动大小指的是包含滚动内容的元素的大小。使用下面的4个属性表示:

     scrollWidth:在没有滚动条时,表示内容元素的高度,和width属性相同;在有滚动条时,包含滚动条和隐藏部分的总高度。

     scrollHeight:在没有滚动条时,表示内容元素的宽度,和height属性相同;在有滚动条时,包含滚动条和隐藏部分的总宽度。

     scrollLeft:被隐藏在内容区左侧的像素数。通过设置这个属性,可以改变元素的滚动位置。

     scrollHeight:被隐藏在内容区上方的像素数。通过设置这个属性,可以改变元素的滚动位置。

 

    scrollWidth 和 scrollHeight 属性主要用来确定元素内容的实际大小。例如,带有滚动条的页面的高度是 documen.documentElement.scrollHeight。但对于不包含滚动条的页面,在各个浏览器中 scrollHeight 和 scrollWidth 与 clientWidth 和 clientHeight 表示的宽高有交错,为了准确的获取文档的总高度,应该使用这两组属性较大的一个。例如,下面的代码:

     

    /*获取文档的高度*/
    var docHeight = Math.max(document.documentElement.scrollHeight,
                            document.documentElement.clientHeight);
    /*获取文档的宽度*/
    var docWidth = Math.max(document.documentElement.scrollWidth,
                            document.documentElement.clientWidth);

 

     scrollLeft和scrollTop属性既可以确定当前元素的滚动状态,也可以用来设置元素的滚动位置。例如,当元素不是顶部时,设置它滚动到顶部:

     /*设置元素返回顶部*/
    function scrollToTop(elem){
        if(elem.scrollTop != 0){
            elem.scrollTop = 0;
        }
    }

 

     3.4 确定元素的大小

     浏览器为每个元素提供了一个getBoundingClientRect( )方法,这个方法返回一个矩形对象,包含:left,top,right 和 bottom 属性,这些属性给出了元素相对于浏览器中的视口的位置。但在IE8及以前的浏览器中认为文档的坐上角的坐标是(2,2),而IE9+和其他浏览器则认为是(0,0)。因此,在使用的时候,需要首先检测文档左上角的左边。另外,在一些浏览中不支持getBoundingClientRect( )方法,这是可以使用元素的offsetLeft、offsetHeight属性,以及文档的scrollLeft和scrollTop属性来获取元素相对于视口的top、left、bottom和right属性。综上,可以使用下面的函数来实现跨浏览器获取元素的 rect 对象:

  function getBoundingClientRect(elem){
        var scrollTop = document.documentElement.scrollTop;
        var scrollLeft = document.documentElement.scrollLeft
        if(elem.getBoundingClientRect){
            if(typeof arguments.callee.offset != "number"){
                var temp = document.createElement("div");
                temp.style.cssText = "positon:absolute;left:0;top:0;";
                document.body.appendChild(temp);
                arguments.callee.offset = -temp.getBoundingClientRect().top - scrollTop;
                document.body.removeChild(temp);
                temp = null;
            }
            var rect = elem.getBoundingClientRect();
            var offset = arguments.callee.offset;
            return {
                left : rect.left + offset,
                right : rect.right + offset,
                top : rect.top + offset,
                bottom : rect.bottom + offset
            }
        }else{
            var actualLeft = getElementLeft(elem);
            var actualTop = getElementTop(elem);
            return {
                left : actualLeft - scrollLeft,
                right : actualLeft + elem.offsetWidth - scrollLeft,
                top : actualTop - scrollTop,
                bottom : actualTop + elem.offsetHeight - scrollTop

            }
        }

    }

 

   

     

 

参考资料:《javaScript高级程序设计》

 

 

 

 

 

转载于:https://my.oschina.net/haihen/blog/656375

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值