当前位置: 首页 > 科技观察

一道关于Box-Sizing的字节面试题

时间:2023-03-13 19:13:02 科技观察

大家好,我是前端西瓜哥。今天说说很久以前面试字节跳动遇到的一道CSS面试题。有如下HTML和CSS样式,两个橙色区域的宽高是多少?<样式>.box{宽度:10px;高度:10px;边框:1px实心#000;填充:2px;边距:2px;背景颜色:橙色;}.content-box{box-sizing:content-box;}.border-box{box-sizing:border-box;}

本题考查CSS盒模型。CSS盒模型CSS盒由4个区域组成,从内到外依次为:Contentbox:内容盒,用于显示内容(innerHTML),宽度和高度默认由width和height控制。但是如果box-sizing(盒子模型的意思)属性被设置为一个非content-box的值,应用的规则就会改变。Paddingbox:填充框,可以通过padding属性设置padding的大小。borderbox:边框框,可以通过border属性设置边框的大小和样式。Marginbox:边距框,通过margin属性设置边距的大小。需要注意的是,边距不考虑盒子的实际尺寸。例如,框的背景颜色不会覆盖边距的范围。你可以把margin想象成多个盒子之间的空气墙,用来控制盒子之间的距离。我们可以使用box-sizing来控制应用到哪个框的宽度和高度。下面就详细说说吧。标准盒模型(content-box)对于现代浏览器,元素默认应用标准盒模型。当然,你也可以如下显式设置。.box{box-sizing:content-box;}在标准盒模型中,width和height属性用于设置Contentbox盒子。言归正传,先来看第一个橙色块的宽高。.box{宽度:10px;高度:10px;边框:1px实心#000;填充:2px;边距:2px;background-color:orange;}.content-box{box-sizing:content-box;}
内容的宽度为10px。padding为2px,这个padding是padding-left、padding-right、padding-bottom、padding-left的简写属性。框的宽度需要同时考虑padding-left和padding-right。然后左右各有两个边框条。框模型中不计算边距。所以对于盒子模型来说,宽度是16px(10+2*2+1*2),高度也是16px。这是答案吗?不会,因为我们要找的橙色块的宽高其实就是Padding框的宽高,而这个块不包括黑色边框的边框线。所以我们的第一个橙色块是14px宽和高。让我们再深入一点。如果我们设置边框颜色为透明,比如border:1pxsolidrgb(0,0,0,0),你认为橙色块的宽高是多少?答案是16px。在其顶部添加边框之前,背景颜色将填充整个框。如果边框变得透明,它会露出原本会覆盖的橙色区域的一部分。怪异的盒子模型(border-box)也叫IE模型。早期版本的IE浏览器并没有遵循CSS标准。width和height用于设置Border框的宽度和高度,而不是Content框的宽度和高度,导致在不同的浏览器中有不同的行为。毫无疑问是浏览器bug。后来CSS3引入了box-sizing,让开发者可以选择使用哪种盒子模型,提供了更好的灵活性。通过下面的设置,我们可以将元素的盒子模型设置为一个奇怪的盒子模型。.box{box-sizing:border-box;}在怪异的盒子模型中,width和height属性用于设置Borderbox盒子。即我们直接设置元素对应的框的宽高,然后通过padding和border计算出内容框。让我们看看如何计算标题中第二个橙色块的宽度和高度。.box{宽度:10px;高度:10px;边框:1px实心#000;填充:2px;边距:2px;background-color:orange;}.border-box{box-sizing:border-box;}盒模型的宽度为10px,减去border的2px(两个1px的border左右两行),Border框的计算宽度为8px。高度计算是一样的。所以这道题的答案是:第一个橙色块的宽高是14px,第二个橙色块的宽高是8px。结束对于DOM元素,我们有两种盒模型:box-sizing:content-box:width和height对Content盒生效的标准盒模型是默认盒模型;box-sizing:border-box:width和height奇怪的盒子模型对Borderbox有效。另外,box-sizing只支持以上两个值,没有padding-box这种盒子模型,不要想太多。