六维教程

Element clientHeight属性

介绍

只读属性 Element.clientHeight 就是一个专门用来“量内部可使用空间”的尺子。

如果你把 HTML 元素想象成一个 “带泡沫内衬的快递箱”:

  • 外箱壁:border(边框)。
  • 泡沫内衬:padding(内边距)。
  • 箱子里面实际的空腔:内容区域。

clientHeight 量的就是:从箱子里面“顶部的泡沫表面”到“底部的泡沫表面”的距离。

它的精确公式是:内容高度 + 顶部内边距 + 底部内边距

它不包含上下边框(border)、外边距(margin)。而且,如果这个元素有水平滚动条,滚动条会占用箱子内部的空间,所以 clientHeight 会把滚动条的高度扣除掉!

alt text

注意事项

元素陷阱

两种情况会让 clientHeight0

行内元素

元素是 display: inline(行内元素,如 <span>),即使你在 CSS 里给 <span> 写了 height: 200px;,浏览器也会直接无视

因为行内元素没有“块级盒子”的概念,它们像文字一样流式排布,浏览器不把它们当成独立的“矩形区域”来测量。

网页上看起来有内容的 <span>,你用代码去读它的 clientHeight,永远是 0

不显示元素

在 CSS 渲染引擎里,display: none 代表这个元素完全从文档流中删除了,没有生成任何“布局盒子”在内存里,自然无法测量高度。

注意区分visibility: hidden;opacity: 0; 是会正常返回高度的,因为它们在内存里依然占位,只是肉眼看不见而已。

如果你遇到 clientHeight0,请先去开发者工具(F12)里看这个元素的Computed 样式,检查它的 display 属性是不是 inline 或者 none

时间陷阱

刚修改 style 立马去读是错的!

box.style.height = '200px';
console.log(box.clientHeight); // 你可能会得到 0 或者旧的高度!

修改 CSS 后,浏览器需要重新回流(Reflow)和重绘,这需要几毫秒的时间。如果你在同一个同步代码块里立刻读取,浏览器还没算完。

解决办法是用 setTimeout 或者 requestAnimationFrame 延迟读取:

box.style.height = '200px';
requestAnimationFrame(() => {
    console.log(box.clientHeight); // 现在拿到的才是计算后的真实高度!
});

精度陷阱

clientHeight规范规定它必须返回整数(integer)(单位像素,四舍五入)。如果你在移动端或屏幕缩放比例下,它可能会丢失精度。

如果你在做动画或精准拖拽,且需要极度精确的浮点数(带小数点的),请使用 element.getBoundingClientRect().height(这个方法包含边框,并且返回精确的小数)。

上一篇
Element input 事件