一道关于 box-sizing 的字节面试题

简介: 前端西瓜哥

大家好,我是前端西瓜哥。今天讲讲我很久以前面试字节时遇到的一道 CSS 面试题。

有如下的 HTML 和 CSS 样式,问两个块橙色区域宽高分别为多少?

<style>
  .box {
    width: 10px;
    height: 10px;
    border: 1px solid #000;
    padding: 2px;
    margin: 2px;
    background-color: orange;
  }
  .content-box {
    box-sizing: content-box;
  }
  .border-box {
    box-sizing: border-box;
  }
</style>
<div class="box content-box"></div>
<div class="box padding-box"></div>

本题考查的是 CSS 盒子模型。

CSS 盒子模型

CSS 盒子组成由 4 个区域组成,从内到外依次为:

  • Content box:内容盒子,用于显示内容(innerHTML),默认通过 width 和 height 控制宽高。但如果 box-sizing(盒模型的意思)属性设置为非 content-box 值,运用的规则会发生改变。
  • Padding box:内边距盒子,通过 padding 属性可以设置内边距大小。
  • Border box:边框盒子,通过 border 属性可以设置边框大小及样式。
  • Margin box:外边距盒子,通过 margin 属性设置外边距大小。

image.png

需要注意的是,margin 不计入盒子的实际大小。比如盒子的背景色不会覆盖到 margin 的范围。你可以把 margin 当作多个盒子之间的空气墙,是用来控制盒子间的距离的。

我们可以通过 box-sizing 来控制 width 和 height 被应用到哪个盒子上,下面具体展开来说一说。

标准盒模型(content-box)

对于现代浏览器来说,元素默认应用标准盒模型。当然你也可以像下面这样做显式的设置。

.box {
  box-sizing: content-box;
}

标准盒模型中,width 和 height 属性用于设置 Content box 盒子

image.png

我们回到题目,先看看第一个橙色块的宽高。

.box {
  width: 10px;
  height: 10px;
  border: 1px solid #000;
  padding: 2px;
  margin: 2px;
  background-color: orange;
}
.content-box {
  box-sizing: content-box;
}
<div class="box content-box"></div>

content 的宽度为 10px。

padding 为 2px,这个 padding 是 padding-left、padding-right、padding-bottom、padding-left 的简写属性。盒子的宽需要将 padding-left 和 padding-right 都计算在内。

然后是左右两个 border 条。margin 不计算在盒模型中。

所以对于盒模型来说,宽度就是 16px(10 + 2 * 2 + 1 * 2),高度同理,也是 16px。

这个就是答案了吗?

并不是,因为我们要找到的橙色块的宽高,其实就是 Padding box 的宽高,这个块并不包括黑色的 border 边框线。所以我们的第一个橙色块宽高为 14px。

image.png

我们再深挖一下,如果我们给 border 颜色设置为透明,比如 border: 1px solid rgb(0, 0, 0, 0),你觉得橙色块宽高为多少?

答案是 16px。背景色会先填充整个盒子,然后再在其上添加 border。如果 border 变成透明了,就会将它原本覆盖的部分橙色区域显现出来。

image.png

怪异盒模型(border-box)

怪异盒模型,也叫 IE 模型。

IE 浏览器的早期版本没有遵循 CSS 标准,width 和 height 是用来设置 Border box 的宽高,而不是 Content box 的宽高,导致不同浏览器的表现不同,毫无疑问是个浏览器 bug。

后来 CSS3 引入了 box-sizing,让开发者可以选择使用哪种盒模型,提供更好的灵活性。通过下面的设置,我们可以将元素的盒模型设置为怪异盒模型。

.box {
  box-sizing: border-box;
}

怪异盒模型中,width 和 height 属性用于设置 Border box 盒子。即我们直接给元素对应的盒子设置了宽高,再通过 padding 和 border,才能计算出 Content box。

image.png

我们看看题目中第二个橙色块的宽高如何计算。

.box {
  width: 10px;
  height: 10px;
  border: 1px solid #000;
  padding: 2px;
  margin: 2px;
  background-color: orange;
}
.border-box {
  box-sizing: border-box;
}
<div class="box border-box">

盒模型宽为 10px,减去 border 的 2px(左右两条 1px 的边框线),计算出来的就是 Border box 盒子的宽度 8px。高度计算同理。

image.png

所以本题的答案是:第一个橙色块的宽高为 14px,第二个橙色块的宽高为 8px。

结尾

