CSS盒模型详解:搞定标准盒、怪异盒、边距塌陷,告别布局翻车

6 阅读3分钟

引言

CSS把网页中的每一个元素都看做是一个矩形盒子,页面布局的本质就是无数个矩形盒子的排布、叠加、留白和尺寸控制。 盒模型四要素: 内容 content、内边距 padding、边框 border、外边距 margin

一、元素三大显示特性(display)

1.1 块级元素(block)

  • 独占一行,默认宽度撑满父级
  • 宽度、高度、padding、margin全部生效
  • 可容纳块级、行内元素
  • 常见块级元素:div、p、h1~h6、ul、li、form

1.2 行内元素(inline)

  • 同行显示,不换行
  • 宽度和高度无效,由内容决定
  • 上下 padding 和上下 margin 无效,左右生效
  • 常见行内元素:span、a、b、i、em

1.3 行内块(inline-block)

  • 同行排列,不换行(行内)
  • 宽度、高度、padding、margin全部生效(块级)
  • 常见行内块:img、input、button

二、盒模型四要素详解

2.1 content(内容区)

这是盒子模型的核心,元素真正存放文字、图片、子元素的区域

关键属性: width、height

2.2 padding(内边距)

内容与边框之间的距离,避免内容紧贴边框,属于盒子内部,会撑大盒子,背景色会覆盖 padding 区域。

简写规则(顺时针):padding:上 右 下 左

2.3 border(边框)

盒子的边线,会撑大盒子,支持粗细、颜色、样式。

组成元素:边框宽度、线型、颜色

2.4 margin(外边距)

盒子与盒子之间的外部留白,实现元素之间的间距、居中效果,不影响盒子本身大小

三、标准盒模型vs怪异盒模型

3.1 标准盒模型

写法:box-sizing: content-box

规则:width = 内容区宽度

计算公式:盒子宽度 = width + 左右padding + 左右border

特点:布局很难控制,在修改 padding、border 时会把盒子撑大,导致页面布局错乱

3.2 怪异盒模型

写法:box-sizing: border-box

规则:width = 整个盒子宽度

计算公式:盒子宽度 = 原本内容的width = 压缩后的内容width + 左右padding + 左右border

特点:修改 padding、border 不会撑大盒子,只会压缩内部内容区尺寸,布局稳定

四、关于margin塌陷的问题与解决

margin塌陷是最容易产生的问题:垂直方向的 margin 会合并,不会叠加(水平方向不会塌陷)

4.1 兄弟元素塌陷

问题产生:上盒子的 margin-bottom 与 下盒子的 margin-top 相遇,会取两者最大值作为最终的间距,而不是 margin-bottom + margin-top

解决方法:统一只给一个盒子设置单侧 margin

4.2 父子元素塌陷

问题产生:父元素没有边框、内边距、溢出隐藏时,子元素的 margin-top 会穿透父元素,作用到父元素外侧,导致父元素整体下移

解决方法:

  • 给父盒子设置 border
  • 给父盒子设置 padding
  • 给父盒子添加 overflow: hidden
  • 使用 flex 弹性布局

五、基于盒模型的居中方案

块级元素水平居中

注:必须设置宽度,margin:0 auto 才能生效

div {
  width: 300px;
  margin: 0 auto;
}