CSS 盒模型简述

172 阅读4分钟

前言

盒模型是 CSS 中重要的模型。本文先介绍了内部和外部显示类型,再较为详细的介绍了盒模型,最后讲解了盒模型水平布局的特点。

内部和外部显示类型

css 的 盒模型有一个外部显示类型,来决定盒子是块级还是内联。同样盒模型还有内部显示类型,它决定了盒子内部元素是如何布局的。

但是,我们可以通过使用类似 flexdisplay 属性值来更改内部显示类型。如果设置 display: flex,在一个元素上,外部显示类型是 block,但是内部显示类型修改为 flex。(摘自MDN

盒模型

当对一个文档进行布局(lay out)的时候,浏览器的渲染引擎会根据标准之一的 CSS 基础框盒模型(CSS basic box model),将所有元素表示为一个个矩形的盒子(box)。CSS 决定这些盒子的大小、位置以及属性(例如颜色、背景、边框尺寸…)。(摘自MDN

盒模型的组成:

  • Content box: 内容区,可以通过设置 widthheight 设置相关属性。
  • Padding box: 内边距,可以通过设置 padding 设置相关属性。
  • Border box: 边框,可以通过 border 设置相关属性。
  • Margin box: 外边距,可以通过 margin 设置相关属性。

鉴于本篇博文并不是细致入微文档百科,盒模型各种属性的详细介绍建议翻阅MDN文档

盒模型有两种标准标准盒子模型与 IE 盒子模型。

标准盒子模型

标准盒子模型.png

box-sizing: content-box表示标准盒模型(默认值)。

标准盒模型的 widthheight 属性的范围只包含了 content

IE 盒子模型

IE盒子模型.png

box-sizing: border-box表示IE盒模型(怪异盒模型)。

IE 盒模型的 widthheight 属性的范围包含了 borderpaddingcontent

在很早以前 IE 低版本的浏览器默认使用的都是 IE 盒模型,但这不代表 IE 盒子模型是落后的,即使 IE 永久停用了,IE 盒子模型仍然可以在其他浏览器中使用,并且某些情况下十分好用。

块级盒子和内联盒子

块级盒子 (block box) 和 内联盒子 (inline box)会在页面流(page flow)和元素之间的关系方面表现出不同的行为。(摘自MDN

块级盒子特点:

  • 盒子会在内联的方向上扩展并占据父容器在该方向上的所有可用空间,在绝大数情况下意味着盒子会和父容器一样宽。
  • 每个盒子都会换行。
  • 可以设置widthheight 属性。
  • paddingbordermargin)会将其他元素从当前盒子周围“推开”。

内联盒子特点:

  • 盒子不会产生换行。
  • 不可以设置widthheight 属性。
  • 垂直方向的paddingbordermargin会被应用,但不会把其他内联盒子推开(不影响页面的布局),水平方向不受影响。

可以使用display属性,比如 inlineblock 来控制盒子的外部显示类型。

水平布局

元素在其父元素中水平方向的位置由以下几个属性共同决定:

  • margin-left
  • border-left
  • padding-left
  • width
  • padding-right
  • border-right
  • margin-right

父元素内容区的宽度 = 上述属性之和(必须满足)。

如果相加结果使等式不成立,则称为过度约束,则等式会自动调整:

  • 七个值中没有为 auto,则浏览器会自动调整 margin-right 值以使等式满足。
  • 某个值为 auto,则会自动调整那个值以使等式满足。
  • 如果 widthmarginauto,则 width 会调整到最大,设置为 automargin 会自动为 0。
  • 如果将两个 margin 设置为 autowidth 固定值,则会将 margin 设置为相同的值

我们经常利用最后一点实现水平居中。

width: 100px;
margin: 0 auto;

参考资料

CSS 基础框盒模型介绍 - CSS(层叠样式表) | MDN
盒模型 - 学习 Web 开发 | MDN
没了IE浏览器,盒模型就不是盒模型了么?秒懂盒模型!!🔥🔥 - 掘金
前端面试题之CSS篇