refer :

https://developer.mozilla.org/en-US/docs/Web/API/CSS_Object_Model/Determining_the_dimensions_of_elements

先说说 box sizing

分 2 个

一个叫 content-box, 一个叫 border-box

content-box 是像外发展的

padding 和 border 都在 div 外面. (margin 当然也在外面)

border-box 是向内发展的

border 和 padding 都在 div 内.  (注意 :margin 依然是在外面哦)

这 2 种写法,造就了我们在获取 div width 的时候经常会拿到不同的值.

下面讲讲

offset width,

client width,

window.getComputedStyle(elem).getPropertyValue('width'), (简称 computed width)

getBoundingClientRect().width (简称 rect width)

假设:

b = border left right,

p = padding left right,

d = div width

1. offset width 的算法是 border to border

content box 的情况下 b10, p10, d100 = 120

border box, b10, p10, d100 = 100

因为 border box 是向内发展嘛. d100 已经包含了 b10 p10 了丫.

2. client width 的算法是 padding to padding 扣掉 scroll bar width

content box 的情况下 b10, p10, d100 = 110  (border 不算在内)

border box, b10, p10, d100 = 100 (包含在内了丫)

注意 :如果有 scroll bar 就需要拿上面的答案在减去 scroll bar 的 width 哦!

3.computed width 就是 div 计算后的 width

content box 和 border box 的唯一区别是 content box 需要扣掉 scroll bar, border box 不需要扣.

4. rect width 和 offset width 算法是一样的,唯一的区别是会计算 scale

下面在说说 img 和 canvas

这 2 个 element 都有 width 属性, 普通 div 是没有 width 属性的。

所以我们也可以通过 img.width 或者 canvas.width 来获取 width 值.

来看看它的算法.

img

img 的特色之一是它绝对不会有 scroll bar.

所以 content-box, border box 情况下都不需要顾虑到 scroll bar 的影响.

img width 的算法是 可见图的 width

content-box 是向外扩展的, 所以 padding border 都不可能影响到可见图.

border-box 的 padding border 则会影响到可见图的 width, 所以要扣除 padding 和 border 哦。

canvas

canvas 的特色之一也是它不可能有 scroll bar.

另一个特色是它不理会 border-box

https://stackoverflow.com/questions/53575931/why-box-sizing-is-not-working-with-width-height-attribute-on-canvas-element

所以它不会被 padding border 影响到。

总结 :

content 向外
border 向内
offset = border to border
client = padding to padding - scroll bar
rect width = offset + scale
computed style = content box 需要扣掉 scroll bar, border box 不需要扣, firefox 很奇葩, content 也不会扣.

img width = no scroll bar + 可见图
canvas = no box-sizing + no scroll bar

