理解盒模型

36 阅读4分钟

新年了,祝各位前端佬们新的一年钞票够够的!代码想不写就不写!

98b9a8d586cc43f2a6248b86dab2de2b.gif

言归正传!今天来提一提另一种思路,来理解CSS中的盒模型。

话说还是以前不懂这块时,然后网上搜索,大部分文章都是先上一通Padding、Margin、Border、Content,然后搭上个IE怪异模式讲解,然后,就没了然后....😑😑😑😑

要是按上面的思路去走,想破脑袋没有理解那是啥意思。

IE都““走””多少年了,怎么还怪异模式呢?

image.png

直到看过W3C文档中的盒模型文本解释,[链接戳这里~](Box model (w3.org)),再加上阅读了张鑫旭大佬《CSS世界》书籍,总算能从逻辑上,自我解释的通了。

😈😈保命提要!!!!!!😈😈

所以,这里将自己理解的一些归纳,分享给各位前端大佬。有错误,请拍轻点!

1、什么是盒模型?

文档里Box modal里,开篇是这句话。

The CSS box model describes the rectangular boxes that are generated for elements in the [document tree] and laid out according to the [visual formatting model].

大概意思就是,文档树中的元素,是根据盒模型来生成展示模型的。

拿现实中来做对比,盒子好比砖头,堆叠成一栋栋楼,盒模型构建CSS世界。

image.png

但CSS中,堆叠的方式跟现实中的砖头不太一样。CSS中堆叠的方式有两种,一种称为块(Block)、另一种称为内联(inline)。块堆叠的方式是独占一行,行内堆叠方式是不会独占一行,只有一行的空间不够了,才会换下一行。这个前端佬肯定熟。

这种堆叠的方向有一个默认方向,即为从上往下,从左往右,规范里称为流(flow)。之所以说默认方向,是因为,这种流向是可以更改的,这里不做过多解释。我的另一篇文章有应用,点这里查看(链接)。

2、多姿多彩的盒子

再接着贴上规范中(Visual formatting model)的一句话。

In the visual formatting model, each element in the document tree generates zero or more boxes according to the [box model].

意思就是,一个元素的可视化模型,是由多个根据盒模型生成的盒子组成的。

首先亮个前端佬们肯定熟悉的图:

image.png

这四个就是一些文章中常说的,Margin盒子Broder盒子Padding盒子Content盒子,也是这些盒子,定义了元素的尺寸(Box dimensions)。

到这里,很多文章就戛然而止了。但前端佬们,可以仔细想想,仅仅这四个盒子就够用吗?

嗯??

当然不够!!!

你看,光上面有提到说CSS堆叠的两条规则,一个块,一个内联,靠上面这四个盒子,怎么去区别开呢?

脑袋一拍!

再加盒子就是!叫做外在盒子

外在盒子属性如果是 块(block) 就是块级元素,外在盒子如果是 内联(inline) 就是内联元素。这种对应就是理解CSS中display:inline-block。按照这个思路,display:block;就应该是display:block-block;

image.png

既然有了外,那就会有内。容器盒子登场!

大致一个元素所包含盒子可以这么示意:

image.png

但就这些盒子就够用吗?不够哦!像display:item-list这种,外面自带一个 标记(mark)盒子

image.png

除了这些,我们平时的行内文字这里,也有一些盒子,如下:

image.png

匿名内联盒子(anonymous box):外部无元素包裹,尺寸由文字控制。

行盒子(line box):决定单行文本宽高。

字符盒子(character box): 单个文字。

图片盒子(IMG box): 图片。

等等等更多的盒子................................

但这里又注意到,看过规范的朋友应该会疑惑。你说的这些,我怎么没有在文档上看到?

所以,这里就要说明下。w3c规范中并没有什么总结性的盒子分类,这些盒子,都仅仅是在描述中提到这个box,那个box。比如有P box、em box。

如下图:

image.png

结合上面说的,盒模型就是CSS构建元素几何图形的一种思路。不光上面提到的一些盒子,如table元素,flex弹性盒子之类的,都可以这么去理解。

感兴趣的前端大佬可以去自己看看,到时候有新发现可以分享告知下,一定捧场!!!

3、写在最后

本来想搞个系列,再说说盒模型中各种属性的作用细节,比如width、height、padding等等。但那种长篇大作,有机会再起篇幅!感谢看到这里!!

image.png