原生 js 中的各种宽高以及位置的获取

最近在用原生的 js 来实现一些交互特效,写的时候发现这些宽度和高度的获取真的是太常用了
而且获取他们的方法不止一个两个,上网一搜发现有好多,看得我眼花缭乱的
于是我自己做了一个归纳,方便以后快速查阅

对于移动端,一般要统一初始化视口宽高缩放比例

1
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>

###

##

一、全局类的宽高获取:

屏幕分辨率宽度和高度的获取:

  • 宽度:window.screen.width
  • 高度:window.screen.height

屏幕可用工作区宽度和高度的获取:

  • 宽度:window.screen.availWidth
  • 高度:window.screen.availHeight

浏览器应用程序窗口宽度和高度的获取(整个浏览器程序):

  • 宽度:window.outerWidth
  • 高度:window.outerHeight

浏览器视口宽度和高度的获取(包括滚动条):

  • 宽度:window.innerWidth
  • 高度:window.innerHeight

浏览器视口宽度和高度的获取(不包括滚动条):

  • 宽度:document.documentElement.clientWidth
  • 高度:document.documentElement.clientHeight

文档实际内容宽度和高度的获取:

  • 宽度:document.body.clientWidth
  • 高度:document.body.clientHeight

二、DOM 元素宽度和高度的获取

对于每个 DOM 元素,均有 6 个获取它们的宽高的方法

  • offsetWidth, offsetHeight: 分别负责获取 DOM 元素的宽度和高度,包括所有 border 和 padding
  • clientWidth, clientHeight: 分别负责获取 DOM 元素的宽度和高度,不包括 border 和滚动条,但包括 padding
  • scrollWidth, scrollHeight: 分别负责获取 DOM 元素的宽度和高度,如果有滚动条的话,会包括那些暂时在滚动区外不可见的内容。

具体情况如下图:

三、DOM 元素位置的获取:

  • offsetTop, offsetLeft:分别负责获取元素相对于父元素的上偏移和左偏移
  • scrollTop, scrollLeft:分别负责获取元素相对于父元素的上滚动距离和左滚动距离
  • clientTop, clientLeft:分别负责获取元素的上、左两个 border 的厚度(这个其实不是获取元素位置的,之所以摆出来,是因为它容易跟前面两个混淆)

具体情况如下图:

201211040853289748.jpg

下面还有一张更加清晰的图:

四、通过 getBoundingClientRect 获取元素位置和大小

除了以上两种方法,目前在 js 中还有另一种方法也可以比较好的获取 DOM 元素的位置和大小,就是通过 getBoundingClientRect 方法来获取
该方法会返回一个 DOMRect 对象

1
var rect = dom.getBoundingClientRect();

然后通过该对象,可以获得以下属性:

  • rect.width 元素宽度
  • rect.height 元素高度
  • rect.left 元素左边相对于视口原点的横向 X 轴距离
  • rect.right 元素右边相对于视口原点的横向 X 轴距离
  • rect.top 元素顶部相对于视口原点的纵向 Y 轴距离
  • rect.bottom 元素底部相对于视口原点的纵向 Y 轴距离

具体情况如下图:

五、浏览器当前滚动位置的获取:

  • window.pageXoffset:获取当前浏览器横向滚动条的位置
  • window.pageYoffset:获取当前浏览器纵向滚动条的位置
  • window.scrollX:同 pageXoffset,是 pageXoffset 的别名
  • window.scrollY:同 pageYoffset,是 pageYoffset 的别名

注:在 IE9 以前,不支持该方法,适用于 IE8 及更早版本的 IE 浏览器的方法如下:

  • document.documentElement.scrollTop:获取当前浏览器垂直滚动条的位置
  • document.documentElement.scrollLeft:获取当前浏览器水平滚动条的位置

六、鼠标位置的获取:

  • offsetX, offsetY:获取鼠标当前位置相对于当前焦点元素的横向 X 轴距离和纵向 Y 轴距离
  • clientX, clientY:获取鼠标当前位置相对于浏览器视口原点的横向 X 轴距离和纵向 Y 轴距离
  • pageX, pageY:获取鼠标当前位置相对于浏览器页面文档流原点的横向 X 轴距离和纵向 Y 轴距离
  • screenX, screenY:获取鼠标当前位置相对于屏幕原点的横向 X 轴距离和纵向 Y 轴距离

具体情况如下图:

下面这张图更好的阐释了 pageX 和 pageY: