不同浏览器获取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),而不是原来的内容高度。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统要求:Android1.5及以上 Opera Mini中国定制,打造口袋里的互联网,界面简约清新,浏览一触即达,搭载Opera自主强劲内核,纤小,急速,省流量! 欧朋浏览器在沉淀了一段时间后,终于在不久前发布了最新一代的浏览器,很多人会疑惑新欧朋浏览器究竟带来了什么:是核心的提升还是外观的改变?其实都不完全是,新欧朋浏览器带给我们的是从使用习惯上的颠覆,是一种对于旧的手机浏览器的颠覆,是一种我们从未有过的新的体验,那么接下来笔者就要展现它的不同之处。   从外观看,新欧朋浏览器精巧的外观更加符合触摸屏用户使用习惯,而简洁的风格依然保持了一贯的清新,这个在手机浏览器中尤为难得。而这次欧朋浏览器采用了新内核,不仅仅在顺畅度上有提升,在HTML5的性能上更是达到了新的高度。都说数据为王体验为皇,新欧朋浏览器在两方面都做到一种极致。   一、外观改变:带来超越安卓的体验   安卓与iOS系统相比存在一个不争的事实,那就是操作界面体验上的差异。这也是为什么安卓系统会在整体感觉少比iOS上了一点贵气。不过新欧朋浏览器却可以打破系统的限制,做出与iOS系统一样精美的界面和流畅的体验。尤其是精致的图标,让整体看起来非常的协调。 新欧朋浏览器统一了图标的样式,让人看起来非常的整齐,同时因为图标又经过设计,看起来特别的协调和美观。而发现频道利用了瀑布流的模式,让我们可以对内容进行一个非常好的预览。 新欧朋浏览器放弃了管理按钮,而采用了iOS特有的长按操作。摒弃一个大家熟悉的操作不容易。而引入了iOS长按操作后,让整个操作会更加的顺畅,也更加的人性化。长按图标后,会有震动提示,这时候我们就可以进行一些操作,包括:删除或合并同一文件夹。 图标管理简单了,可以让我们更加知道自己需要的内容在什么位置,而不至于太多图标而混乱不堪,真是非常贴心易于使用的小功能。   二、发现频道:发现惊喜原来这么简单   大家应该探索频道,对于一些新奇好玩的东西很容易着迷,这个也是它的魅力所在。新欧朋浏览器提供了一个新奇好玩的地方,那就是发现频道。我们不用去想怎么去发现新鲜事,热门事,好玩事。我们只需要选自己喜欢的内容即可。 发现频道采用的是一种瀑布流的模式,对于阅读和图片欣赏非常的方便和直观。尤其是对于图片来说,再适合不过。如果你还不知道现在发生了什么,那么新欧朋浏览器会带你进入一个奇妙的世界。   三、新内核:更快速度更强体验   这次的内核改变,可以说对于新欧朋浏览器来说意义重大,在对于HTML5的支持更是达到了前所未有的高度。同时提供的“越野模式”让访问速度可以提升数倍,而流量节省却可以高达90%以上。 访问WEB页面后,省流量非常明显,已经为我省去了87%的流量。而如果页面图片越多的话,省流量会更加明显。而欧朋浏览器也将快捷菜单放置到了右上角,这样给下方留出了更多的空间,而外观上也更加的美观。   总结:   相信大家看完上面的评测后,大家对于新欧朋浏览器有了一些了解,但是其实我只是介绍了几个比较突出的功能,而包括了一些细微上的调整变化,则需要大家在使用中去体验,我也相信这些将会给大家带来更多的惊喜。   新欧朋浏览器这次做到内外兼修,非常的不容易。我们可以看到一个秉承了清爽、快速和省流量的欧朋浏览器和一个新外观、新内核、新体验的欧朋浏览器的完美融合,而这个将会颠覆我们的体验,颠覆我们对手机浏览器的认识。(来源:泡椒网)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值