你知道offsetHeight、scrollHeight、clientHeight的区别吗?

简介: 前言offsetHeight、scrollHeight、clientHeight这三个属性我们经常在开发中遇到,如果小伙伴们没有经常使用的话,很容易把这些属性搞混,比如说什么窗口高度、元素高度、内容高度等等。当然,现在的前端框架很多时候帮我们封装了这些属性,但是我们也不能太过依赖框架,底层的原理我们还是需要了解的,今天就来理一理这三个属性分别代表什么?

1.盒子模型


介绍这三个属性之前先来了解一下CSS盒子模型,因为面试中如果遇到这道题,面试官通常也是想要考察你盒子模型的相关知识。


盒子模型顾名思义就是盒子的意思,盒子里面可以装很多东西。比如我们的div就可以比作一个盒子,那么组成一个完整的盒子主要包括下面几个部分:


  • width
  • height
  • padding
  • border
  • margin
  • box-sizing(用来区别正常盒模型和怪异盒子模型)


一个盒子大概由上面一些属性组成,盒子模型又分为了正常和模型和怪异和模型。


1.1 正常盒模型

我们借用一张图就可以很清楚的知道什么是正常盒模型:25.png

通过上图可以看出:宽度就是内容的宽度。当我们修改padding或者border属性时,盒子的总宽度会改变。


1.2 怪异盒子模型

同样,我们借助一张图来理解怪异盒子模型:27.png

28.png


结果解释:


最终offsetHeight = 150px,我们说过offsetHeight是获取元素的高度,上面代码中我们元素的高度设置为100px,但是offsetHeight却是150px,这就是因为正常盒子模型的宽度等于内容宽度的原因,实际上box1占据的宽度要更宽。


实际上offsetHeight = 100 + 20(padding) + 20(padding) + 5(border) + 5(border)


在实际项目中,为了获得更准确,或者最真实的元素宽度,我们需要把正常盒子模型转为怪异盒子模型,添加属性box-sizing:border-box.。


代码如下:

<style>
  .box1 {
    width: 100px;
    height: 100px;
    padding: 20px;
    margin: 30px;
    border: 5px solid yellow;
    box-sizing: border-box;
    background-color: #ccc;
  }
</style>


输出结果:


29.png

总结:offsetHeight = content+ padding + border


3.clientHeight


简单总结为一句话:获取元素的高度,包含padding。


这个属性和offsetHeight类似,唯一的区别就是它不包含border,具体来看代码演示。


代码如下:

<style>
.box2 {
  width: 100px;
  height: 100px;
  padding: 20px;
  margin: 30px;
  border: 5px solid yellow;
  box-sizing: border-box;
  background-color: #ccc;
}
</style>
<body>
  <div class="box1">盒子1</div>
  <div class="box2">盒子2</div>
</body>
<script>
  const box1 = document.getElementsByClassName("box1")[0];
  const box2 = document.getElementsByClassName("box2")[0];
  console.info("盒子1的offsetHeight",box1.offsetHeight);
  console.info("盒子2的clientHeight",box2.clientHeight);
</script>


输出结果:30.png

4.scrollHeight


简单总结为一句话:获取元素的高度,包含padding。


这个属性和clientHeight类似,都不包含border,那么具体有什么不一样呢,我们看代码演示。


代码如下:

<style>
  .box3 {
    width: 100px;
    height: 100px;
    padding: 20px;
    margin: 30px;
    border: 5px solid yellow;
    box-sizing: border-box;
    background-color: #ccc;
  }
</style>
<body>
  <div class="box1">盒子1</div>
  <div class="box2">盒子2</div>
  <div class="box3">盒子3</div>
</body>
<script>
  const box1 = document.getElementsByClassName("box1")[0];
  const box2 = document.getElementsByClassName("box2")[0];
  const box3 = document.getElementsByClassName("box3")[0];
  console.info("盒子1的offsetHeight", box1.offsetHeight);
  console.info("盒子2的clientHeight", box2.clientHeight);
  console.info("盒子3的scrollHeight", box3.scrollHeight);
</script>

输出结果:

31.png


可以看到scrollHeight和clientHeight输出结果一样,那么它们之间有什么区别呢?

其实它们的区别就一个:scrollHeight的高度需要更具内容的实际尺寸决定,比如我们修改一下我们的代码。

代码如下:

.box3 {
  width: 100px;
  height: 100px;
  padding: 20px;
  margin: 30px;
  border: 5px solid yellow;
  box-sizing: border-box;
  background-color: #ccc;
  overflow: auto;
}
<div class="box3">
  <div style="height: 300px;">盒子3</div>
