关于元素的尺寸(dimensions) 说明

在以往我都是对这些属性死记硬背,很少真正理解过,忘记了就查手册。看完本文我相信这种情况就不会再发生了。

元素占据的物理空间的尺寸
如果你需要获得元素占据的物理空间,那么使用offsetHeight和offsetWidth。
自然而然此物理空间必然包含的有:padding、滚动条、border。这两个属性与getBoundingClientRect()的height和width属性是一致的。
为了帮助理解请看下图:
 
元素内容的可视区域的尺寸
可视区域包含padding,但是不包含border、滚动条。此时请使用clientHeight和clientWidth。
为了帮助理解请看下图:
 
元素全部内容的尺寸
如果你要获取元素内容的真正大小,当然也包含那些不可见的内容,此时你需要使用scrollHeight/scrollWidth。
例如一张600*400的图片被包含在一个300*300的可滚动的容器元素内,那么scrollWidth将返回600,而scrollHeight将返回400
实测:
当元素存在滚动条时,chrome浏览器获取元素的scrollHeight有时候不准确!但是本文的例子是正确的,不知道怎么重现。
获取元素的真实尺寸
大部分场景,我们并不关心元素的全部内容的尺寸(window/document/body元素除外),最常用的恐怕还是获取元素占据的物理空间(offsetHeight/offsetWidth)。
比如对某段文字设置自定义的tooltip,这个时候需要获取目标元素的高度然后对tooltip进行定位。
不论是clientHeight还是offsetHeight它们都包含了padding,假设这段文字包含了100px的padding,这个tooltip的位置显然会极其的不准确。
因此获取元素的高度通常是需要去掉padding。
由于元素的style属性只能获取到内联样式的width/height,所以在IE中需要使用el.currentStyle.height/width,
而标准浏览器中使用window.getComputedStyle(el,null).width/height。
下面是我整理的园友Snandy的一个用户获取元素真实高度和宽度的方法 :


代码如下:

function getStyle(el) {
if(window.getComputedStyle) {
return window.getComputedStyle(el, null);
}else{
return el.currentStyle;
}
}
function getWH(el, name) {
var val = name === "width" ? el.offsetWidth : el.offsetHeight,
which = name === "width" ? ['Left', 'Right'] : ['Top', 'Bottom'];
// display is none
if(val === 0) {
return 0;
}
var style = getStyle(el);
for(var i = 0, a; a = which[i++];) {
val -= parseFloat( style["border" + a + "Width"]) || 0;
val -= parseFloat( style["padding" + a ] ) || 0;
}
return val;

}

使用脚本库往往能帮助我们解决一些棘手的问题,下面来看看jQuery的相关方法
jQuery.height()/jQuery.width()
返回一个整数,为匹配的jQuery对象集合中第一个元素的高度值。
注意此结果不关心盒式模型,不包含元素的padding。此方法等价于getWH(el,'height/width')
这个方法同样能计算出window和document的高度。
jQuery.innerHeight()/jQuery.innerWidth()
对比jQuery.height() /jQuery.width() 此结果包含padding,但是不包含border。
当元素el未设置border时,此方法等价于el.offsetHeight/offsetWidth
jQuery.outerHeight()/jQuery.outerWidth()
对比jQuery.height() /jQuery.width() 此结果包含padding和border,默认不包含margin。
当元素未指定margin时,此方法等价于el.offsetHeight/offsetWidth
可以传入一个bool变量来指定是否包含margin。
注意:
由于获取普通元素的全部内容的尺寸意义不大(某些元素除外如window、document、iframe等),
所以jQuery的这三个方法都未包含不可见区域。
小测试
下面是一个div设置了高度200px,padding为3px,border为1px,里面的图片为958*512

上面的值你都猜对了吗?

更新
又检查了下测试代码,scrollHeight在chrome下不准确的原因是使用了jQuery.ready(),而刚好测试的元素内部包含一张图片。
用过jQuery.ready()的都知道,此时DOM树已经加载完成,但是图片元素还没有完全加载, 因而chrome的处理方式是对的。
于是我就上例又测试了一遍:
在IE 6 / 8返回结果为522/519
chrome返回结果为189
Firefox有一点特殊,不断刷新页面会有两种结果出现:1)522;2)189,但是大部分情况是522
出现这种情况肯定与jQuery 1.6.2的ready函数的实现有关系。
不过就上述结果来看,是否可以推断jQuery.ready()在chrome中是最安全最快的。

