前言
标准盒子模型和ie盒子模型的区别
一个盒子由四个部分组成:content、padding、border、margin
可以通过box-sizing: content-box|border-box|inherit:
来修改盒模型的类型
- content-box: 默认值,标准盒模型,宽高只设置content的宽高
- border-box: 怪异盒模型,宽高设置的是content+padding+border的宽高
- inherit: 从父元素继承box-sizing属性的值。
在标准盒模型的情况下,设置元素的宽高,只会影响元素的content区域,实际的总高度和宽度,需要加上padding,border和margin。
在怪异盒模型的情况下,元素的宽高是content+padding+border的总和。
盒模型的类型不同,会影响offset系列、client系列、scroll系列属性的计算方式。 在实际开发中,为了确保跨浏览器的一致性,开发者通常会使用标准盒模型,并在CSS中设置box-sizing: border-box;,这样元素的宽度和高度就会包括内边距和边框,使得布局更加直观和容易控制。
- 接下来使用element代指HTML元素。
- 文中提到的所有属性没有说明,默认是只读的
- 先从应用场景出发,看看element下面的offset系列、client系列、scroll系列属性的区别
应用场景
Determining the dimensions of elements(确定一个元素的大小)
当想要确认元素的宽高时有几种属性可以选择,但是我们很难确认使用哪个属性才是最适合的。本文将帮助你做出正确的选择。
1. 元素占用了多少空间?
如果你需要知道元素总共占用了多少空间,包括可视内容、滚动条(如果有的话)、内边距和边框的宽度,你会使用 offsetWidth
和 offsetHeight 属性,大多数情况下,当元素没有什么形状上的变化时,他们与 getBoundingClientRect()的宽高一致。但是如果发生变化,offsetWidth 和 offsetHeight 将返回元素的布局宽高,而 getBoundingClientRect() 将返回实际渲染的宽高。例如:如果元素的宽 width:100px,变化 transform:scale(0.5),此时 getBoundingClientRect() 将返回宽 50,而 offsetWidth 将返回宽 100.
element.offsetHeight和element.offsetWidth这一对属性指的是元素的border+padding+content的宽度和高度,不包括margin。
2. 显示内容尺寸是多少?
如果你需要知道展示区域内容占用了多少空间,包括内边距但是不包括边框、外边距或者滚动条,你会使用clientWidth和clientHeight属性:
3. 内容有多大?
如果你想要知道内容区域的实际大小,而不局限于可见区域的话,你会使用 scrollWidth
和scrollHeight属性。即使使用了滚动条仅有部分内容可见,这两个属性仍会返回元素的完整内容宽高
例如,一个 300x300 像素 的滚动盒子里放置了一个 600x400 像素的元素,scrollWidth 将会返回 600,scrooHeight 返回 400.
offset系列,client系列,scroll系列的属性
offset系列属性
element.offsetHeight和element.offsetWidth
element.offsetHeight和element.offsetWidth这一对属性指的是元素的border+padding+content的宽度和高度,不包括margin。
element.offsetLeft 和 element.offsetTop
element.offsetLeft 和 element.offsetTop 这一对属性指的是元素相对于其父元素(offsetParent)的偏移量,包括边框。
- 如果当前元素的父级元素没有进行CSS定位(position为absolute或relative),offsetParent为body.
- 假如当前元素的父级元素中有CSS定位,offsetParent取最近的那个父级元素。
- offsetLeft返回当前元素左上角相对于 HTMLElement.offsetParent 节点的左边界偏移的像素值。
- offsetTop返回当前元素相对于其 offsetParent 元素的顶部的距离。
参考链接:
HTMLElement.offsetLeft
HTMLElement.offsetTop
client系列的属性
element.clientWidth和element.clientHeight
返回元素内部的高度(单位像素),包含内边距padding,但不包括滚动条scroll、边框border和外边距margin。
element.clientLeft 和 element.clientTop
element.clientLeft
表示一个元素的左边框的宽度,以像素表示。如果元素的文本方向是从右向左(RTL, right-to-left),并且由于内容溢出导致左边出现了一个垂直滚动条,则该属性包括滚动条的宽度。
element.clientTop
一个元素顶部边框的宽度(以像素表示)。不包括顶部外边距或内边距。
参考链接:
Element.clientLeft - MDN Element.clientTop
scroll系列属性
scrollWidth和scrollHeight
scrollWidth和scrollHeight返回元素的完整内容宽高,包括由于滚动而未显示在屏幕中的一部分。例如,如果一个元素的内容大于其容器,那么scrollHeight将大于clientHeight。
element.scrollLeft 和 element.scrollTop
- scrollLeft和scrollTop属性可以获取或设置一个元素的滚动条位置(水平和垂直方向)。 获取滚动距离
- 这对属性是可读写(可被重新赋值)
参考链接: