一文整理下所有关于dom 尺寸的属性、方法

有没有人跟我一样,根本记不清这些api或者记得很乱的?网上找了下,似乎也没找到类似的总结 的文章,所以就花时间整理了下,大家有需要时候翻下这篇即可。 话不多说,直接开始

一、元素盒模型相关属性

这些属性直接反映了元素在页面上的可视尺寸或与滚动相关的尺寸

属性 描述
element.offsetWidth 元素的布局宽度(包括:内容宽度 + 左右内边距 + 左右边框 + 垂直滚动条宽度(如果有))。返回值为整数,单位像素。
element.offsetHeight 元素的布局高度(包括:内容高度 + 上下内边距 + 上下边框 + 水平滚动条高度(如果有))。返回值为整数,单位像素。
element.clientWidth 元素的可见宽度(包括:内容宽度 + 左右内边距,但不包括边框、滚动条和外边距)。返回值为整数,单位像素。
element.clientHeight 元素的可见高度(包括:内容高度 + 上下内边距,但不包括边框、滚动条和外边距)。返回值为整数,单位像素。
element.scrollWidth 元素内容的实际宽度,包括看不见的溢出部分(内容宽度 + 左右内边距),不包含边框和滚动条。若内容未溢出,则等于 clientWidth
element.scrollHeight 元素内容的实际高度,包括看不见的溢出部分(内容高度 + 上下内边距),不包含边框和滚动条。若内容未溢出,则等于 clientHeight
element.scrollLeft 元素水平滚动条当前的滚动偏移量(相对于左侧),单位像素。可读可写,用于控制或获取当前滚动位置。
element.scrollTop 元素垂直滚动条当前的滚动偏移量(相对于顶部),单位像素。可读可写,用于控制或获取当前滚动位置。

二、视口和文档尺寸

用于测量整个页面或视口(浏览器可视区域)的尺寸。

属性/方法 描述
window.innerWidth 浏览器窗口的视口宽度(包括滚动条),单位像素。
window.innerHeight 浏览器窗口的视口高度(包括滚动条),单位像素。
document.documentElement.clientWidth <html> 元素的可视宽度(不包括滚动条),通常等于视口宽度。
document.documentElement.clientHeight <html> 元素的可视高度(不包括滚动条),通常等于视口高度。
document.documentElement.scrollWidth 整个文档的内容宽度,包括可滚动区域,不包含滚动条。
document.documentElement.scrollHeight 整个文档的内容高度,包括可滚动区域,不包含滚动条。
document.body.scrollWidth <body> 元素的内容宽度,通常等于文档宽度。
document.body.scrollHeight <body> 元素的内容高度,通常等于文档高度。

三、精确定位和尺寸测量方法

方法 描述
element.getBoundingClientRect() 返回一个 DOMRect 对象,包含元素相对于视口(viewport)的位置和尺寸:
  • x/lefty/top:元素边框盒(border box)左上角相对于视口的坐标。
  • widthheight:元素边框盒的宽度和高度(可能为小数)。
  • rightbottom:等于 left + widthtop + height
  • DOMRectList.fromRect() / new DOMRect() | 用于创建或转换矩形对象,较少直接使用,一般配合 getClientRects()
  • element.getClientRects() | 返回一个 DOMRectList,列出元素中每一行(inline 元素)或每个盒子(块级元素可能只有一个)的边框盒矩形。用于精细测量跨行或多盒布局的元素。

区别

  • getBoundingClientRect() 给出整个元素的外接矩形。
  • getClientRects() 则给出每一行/每个盒子的矩形,适合精细布局场景。

四、样式计算相关

有时我们需要获取元素通过 CSS 计算后的样式值,如 widthheightpaddingborder 等。

ts 复制代码
const style = window.getComputedStyle(element);
const width = style.width;     // 内容宽度(不含 padding、border),带单位字符串
const height = style.height;   // 内容高度(不含 padding、border),带单位字符串
const paddingLeft = style.paddingLeft; // 带单位字符串
const borderTopWidth = style.borderTopWidth; // 带单位字符串

注意getComputedStyle 返回的所有数值都是字符串(带单位),如果需要数值,需要 parseFloat(style.width)

五、使用场景及注意事项

  1. 布局测量 vs. 样式值

    • offset*client*scroll*getBoundingClientRect() 等返回的是布局计算后 的像素值,通常为数字(getBoundingClientRect() 返回小数)。
    • getComputedStyle 返回的是CSS 计算后的属性值,带单位字符串,代表"样式"而非最终布局尺寸。
  2. 触发回流(Reflow)

    • 访问 offsetWidthoffsetHeightclientWidthclientHeightscrollWidthscrollHeightgetBoundingClientRect() 等,会强制浏览器执行回流,重新计算布局,影响性能。
    • 在同一帧内,尽量合并多次读取与写入操作,或使用 requestAnimationFrameResizeObserver 来优化。
  3. 滚动条影响

    • offsetWidth 包含滚动条宽度;clientWidth 不包含;而 window.innerWidth 则包含。
    • 测量可视区域时,根据是否需要考虑滚动条选择合适的属性。
  4. 跨浏览器差异

    • 大部分现代浏览器都遵循相同标准,但在极少数老旧浏览器(IE8 及以下)中,部分属性或方法行为略有差异,应做兼容处理或使用 polyfill。

总结

类别 属性/方法 包含内容 单位/类型 触发回流 可写性
盒模型 offsetWidth 内容 + padding + border + 滚动条 整数(px) 只读
offsetHeight 内容 + padding + border + 滚动条 整数(px) 只读
clientWidth 内容 + padding 整数(px) 只读
clientHeight 内容 + padding 整数(px) 只读
滚动 scrollWidth 内容 + padding 整数(px) 只读
scrollHeight 内容 + padding 整数(px) 只读
scrollLeft --- 整数(px) 读/写
scrollTop --- 整数(px) 读/写
视口/文档 window.innerWidth 视口宽度(含滚动条) 整数(px) 只读
window.innerHeight 视口高度(含滚动条) 整数(px) 只读
documentElement.clientWidth <html> 可视宽度(不含滚动条) 整数(px) 只读
documentElement.clientHeight <html> 可视高度(不含滚动条) 整数(px) 只读
documentElement.scrollWidth 文档内容宽度 整数(px) 只读
documentElement.scrollHeight 文档内容高度 整数(px) 只读
定位/测量 getBoundingClientRect() 边框盒位置 & 大小(小数) DOMRect 只读
getClientRects() 每行/盒子边框盒矩形列表 DOMRectList 只读
样式 getComputedStyle() CSS 计算后所有样式值(带单位字符串) CSSStyleDeclaration 只读
相关推荐
雯0609~2 分钟前
js:循环查询数组对象中的某一项的值是否为空
开发语言·前端·javascript
bingbingyihao7 分钟前
个人博客系统
前端·javascript·vue.js
尘寰ya8 分钟前
前端面试-HTML5与CSS3
前端·面试·css3·html5
最新信息10 分钟前
PHP与HTML配合搭建网站指南
前端
前端开发张小七24 分钟前
每日一练:3统计数组中相等且可以被整除的数对
前端·python
天天扭码38 分钟前
一杯咖啡的时间吃透一道算法题——2.两数相加(使用链表)
前端·javascript·算法
Hello.Reader43 分钟前
在 Web 中调试 Rust-Generated WebAssembly
前端·rust·wasm
NetX行者1 小时前
详解正则表达式中的?:、?= 、 ?! 、?<=、?<!
开发语言·前端·javascript·正则表达式
流云一号1 小时前
Python实现贪吃蛇三
开发语言·前端·python
liangshanbo12151 小时前
深入讲解 CSS 选择器权重及实战
前端·css