box-sizing 和 dom width的更多相关文章

  1. echarts报错Can't get dom width or height

    echarts图无法显示 一直报错Can't get dom width or height 原因:显示echarts图的div要设置宽高 报错前: <div class="left_ ...

  2. 解决Echarts+<el-tab-pane>的警告:Can't get DOM width or height

    1 问题描述 环境: Chrome 87 Element-Plus Vue3.0.5 <el-tab>+<el-tab-pane>中使用Echarts 警告如下: 2 代码 & ...

  3. 切换不同的echarts时,出现图标缩小,报警告,Can’t get dom width or height!

    出现这样的原因是因为,在切换的时候,图表所对应的标签还没有显示出来,最好将代码放在$nextick里面执行,并且,采用使用v-if进行切换 转载:https://www.pianshen.com/ar ...

  4. CSS3与页面布局学习总结(二)——Box Model、边距折叠、内联与块标签、CSSReset

    一.盒子模型(Box Model) 盒子模型也有人称为框模型,HTML中的多数元素都会在浏览器中生成一个矩形的区域,每个区域包含四个组成部分,从外向内依次是:外边距(Margin).边框(Border ...

  5. Box Model,边距折叠,内联和块标签,CSSReset

    一.盒子模型(Box Model) 1.1.宽度测试 1.2.溢出测试 1.3.box-sizing属性 1.4.利用CSS画图 二.边距折叠 2.1.概要 2.2.垂直方向外边距合并计算 三.内联与 ...

  6. CSS3与页面布局学习笔记(二)——盒子模型(Box Model)、边距折叠、内联与块标签、CSSReset

    一.盒子模型(Box Model) 盒子模型也有人称为框模型,HTML中的多数元素都会在浏览器中生成一个矩形的区域,每个区域包含四个组成部分,从外向内依次是:外边距(Margin).边框(Border ...

  7. 深入理解DOM事件类型系列第三篇——变动事件

    × 目录 [1]删除节点 [2]插入节点 [3]特性节点[4]文本节点 前面的话 变动(mutation)事件能在DOM中的某一部分发生变化时给出提示,这类事件非常有用,但都只能使用DOM2级事件处理 ...

  8. 深入理解DOM事件类型系列第二篇——键盘事件

    × 目录 [1]类型 [2]顺序 [3]按键信息[4]应用 前面的话 鼠标和键盘是电脑端主要的输入设备,上篇介绍了鼠标事件,本文将详细介绍键盘事件 类型 键盘事件用来描述键盘行为,主要有keydown ...

  9. 深入理解DOM事件类型系列第一篇——鼠标事件

    × 目录 [1]类型 [2]顺序 [3]坐标位置[4]修改键[5]相关元素[6]鼠标按键[7]滚轮事件[8]移动设备 前面的话 鼠标事件是web开发中最常用的一类事件,毕竟鼠标是最主要的定位设备.本文 ...

随机推荐

  1. Linux下一台服务器Redis主从复制(master-slave)配置

    主从概念 ⼀个master可以拥有多个slave,⼀个slave⼜可以拥有多个slave,如此下去,形成了强⼤的多级服务器集群架构 master用来写数据,slave用来读数据,经统计:网站的读写比率 ...

  2. python进阶之 线程编程

    1.进程回顾 之前已经了解了操作系统中进程的概念,程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程 ...

  3. python线程、协程、I/O多路复用

    目录: 并发多线程 协程 I/O多路复用(未完成,待续) 一.并发多线程 1.线程简述: 一条流水线的执行过程是一个线程,一条流水线必须属于一个车间,一个车间的运行过程就是一个进程(一个进程内至少一个 ...

  4. Scrapy框架的学习(6.item介绍以及items的使用(提前定义好字段名))转载https://blog.csdn.net/wei18791957243/article/details/86259688

      在Scrapy框架中的items.py的作用   1.可以预先定义好要爬取的字段     items.py import scrapy     class TencentItem(scrapy.I ...

  5. wysiwyg 富文本编辑器(附带图片上传功能)

    Fist: 需要的文件 font 文件夹下面的也是需要的哟 Then: 引入文件 <link href="bootstrap/css/bootstrap.css" rel=& ...

  6. sql 小技巧

    declare @pids varchar(max)='' ),pid)+','+@pids from product where pname like '%red%' select @pids

  7. [openjudge-搜索]城堡问题(The Castle)

    题目描述 描述 图1是一个城堡的地形图.请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大.城堡被分割成mn(m≤50,n≤50)个方块,每个方块可以有0~4面墙. 输入 程序从标准输入设备 ...

  8. Mysql关于时间排序的问题

    SELECT * FROM table_name WHERE deleted = 0 order by create_time DESC 当用户使用DESC(降序时),最终得到的结果集,时间早的在前面 ...

  9. 【Bcftools】合并不同sample的vcf文件,通过bcftools

    通过GATK calling出来的SNP如果使用UnifiedGenotype获得的SNP文件是分sample的,但是如果使用vcftools或者ANGSD则需要Vcf文件是multi-sample的 ...

  10. Docker run命令参数整理

    Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] -d, --detach=false 指定容器运行于前台还是后台,默认为false -i, - ...