系统归纳总结js与jquery宽高API

  js中获取各种宽高的API比较纷杂,再加上网上对某些API的表现众说纷纭,而且浏览器之间也存在差异,所以急需系统总结,把脑袋里搅在一起的属性方法归类;

目录:

一、window对象下的距离API

二、document对象下的API

三、Event对象内的坐标信息

四、element.getBoundingClientRect()

五、jQuery中的宽高API

---------------------------------------------------------------------------------------------------------------

一、window对象下的距离API

1、window.screen对象下的API

a、window.screen.width

b、window.screen.height

c、window.screen.availWidth

d、window.screen.availHeight

总结一下:

abcd表示的是设备屏幕的宽高,但cd项表示的是可用宽高,所以会排除系统任务栏的宽或高(取决于系统的任务栏是竖直还是横向),而ab则会将系统任务栏的高度/宽度计算其中

2、window下的API

a、winodw.screenTop

b、window.screenLeft

c、window.screenX

d、window.screenY

总结一下:

abcd项在浏览器中的表现一致。都表示浏览器窗口距离设备屏幕上/左的距离;

只不过在火狐浏览器中,当浏览器在全屏状态下的四个api的值都为-7;

在IE浏览器中,当浏览器在全屏状态下cd项的值为-7,b的值为0,但a的值为79,这是因为IE浏览器是从视口开始计算,所以这个79就是浏览器顶栏的高度;

而在其他浏览器中值为0(因为剩下的浏览器的内核都为webkit了)

兼容性问题,除IE外,其他浏览器全部兼容。

IE9、10、11对abcd四个api都支持,IE8下cd值为undefined

e、window.innerWidth

f、window.innerHeight

g、window.outerWidth

h、window.outerHeight

总结一下:

ef表示浏览器视口的宽高,滚动条不会影响其计算,换句话说,滚动条的距离也会被计算在其中。

gh表示浏览器窗口的宽高。

二、document对象下的API

a、document.body.clientWidth

b、document.body.clientHeight

总结一下:

ab表示元素的content+padding

滚动条会影响ab的值,表现为ab不计滚动条的宽高。

附:document.documentElement.clientWidth/Height,与ab项都能够获取浏览器的可视高度,但ab项必须在html混杂模式中才能够获取到正常的值

c、document.body.clientTop

d、document.body.clientLeft

总结一下:

cd项获取的是元素边框的高度,即cd项的值为border-top/border-left的值

e、document.body.offsetWidth

f、document.body.offsetHeight

总结一下:

ef项表示元素的content+padding+border,与内部元素是否超出无关

g、document.body.offsetLeft

h、document.body.offsetTop

总结一下:

gh项是一个很特殊的项,网上说法不一,MDN模糊不清,所以需要自己提炼

系统归纳总结js与jquery宽高API

 

 

 

 

经过检验:chrome与Firefox浏览器中存在差异,现将结果贴图如下

chrome浏览器:

系统归纳总结js与jquery宽高API

Firefox浏览器:

系统归纳总结js与jquery宽高API

可以看出同样的代码结果存在差异。

scrollLeft/Top定义是相对于offsetParent的偏移距离,offsetParent为最近的具有定位(除了position为static)的元素;若不存在则为body;

经检验,chrome与firefox的差异存在于当offsetParent为body时(仅以offsetLeft为例,offsetTop的表现与offsetLeft的表现一致):

Firefox是不将body的border计算在内的,但chrome会;所以chrome的offsetLeft为body的margin+border+padding+元素本身的margin,firefox则会忽略body的border

另外,若offsetParent不为body时:

offsetLeft为offsetParent的padding+元素本身的margin,这一点chrome与firefox无差别

i、document.body.scrollWidth

j、document.body.scrollHeight

总结一下:

如下图所示,当内部内容为未超出时,ij项的值与clientWidth/Height的值相同;

但是当内部内容的值超出时,计算的是内部元素的大小,包括content+padding+border+margin,下图中scrollWidth与scrollHeight相差的10px来自于margin-right被吃掉了(对margin-left设置多大的像素都无效)

附:10px黑色外边框为body元素,1px黑色边框为父盒子,1px红色外边框为子盒子,滚动条的宽/高为17px

系统归纳总结js与jquery宽高API

k、document.body.scrollLeft

l、document.body.scrollTop

总结一下:

kl项表示元素被滚动条卷曲的部分,还有一点,kl项也是可写的属性;

系统归纳总结js与jquery宽高API

三、Event对象内的坐标信息

a、event.clientX

b、event.clientY

c、event.pageX

d、event.pageY

e、event.x

f、event.y

g、event.offsetX

h、event.offsetY

i、event.screenX

j、event.screenY

总结一下

ab项表示相对于浏览器可视区域左上角(0,0)距离

cdef项与ab项表现一致

gh项表示相对于事件源(即事件作用的对象)左上角(0,0)的距离

ij项相当于设备屏幕左上角(0,0)的距离

 

系统归纳总结js与jquery宽高API

四、element.getBoundingClientRect()

该方法返回一个DOMRect对象,包含一组只读属性,除width与height外,剩余属性都表示元素相对于浏览器视口的距离。具体表现如下图所示。

系统归纳总结js与jquery宽高API

 

系统归纳总结js与jquery宽高API

五、jQuery中的宽高API

a、width()

b、height()

总结一下:

ab项在不传参的情况下,可以获取元素的宽高;

若ab项传入宽高数值,则会对元素的宽高进行修改,当然也可以传入修改函数,具体细节不载展开。

c、innerWidth()

d、innerHeight()

总结一下:

cd项获取元素的content+padding;与js原生clientWidth/Height获取到的值相同。

e、outerWidth()

f、outerHeight()

总结一下:

默认在不传值的情况下获取的是元素的content+padding+border;相当于js原生的offsetWidth/Height属性。

但如果我们为ef项传入Boolean的true,就可以获取元素的content+padding+border+margin

g、scrollLeft()

h、scrollTop()

总结一下:

gh项与原生的js属性scrollLeft/scrollTop相同,都表示被滚动条卷去的宽高;当然,也可以传入参数值来修改被滚动条卷去的宽高。

i、offset()

总结一下:

i项获取的是距离document的top,left,与getBoundingClientRect()函数获取的top,left值相同。(都是从元素的border的左上角到document的(0,0)点)

j、position()

总结一下:

获取距离父元素的top、left的值,从元素的margin的左上角到父元素的margin左上角