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

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

元素占据的物理空间的尺寸
如果你需要获得元素占据的物理空间,那么使用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

时间: 2024-09-21 04:40:11

关于元素的尺寸(dimensions) 说明_javascript技巧的相关文章

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

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

JS实现设置ff与ie元素绝对位置的方法_javascript技巧

本文实例讲述了JS实现设置ff与ie元素绝对位置的方法.分享给大家供大家参考,具体如下: function Show_menu(liid,divid) { var li=document.getElementById(liid); var div=document.getElementById(divid); div.style.left=getLeft(li)+140+'px'; div.style.top= getTop(li)+'px'; var tt=div.style.top; div

JavaScript简单获取页面图片原始尺寸的方法_javascript技巧

本文实例讲述了JavaScript简单获取页面图片原始尺寸的方法.分享给大家供大家参考,具体如下: 这里通过Image()对象获取原始宽高 这种方式就没有那么麻烦,直接new一个Image()对象,然后把img的src赋值给他即可获取. var img = new Image(); img.src = $("#target").attr("src"); if(img.complete){ alert('width:'+img.width+',height'+img.

用Javascript 获取页面元素的位置的代码_javascript技巧

下面的教程总结了Javascript在网页定位方面的相关知识. 一.网页的绝对大小和相对大小 首先,要明确两个基本概念. 一张网页的全部面积,就是它的绝对大小.通常情况下,网页的绝对大小由内容和CSS样式表决定. 网页的相对大小则是指在浏览器窗口中看到的那部分网页,也就是浏览器窗口的大小,又叫做viewport(视口). 下图中央的方框就代表浏览器窗口,每次只能显示一部分网页. (图一 网页的绝对大小和相对大小) 很显然,如果网页的内容能够在浏览器窗口中全部显示(也就是不出现滚动条),那么网页的

原生js实现给指定元素的后面追加内容_javascript技巧

复制代码 代码如下: var header1 = document.getElementById("header"); var p = document.createElement("p"); // 创建一个元素节点 insertAfter(p,header1); // 因为js没有直接追加到指定元素后面的方法 所以要自己创建一个方法 function insertAfter( newElement, targetElement ){ // newElement是要

js函数名与form表单元素同名冲突的问题_javascript技巧

今天在导出Excel的时候用了Form 表单的input hidden 来区分导出和搜索.开始的时候js中的onClick事件的函数名 和 hidden 中的 id 命名一样.结果导致报错:调用函数的那一行对象不支持此属性. 找了很长时间都找不出原因,开始的时候一直以为是写错了某个字母,才发现js函数根本没有执行.后来没有办法直接调用了别的函数,发现就有用了,认为是函数名的原因,改了函数名才有用了.然后再将input中的id改成很函数名一样,又出现报错了.在没有下例验证之前,还一直以为是Thin

Javscript删除数组中指定元素并返回新数组_javascript技巧

把数组中某个值删除,并返回新数组,需要遍历旧数组找到要删除的元素 复制代码 代码如下: /* * 删除数组中指定值 */ Array.prototype.remove=function(value){ var len = this.length; for(var i=0,n=0;i<len;i++){//把出了要删除的元素赋值给新数组 if(this[i]!=value){ this[n++]=this[i]; }else{ console.log(i);//测试所用 } } this.leng

JS事件Event元素(兼容IE,Firefox,Chorme)_javascript技巧

好的程序往往是兼容多种浏览器的. 看下例: 一个简单的button,我们可以通过点击下面的button直接通过event对象得到当前的button元素,兼容多浏览器.当然,其他元素事件的写法同. <input type="button" id="btn" name="btn" value="button1" onclick="getEvent(event)"/>

javascript元素动态创建实现方法_javascript技巧

本文实例讲述了javascript元素动态创建实现方法.分享给大家供大家参考.具体分析如下: document.write只能在页面加载过程中才能动态创建 可以调用document的createElement方法来创建具有指定标签的DOM对象,然后通过调用元素的appendChild方法将 新创建元素添加到相应的元素下 举例如下: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-e