不同浏览器获取DOM元素的各种高度

一:HTML中各种高度

一:介绍

不止一次被HTML中各种高度和宽度搞晕了,搞的每次做项目时都要去查相关的资料。趁着有时间好好把这块的资料整理一下,以被以后使用。

下面是一张W3C中Window对象属性图。从图中我们可以看到有关高度和宽度的几个属性,他们分别是innerHeight,innerWidth,outerHeight,outerWidth, pageXOffset,pageYOffset,screenLeft,screenTop,screenX,screenY。下面我们一个个来验证他们各代表什么。

windw属性

二:innerHeight、innerWidth、outerHeight、outerWidth

innerHeight,innerWidth:返回窗口的文档显示区的高度和宽度(不包括菜单栏、工具栏以及滚动条的高度)。IE不支持这些属性,它用document.documentElement(html元素)或者document.body(与IE版本有关)的clientWidth和clientHeight代替。在各个浏览器测试效果如下:

  • 谷歌效果
    谷歌
  • IE9+效果
    IE9+
  • IE8效果
    IE8
  • IE7效果
    IE7
  • IE5效果
    IE5
  • FF效果
    FF

查看上图可知除了IE9以下不支持innerHeight属性,其余版本浏览器均支持。只是在不同的浏览器中有稍许区别。所有的浏览器均支持document.documentElement.clientHeight与document.body.clientHeight属性。只不过在IE5中document.documentElement.clientHeight为0。所以要兼容所有浏览器获取文档显示区高度和宽度可用以下代码。

    lyq.getClientHeight = function(){
        var clientHeight = Math.max(document.body.clientHeight, document.documentElement.clientHeight);
        return clientHeight;
    }

outerHeight,outerWidth:返回窗口的外部高度和高度。IE9以下不支持该属性,其余浏览器支持该属性。但是在谷歌浏览器中outerHeight与innerHeight、outerWidth与 outerWidth返回相同的值即窗口的文档显示区的高度和宽度,而非浏览器窗口的大小。但是在其它浏览器中如FF,Safari返回浏览器窗口本身的尺寸。

screenLeft,screenTop,screenX,screenY:声明了窗口的左上角在屏幕上的的 x 坐标和 y 坐标。

screenLeft,screenTop在不同浏览器下的测试。

  • 谷歌效果
    谷歌
  • IE效果
    IE
  • FF效果
    FF
  • QQ效果
    QQ
  • UC效果
    UC

经过观察可以发现screenTop,screenLeft除了在火狐上不支持以外,在其它浏览器上均支持。只不过在IE和QQ浏览器上是计算文档显示区距离屏幕的坐标,而谷歌,UC是计算整个浏览器距离屏幕的坐标(包含菜单栏,工具栏等)。具体情况还要视浏览器定。

    clientWidth = height + padding-left + padding-right - scrollbar.width(对大部分浏览器)
    clientHeight = 同clientWidth
    clientTop = border-top
    clientLeft = border-left
    横向滑动条的高度 = height + padding-top + padding-bottom - clientHeight
    横向滑动条的宽度 = width + padding-left + padding-right
    垂直滑动条的高度 = height + padding-top + padding-bottom
    垂直滑动条的宽度 = width + padding-left + padding-right - clientWidth
    
    offsetHeight:对于IE6,IE7,IE8以及最新的FF,谷歌,在元素上都是clientHeight + 滚动条高度 + 边框
    offsetWidth:同offsetHeight。
    offsetTop = margin-top + top(相对于父窗口)
    offsetLeft = margin-left + left(相对于父窗口)
    
    scrollHeight = padding-top + padding-bottom + 内容margix box的高度。这个与滚动条无关,是内容的实际高度。
    scrollWidth = 同scrollHeight。
    在浏览器中的区别在于:
    IE6,IE7认为scrollHeight是网页内容的实际高度,可以小于clientHeight。
    FF,Chrome认为scrollHeight是网页内容高度,最小值是clientHeight。
    注:以上都是对一般元素而言,body和documentElement的clientHeight,offsetHeight和scrollHeight在各个浏览器中的计算方式又不同。在所有的浏览器中,如果你想获取整个视窗的高度,你要用documentElement.clientHeight,
