js内获取尺寸的属性or方法汇总
- Published on
- 发布于·预估阅读6分钟
- 标准盒模型
- box-size: border-box;盒模型 width包含了padding与border
- getBoudingClientRect()获取到的盒模型 兼容ie9+
- 事件对象event获取的位置属性
- offset定位系列位置属性
- 常用的一些场景
- Authors
- Name
- willson-wang
最近在项目中开发自定义滚动条组件,用到了拖拽及滚动,而用到拖拽及滚动的时候就不得不用到一些获取元素尺寸、滚动高度、鼠标位置、元素距离视口的位置等属性,于是写完组件之后抽了个时间总结了下,希望加深理解
标准盒模型
- clientWidth = width + padding - scrollBarWidth; 因为滚动条会在border内也就是padding所占位置
- offsetWidth = width + padding + border = clientWidth + border ,这里不需要另外加上scrollBarWidth的原因就是scrollBarWidth占用的宽度就是元素自身的width or padding
- scrollWidth元素可滚动宽度,不包含元素的margin与border,scrollLeft = ( srollWidth - clientWidth )之间的值 同理clientHeight offsetHeight scrollHeight是一样的
- scrollTop 属性可以获取或设置一个元素的内容垂直滚动的像素数。 注意是这个元素的顶部到它的最顶部可见内容(的顶部)的距离的度量,而不是到视口的高度
box-size: border-box;盒模型 width包含了padding与border
- offsetWidth = width;
- clientWidth = width - border - scrollBarWidth = offsetWidth - border - scrollBarWidth
同理其它属性值是一样的
getBoudingClientRect()获取到的盒模型 兼容ie9+
- .width = offsetWidth;
- .height = offsetHeight;
- .left = 元素左边框到视口的左侧距离;
- .top = 元素上边框到视口的上侧距离;
- .right = .left + .width;
- .bottom = .top + .height
事件对象event获取的位置属性
- offsetX offsetY 相对于target元素边框的位置
- pageX pageY 相对于当前页面(整个文档)的左上角的位置 当有滚动条时包含了scrollTop and scrollLeft
- clientX clientY 相当于当前可视屏幕的左上角位置
offset定位系列位置属性
- offsetLeft: 获取当前元素左侧边框到offsetParent的左侧边框内侧距离
- offsetTop: 获取当前元素上侧边框到offsetParent的上侧边框内侧距离
- offsetParent: 指向最近的包含改元素的定位元素,如果没有定位元素则为最近的table or table cell or 根元素(标准模式下为 html;quirks 模式下为 body),当元素设置为dispaly:none 时 offsetParent为null
常用的一些场景
判断元素是否出现滚动条 根据scorllHeight、scrollWidth与clientHeight、clientWidth的大小关系来进行判断,因为二者获取到的宽高是相同的部分,所有没有滚条条时scrollHeight = clientHeight; scrollWidth = clientWidth; 判断水平方向滚动条 scrollWidth > clinetWidth 允许滚动的水平范围scrollLeft => scrollWidth - clientWidth 判断垂直方向滚条条 scrollHeight > clientHeight 允许滚动的垂直范围scrollTop => scrollHeight - clientHeight
拖拽 在mousedown的时候获取鼠标点击的当前位置 在当前屏幕内拖拽 disX = e.clientX - e.target.offsetLeft 或者直接写e.offsetX;
disY = e.clientY - e.target.offsetTop 或者直接写e.offsetY; 在整个文档内拖拽 disX = e.pageX - e.offsetX;
disY = e.pageY - e.offsetY; 在mousemove的时候 left = e.clinetX - disX; top = e.clinetY - disY;获取当前屏幕的尺寸 screenWidth = document.documentElement.clientWidth || document.body.clientWidth; screenHeight = document.documentElement.clientHeight || document.body.clientHeight;
监听window对象上的scroll事件时获取浏览器滚动条的scrollTop scrollTop = document.documentElement.scrollTop || document.body.scrollTop; scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
获取浏览器滚动条的宽度 第一种思路设置元素overflow为scroll,计算设置scroll之前的clientWidth与之后的clientWidth,之差就是滚动条的宽度,原因是clientWidth是不包含滚动条宽度的,且有滚动条之后滚动条会占据clientWidth的宽度;
function getScrollBar () {
var div = document.createElement('div'),
noScrollWidth,
scrollWidth;
div.style.width = '200px';
div.style.height = '300px';
div.style.position = 'absolute';
div.style.left = '99999px';
noScrollWidth = document.body.appendChild(div).clientWidth;
div.style.overflowY = 'scroll';
scrollWidth = div.clientWidth;
document.body.removeChild(div);
return noScrollWidth - scrollWidth;
}
第二个思路直接设置overflow:scroll,然后使用offsetWidth - clientWidth之差来获取滚动条的宽度,因为offsetWidth是包含滚动条的,而clinetWidth是不包含滚动条宽度的
function getScrollBar () {
var div = document.createElement('div'),
clientWidth,
offsetWidth;
div.style.width = '200px';
div.style.height = '300px';
div.style.overflowY = 'scroll'
div.style.position = 'absolute';
div.style.left = '99999';
clientWidth = document.body.appendChild(div).clientWidth;
offsetWidth = div.offsetWidth;
return offsetWidth - clientWidth;
}