盘点 DOM 四大家族那点儿dollar

215 阅读2分钟

记录 offset、client、scroll、event 家族中用来获取 dom 元素的各个属性以及差异。

offset 家族

口诀:获取元素自身的真实位置。

属性说明
offsetWidth / offsetHeight获取元素完整的宽高(包含 padding + border)
offsetParent获取元素最近的定位父级
offsetLeft / offsetTop获取元素外边框到定位父级内边框的距离

其中,offsetParent 是指:

  1. 如果元素自身为固定定位,则定位父级为 null;
  2. 如果元素自身为非固定定位,并且所有父级也都没有定位,此时定位父级为 body;
  3. body 自身的定位父级为 null。

client 家族

口诀:获取内容可视区域(视口)的真实宽高。

属性说明
clientWidth / clientHeight元素的内部宽高(含 padding,不含margin、border、滚动条)
clientLeft / clientTop表示一个元素的左边(顶部)边框的宽度

注意:内联元素以及没有 CSS 样式的元素的 clientWidth属性值为 0。

scroll 家族

口诀:获取元素里内容的真实宽高,以及内容到元素间的滚动位置距离。

属性说明
scrollWidth / scrollHeight获取元素里内容的真实宽高
scrollTop获取或设置元素的内容垂直滚动的像素数。
scrollLeft获取或设置元素滚动条到元素左边的距离。

相关链接:如何让子元素滚动到指定父窗口的指定位置

事件对象家族

事件触发时,浏览器会捕捉与事件相关的信息。其中,有三大坐标系:screenclientpage

具体属性如下:

属性说明
e.screenX(Y)触发点到电脑屏幕左 / 上的距离
e.clientX(Y)触发点到页面可视区域左 / 上的距离
e.pageX(Y)触发点相对于页面(body) 左 / 上的距离(包括了被卷去的body部分的长度)

其中,区分 clientX(Y)pageX(Y) 主要看窗口的拖动对数值的影响,clientX(Y) 会随着窗口拖动的变化而变化,pageX(Y) 固定值,与窗口拖动无关。

getBoundingClientRect

Element.getBoundingClientRect(),一个超级好用的方法。 返回元素的大小及其相对于视口的位置

rect.png

const dom = document.getElementById('app')

const info = dom.getBoundingClientRect()

// output =>
{
    bottom: 148.3125
    height: 500
    left: 221.6374969482422
    right: 721.6374969482422
    top: -351.6875
    width: 500
    x: 221.6374969482422
    y: -351.6875
}

box-sizing 中的属性值

补充一下 CSS 属性 box-sizing 的值,它们对应的 DOM 数值又是什么呢?

box-sizing:content-box: 元素的尺寸等于width/height + padding + border-width的总和。

box-sizing: border-box: 元素的的尺寸等于 width/height