因为body.clientHeight是由它的内容决定的。
    FF19
    在body上设置overflow:scroll就是设置浏览器的滚动条,导致body.clientHeight永远等于body.scrollHeight。
    body
    clientHeight = body.padding + body.height(css设置或内容撑的)
    offsetHeight = clientHeight + body.border
    scrollHeight == clientHeight;
    documentElement
    clientHeight = window视窗高度 - scrollbar.height
    offsetHeight = body.offsetHeight + body.margin;
    scrollHeight >= clientHeight
    元素上
    offsetHeight = padding + border + height
    clientHeight = padding + height - scrollbar.height
    scrollHeight >= clientHeight
    结果分析:FF认为scrollHeight的最小高度是clientHeight
    
    Chrome
    body
    clientHeight = body.padding + body.height(css设置或内容撑的)
    offsetHeight = body.clientHeight + bodt.border
    scrollHeight = body.padding + 内容的高度(与height样式无关) 最小值为clientHeight
    documentElement
    clientHeight = window视窗高度 - 滚动条高度
    offsetHeight = body.offsetHeight + body.margin
    scrollHeight = 内容的高度(与body上的height无关)
    元素上
    offsetHeight = padding + border + height
    clientHeight = padding + height - scrollbar.height
    scrollHeight >= clientHeight
    
    Safari5
    body
    clientHeight = body.padding + body.height(CSS或内容撑的);
    offsetHeight = body.clientHeight + border;
    scrollHeight = body.padding + 内容的高度(与height样式无关),但最小值是documentElement.clientHeight。
    documentElement
    clientHeight = window窗口大小 – 滚动条大小
    offsetHeight = body.offsetHeight + body.margin
    scrollHeight= 内容的高度(与body上的height无关),但最小值是documentElement.offsetHeight。
    
    IE8
    在IE8下,滚动条的大小是17个像素。
    body
    clientHeight= body.padding + body.height(css设置或内容撑大)
    offsetHeight = body.clientHeight + body.border
    scrollHeight = 内容的高度(与body上的height无关),但最小值是clientHeight。
    documentElement
    clientHeight = 窗口大小(除去滚动条后)
    offsetHeight = clientHeight + 滚动条大小 + body.border
    scrollHeight= 内容的高度(与body上的height无关),但最小值是body.offsetHeight+ margin。
    元素上
    offsetHeight = padding + border + height。
    clientHeight = padding + height - scrollbar.width。
    scrollHeight >= clientHeight
    从结果分析IE8认为scrollHeight>=clientHeight。
    offsetLeft = 元素border左上角到画布原点的距离 或 到offsetParent的borderbox顶部的距离。
    
    IE7
    在IE7中,body上设置的滚动条并不是窗口的滚动条,这个需要注意。
    body
    clientHeight= body.padding + height(css设置或内容撑大)– body上的滚动条。
    offsetHeight= clientHeight + 滚动条的大小+body.border。
    scrollHeight=   内容的高度(与body上的height无关)。
    documentElement
    clientHeight = window视窗大小(与滚动条的有无无关)
    offsetHeight = clientHeight。
    scrollHeight = body.offsetHeight + border.margin
    元素
    offsetHeight = padding + border + height。
    clientHeight = padding + height - scrollbar.width。
    scrollHeight = padding + 内容margin box的高度
    从结果分析,IE7认为scrollHeight可以小于clientHeight。
    offsetLeft = 元素border box左上角到父容器(不是offsetParent)的borderbox左上角的距离。
    
    IE6
    在IE6中,与IE7类似, body上设置的滚动条并不是窗口的滚动条。
    body
    clientHeight = body.padding + body.height
    offsetHeight = body.clientHeight + body.border + body上滚动条大小。
    scrollHeight =内容的高度(与body上的height无关)。
    documentElement
    在IE6中,与IE7类似,虽然body上设置的滚动条并不是窗口的滚动条,但它的clientHeight和offsetHeight还算与其它浏览器想统一。
    clientHeight = 窗口大小(除去窗口滚动条大小后)
    offsetHeight =clientHeight + body.border
    scrollHeight = body.offsetHeight + body.margin
    元素
    offsetHeight = padding + border + height。
    clientHeight = padding + height - scrollbar.width。
    scrollHeight = padding + 内容margin box的高度
    从结果分析,IE6认为scrollHeight可以小于clientHeight。
    
    scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离
    scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离
    
    Event对象属性
    clientX:相对于可视区域的x坐标。
    clientY:相对于可视区域的y坐标。 
    screenX:相对于用户屏幕x坐标。
    screenY:相对于用户屏幕的y坐标。
    
    IE特有属性
    offsetX:鼠标相对于目标事件的父元素的内边界在x坐标的位置
    offsetY:鼠标相对于目标事件的父元素的内边界在y坐标的位置
    x:设置或获取鼠标指针位置相对于父文档的y坐标。同clientX
    y:设置或获取鼠标指针位置相对于父文档的y坐标。同clientY 
    
    说明:event.clientX返回事件发生时,mouse相对于客户窗口的x坐标,event.X也一样。但是如果设置事件对象的定位属性值为relative,event.clientX不变,而event.x返回事件对象的相对于本体的坐标。火狐下用pageX,pageY代替x与y属性。

说了这么多,我们来看看jQuery中是如何处理这些差异的(jQuery中的event对象重新封装了)

    offset():获取匹配元素在当前视口的相对偏移,返回的对象包含两个整型属性:top和left。只对可见元素有效。
    offsetParent():返回最近的定位祖先元素。
    position():获取匹配元素相对父元素的偏移,返回的对象包含两个整型属性:top和left。
    scrollTop():获取匹配位置相对滚动条顶部的偏移,此方法对可见和隐藏元素均有效。同JS中scrollTop。
    scrollLeft():获取匹配位置相对滚动条左侧的偏移,此方法对可见和隐藏元素均有效。同JS中scrollLeft。
    event.pageX:鼠标相对于文档的左边缘的位置。
    event.pageY:鼠标相对于文档的上边缘的位置。
    innerHeight():获取匹配元素内部区域的高度(含padding,不含border)
    innerWidth():同innerHeight();
    outerHeight(options):默认为false,包含padding和边框;为true,margin也计算在内。
    outerWidth(options):同outerHeight(options)。
    height():返回内容高度,不含padding。
    width():同height();
    css("height"):返回的数值带有"px"。而height()则没有。
    css("width"):返回的数值带有"px"。而width()则没有。
    说明:height()总是返回内容宽度,不管CSS box-sizing 属性值。height('value')设置的容器宽度是根据CSS box-sizing 属性来定的,将这个属性值改成border-box,将造成这个函数改变这个容器的outerHeight(false),而不是原来的内容高度。
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值