Jinuss's blog Jinuss's blog
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 《Vue》
    • 《React》
    • 《Git》
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

东流

前端可视化
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 《Vue》
    • 《React》
    • 《Git》
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • HTML

    • 常用meta整理
    • Particles.js粒子效果库
    • Vanta.js3D背景库
    • lorem 乱数假文
    • 图片裁剪插件cropper.js
    • scrollIntoView 用法
    • 视图过渡动画
    • canvas自定义实现粒子动画
    • 一张图理解浏览器的位置和尺寸
    • HTML5 全屏讲解
    • 获取元素的宽高
      • 概述
      • 以例为证
        • style.width
        • clientWidth
        • scrollWidth
        • offsetWidth
        • getComputedStyle方法
        • getBoundingClientRect方法
      • 特殊情况
        • 旋转
        • 放大或缩小
    • 零宽字符
  • CSS

  • 浏览器

  • 页面
  • HTML
东流
2024-09-13
目录

获取元素的宽高

# 概述

在标准盒模型中,元素的总宽度由height、margin、border和padding来确定,其计算方式如下:

总宽度 = 内容宽度 + 左内边距 + 右内边距 + 左边框宽度 + 右边框宽度 + 左外边距 + 右外边距

那么每次获取元素的宽度就一定是获取这个总宽度吗?

# 以例为证

代码如下:

<style>
  .parent {
    margin: 100px auto;
    width: 400px;
    height: 400px;
    border: 1px dashed #438de8;
  }

  .children {
    height: 100px;
    width: 100px;
    border: 1px solid orange;
    background: red;
    padding: 10px;
    margin: 20px;
  }
</style>
<div class="parent">
  <div class="children" style="width:auto;"></div>
</div>
<script>
  const doms = {
    child: document.querySelector(".children"),
  };
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

浏览器的渲染结果如下图:

开发工具【元素-样式】显示如下图:

通常情况下,一个元素由浏览器绘制到屏幕上会经历三个阶段,构建 3 个 Tree:DOM Tree、CSS Tree和Layout Tree。在这三个阶段获取元素的宽度是不同的。

# style.width

元素的 style 属性返回的是一个CSSStyleDeclaration对象,是 Javascript 中用于表示元素的样式的对象,它允许读取和修改元素的内联样式。所以上面例子中style.width的值不是100px,若去掉内敛样式,则返回一个空的字符串

console.log(doms.child.style.width); // 'auto'
1

# clientWidth

clientWidth表示的是内容宽度+左右的Padding,可视区域的宽度

console.log(doms.child.clientWidth); // 358
1

# scrollWidth

当元素没有出现滚动条时,scrollWidth和clientWidth获取的是相同的值,如果元素出现滚动条,则scrollWidth表示的是内容实际的宽度

console.log(doms.child.scrollWidth); // 358
1

# offsetWidth

offsetWidth表示的是内容宽度+Padding+border 的宽度之和。这个宽度对应DOM Tree阶段元素的宽度。

console.log(doms.child.offsetWidth); // 360
1

# getComputedStyle方法

getComputedStyle方法返回的也是一个CSSStyleDeclaration对象,但是它是得到计算后的样式,其宽度是内容实际的宽度,不包括边距和边框。这个宽度对应CSS Tree阶段元素的宽度。

console.log(getComputedStyle(doms.child).width); // '338px'
1

# getBoundingClientRect方法

getBoundingClientRect() 方法返回一个 DOMRect 对象,其中包含元素的大小和相对于视口的位置。它提供的宽度包含了元素的实际显示区域,包括内边距、边框,但不包括滚动条宽度。这个宽度对应Layout Tree阶段元素的宽度。

console.log(doms.child.getBoundingClientReact().width); // 360
1

# 特殊情况

比如元素经过旋转或者放大缩小后呢,其宽度对应的是什么

# 旋转

只会影响getBoundingClientReact获取的宽度,因为这个方法本身就是获取包括元素最小的矩形的位置(偏移)和大小

# 放大或缩小

无影响

其它参考

编辑 (opens new window)
上次更新: 2024/09/13, 08:47:48
HTML5 全屏讲解
零宽字符

← HTML5 全屏讲解 零宽字符→

最近更新
01
GeoJSON
05-08
02
Circle
04-15
03
CircleMarker
04-15
更多文章>
Theme by Vdoing | Copyright © 2024-2025 东流 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式