</div>


输出结果:32.png

上段代码中我们在box3中添加了一个div,并且设置高度300px,此时的scrollHeight输出340px,也就代表我们的scrollHeight是需要根据实际的内容尺寸计算的。


总结:scrollHeight = 实际内容尺寸+ padding


总结


这三个属性虽然都很类似,但是每一个又有一些不一样的地方,总结起来就下面三点:

  • offsetHeight = 内容高度 + padding + border
  • clientheight = 内容高度 + padding
  • scrollHeight = 内容实际尺寸 + padding




相关文章
|
11月前
|
JavaScript
在 Vue 中处理组件选项与 Mixin 选项冲突的详细解决方案
【10月更文挑战第18天】通过以上的分析和探讨,相信你对在 Vue 中使用 Mixin 时遇到组件选项与 Mixin 选项冲突的解决方法有了更深入的理解。在实际开发中,要根据具体情况灵活选择合适的解决方案,以确保代码的质量和可维护性。
402 7
|
缓存 前端开发
前端代码整洁与规范之CSS篇
【4月更文挑战第2天】 前端代码整洁与规范之CSS篇
370 4
|
9月前
|
存储 程序员 编译器
C 语言中的数据类型转换:连接不同数据世界的桥梁
C语言中的数据类型转换是程序设计中不可或缺的一部分,它如同连接不同数据世界的桥梁,使得不同类型的变量之间能够互相传递和转换,确保了程序的灵活性与兼容性。通过强制类型转换或自动类型转换,C语言允许开发者在保证数据完整性的前提下,实现复杂的数据处理逻辑。
|
XML JavaScript 前端开发
Vue和React有什么区别
【8月更文挑战第28天】Vue和React有什么区别
994 0
|
10月前
|
数据采集 小程序 API
通义千问Qwen2.5-Coder 全系列来咯!强大、多样、实用
千问团队开源了强大的 Qwen2.5-Coder 系列模型,涵盖 0.5B 到 32B 六种尺寸,旨在推动开放代码模型的发展。该系列模型在代码生成、修复和推理等方面表现出色,支持多种编程语言,并在多个基准测试中达到 SOTA 水平。此外,Qwen2.5-Coder 还提供了丰富的应用场景,如代码助手、Artifacts 和 Interpreter,满足不同开发者的需求。
3607 106
|
11月前
|
应用服务中间件 Linux nginx
Mac os 安装 nginx 教程(success)
这篇文章是关于如何在Mac OS系统上使用Homebrew安装nginx及其依赖,并解决安装过程中可能出现的权限问题。
1405 0
Mac os 安装 nginx 教程(success)
|
10月前
|
数据采集 自然语言处理 搜索推荐
通义千问赋能CACA指南:构建智慧肿瘤诊疗新生态
本文探讨了如何利用阿里云通义千问大模型,结合中国抗癌协会(CACA)编撰的《中国肿瘤整合诊治指南》,打造新一代智能化临床决策支持系统。该系统通过分层架构设计,实现智能问答、临床决策支持和患者管理等功能,显著提升了医生的工作效率和治疗方案的科学性。
453 1
|
前端开发 JavaScript 中间件
React脚手架create-react-app简介
【8月更文挑战第13天】React脚手架create-react-app简介
538 4
|
SQL 安全 测试技术
【数据守护者必备】SQL数据备份与恢复策略全解析:从全量到日志备份,手把手教你确保企业信息万无一失的实战技巧!
【8月更文挑战第31天】数据库是企业核心业务数据的基石,为防止硬件故障、软件错误或人为失误导致的数据丢失,制定可靠的备份与恢复策略至关重要。本文通过一个在线购物平台的案例,详细介绍了使用 SQL Server 进行全量备份、差异备份及事务日志备份的方法,并演示了如何利用 SQL Server Agent 实现自动化备份任务。此外,还提供了数据恢复的具体步骤和测试建议,确保数据安全与业务连续性。
479 0
|
XML 前端开发 JavaScript
Vue vs. React:比较两大前端框架的特点与区别
Vue.js和React.js是目前前端开发中最受欢迎的两个JavaScript框架之一。虽然它们都用于构建现代、响应式的用户界面,但在细节和设计理念上存在一些重要的区别。在本博客中,我们将深入研究Vue和React之间的不同之处,以帮助您选择适合您项目需求的框架。
1873 0