对于 DOM 元素来说,我们有两种盒模型:

  1. box-sizing: content-box:width 和 height 对 Content box 生效的标准盒模型,是默认的盒模型;
  2. box-sizing: border-box:width 和 height 对 Border box 生效的怪异盒模型。

另外,box-sizing 仅支持上面两种值,是没有 padding-box 这种盒模型的,不要想太多。

我是前端西瓜哥,一名喜欢分享前端技术的程序员,欢迎关注我的公众号。

相关文章
|
7月前
|
消息中间件 存储 监控
|
7月前
|
算法
字节面试官让我讲讲最小生成树,我忍不住笑了
字节面试官让我讲讲最小生成树,我忍不住笑了
|
7月前
|
存储 安全 Java
面试题:用过ThreadLocal吗?ThreadLocal是在哪个包下的?看过ThreadLocal源码吗?讲一下ThreadLocal的get和put是怎么实现的?
字节面试题:用过ThreadLocal吗?ThreadLocal是在哪个包下的?看过ThreadLocal源码吗?讲一下ThreadLocal的get和put是怎么实现的?
82 0
|
2月前
|
Arthas Kubernetes Java
字节面试:CPU被打满了,CPU100%,如何处理?
尼恩,一位拥有20多年经验的老架构师,针对近期读者在一线互联网企业面试中遇到的CPU 100%和红包架构等问题,进行了系统化梳理。文章详细解析了CPU 100%的三大类型问题(业务类、并发类、内存类)及其九种常见场景,提供了使用jstack和arthas两大工具定位问题的具体步骤,并分享了解决死锁问题的实战案例。尼恩还强调了面试时应先考虑回滚版本,再使用工具定位问题的重要性。此外,尼恩提供了丰富的技术资料,如《尼恩Java面试宝典》等,帮助读者提升技术水平,轻松应对面试挑战。
字节面试:CPU被打满了,CPU100%,如何处理?
|
2月前
|
Java API 对象存储
JVM进阶调优系列(2)字节面试:JVM内存区域怎么划分,分别有什么用?
本文详细解析了JVM类加载过程的关键步骤,包括加载验证、准备、解析和初始化等阶段,并介绍了元数据区、程序计数器、虚拟机栈、堆内存及本地方法栈的作用。通过本文,读者可以深入了解JVM的工作原理,理解类加载器的类型及其机制,并掌握类加载过程中各阶段的具体操作。
|
7月前
|
缓存 移动开发 前端开发
字节-2024最新前端面试题梳理-1
字节-2024最新前端面试题梳理-1
308 0
|
6月前
|
SQL 关系型数据库 MySQL
字节面试:MySQL自增ID用完会怎样?
字节面试:MySQL自增ID用完会怎样?
71 0
字节面试:MySQL自增ID用完会怎样?
|
6月前
|
存储 Java 容器
研二学妹面试字节,竟倒在了ThreadLocal上,这是不要应届生还是不要女生啊?
【6月更文挑战第1天】研二学妹面试字节,竟倒在了ThreadLocal上,这是不要应届生还是不要女生啊?
50 5
|
5月前
|
前端开发 数据挖掘
字节面试:领域、子域、核心域、通用域和支撑域怎么划分?
领域驱动设计(DDD)通过划分业务领域和子域简化复杂性。领域是业务问题的范围,子域是更小的专业部分。核心域代表业务的核心竞争力,如电商中的商品、订单和支付;通用域提供跨领域服务,如用户管理;支撑域支持核心功能,如物流、客服和数据分析。这种划分帮助团队专注关键业务,提高开发效率和软件对业务需求的契合度。
243 0
|
7月前
|
算法 Java 程序员
火爆Boss直聘的2023最牛字节Java面试手册!助你狂拿千份offer!
当下程序员现状 根据一些调查报告,可以了解到当下程序员的现状。 首先,从年龄分布来看,年轻的程序员占据了主导地位。 30岁以下的开发者占比最高,为81%,而40岁以上的开发者仅占3%。 这意味着,程序员这个行业在一定程度上是年轻化的,同时也面临着一些中年转行或者技术更新换代的问题。 在性别方面,男性程序员的比例在90%以上,女性程序员的比例较低。 这可能和传统观念中将程序员视为男性职业有关。然而,随着技术的普及和女性对计算机科学的兴趣逐渐提高,女性程序员的比例也在逐渐增加。 从职业发展来看,程序员的职业发展相对较慢。 虽然程序员的薪资普遍较高,但是工作压力也很大,需要不断学习和更
169 0