clientHeight
offsetHeight
scrollHeight
jQuery.height()
jQuery.innerHeight()
jQuery.outerHeight()

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

参考资料

各情景下元素宽高的获取 by Snandy
Determining the dimensions of elements
Measuring Element Dimension and Location with CSSOM in Internet Explorer 9

(0)

相关推荐

  • 关于元素的尺寸(dimensions) 说明

    在以往我都是对这些属性死记硬背,很少真正理解过,忘记了就查手册.看完本文我相信这种情况就不会再发生了. 元素占据的物理空间的尺寸 如果你需要获得元素占据的物理空间,那么使用offsetHeight和offsetWidth. 自然而然此物理空间必然包含的有:padding.滚动条.border.这两个属性与getBoundingClientRect()的height和width属性是一致的. 为了帮助理解请看下图: 元素内容的可视区域的尺寸 可视区域包含padding,但是不包含border.滚动

  • js获取浏览器高度 窗口高度 元素尺寸 偏移属性的方法

    如下所示: screen.width screen.height screen.availHeight //获取去除状态栏后的屏幕高度 screen.availWidth //获取去除状态栏后的屏幕高度 一.通过浏览器获得屏幕的尺寸 二.获取浏览器窗口内容的尺寸 //高度 window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight //宽度 window.innerWidth

  • 用JavaScript获取DOM元素位置和尺寸大小的方法

    在一些复杂的页面中经常会用JavaScript处理一些DOM元素的动态效果,这种时候我们经常会用到一些元素位置和尺寸的计算,浏览器兼容性问题也是不可忽略的一部分,要想写出预想效果的JavaScript代码,我们需要了解一些基本知识. 基础概念 为了方便理解,我们需要了解几个基础概念,每个HTML元素都有下列属性 offsetWidth clientWidth scrollWidth offsetHeight clientHeight scrollHeight offsetLeft clientL

  • js获取隐藏元素的宽高

    获取隐藏元素(display:none)的物理尺寸 问题及场景 假如我们有这样一个输入框,点击能展开选择.如下图: 在这里输入框和下方的展开区域是分离的,独立的两个控件!初始状态下面的可选框是隐藏的(ng-show=false) 展开区域中可折叠组件accordion(对应图中省份,排序字段,短消息部分)的高度是随着数据自适应撑开,点击accordion折叠收缩时有一个高度变化的动画效果! 在计算accordion的高度时却无法获取数据节点元素的高度,导致accordion的高度为0,无法折叠!

  • javascript实现在指定元素中垂直水平居中

    本章节介绍一下如何实现未知宽高的元素在指定元素下实现垂直水平居中效果,下面就以span元素为例子,介绍一下如何实现span元素在div中实现水平垂直居中效果,代码如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <style type="text/css"> #box{ width:200px; height:150px; backgroun

  • javascript获取隐藏元素(display:none)的高度和宽度的方法

    js获取可见元素的尺寸还是比较方便的,这个可以直接使用这个方法: 复制代码 代码如下: function getDefaultStyle(obj,attribute){ // 返回最终样式函数,兼容IE和DOM,设置参数:元素对象.样式特性 return obj.currentStyle?obj.currentStyle[attribute]:document.defaultView.getComputedStyle(obj,false)[attribute];} 但是如果这个元素是隐藏(dis

  • jQuery之尺寸调整组件的深入解析

    1:尺寸调整组件(Resizable)组件可以使选定的DOM元素变成可调整尺寸的对象,即可以通过拖动调整手柄来改变其尺寸大小.$(".selector").resizeable(options);简单实例: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio

  • 纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示

    下文以span元素为例子,介绍一下如何实现span元素在div中实现水平垂直居中效果,代码如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>我们</title> <s

  • Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法

    需求: 1. 页面部分元素的尺寸需要根据实际打开时浏览器尺寸进行设置: 2. 页面打开后,调节浏览器窗口大小时需要动态调节部分元素的尺寸: 需要注意的点: window.onresize只能在项目中一处进行引用触发,如果在多个地方进行引用触发,会导致只有1个触发事件生效. 解决"多个组件都需要触发"的方案只能是通过一个地方触发后通过组件间通信进行触发. (以调节class为myDiv的div的宽度为例) 解决需求1的方案: html <template> <div c

  • Selenium元素的常用操作方法分析

    本文实例讲述了Selenium元素的常用操作方法.分享给大家供大家参考,具体如下: Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等.这个工具的主要功能包括:测试与浏览器的兼容性--测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上.测试系统功能--创建回归测试检验软件功能和

随机推荐