CSS盒模型
在 CSS 中我们广泛地使用两种“盒子” —— 块级 盒子 (block box ) 和 内联盒子 (inline box )。 这两种盒子会在页面流 (page flow)和元素之间的关系 方面表现出不同的行为。
外部显示类型
可以通过对盒子display
属性的设置,比如 inline
或者 block
,来控制盒子的外部显示类型。
块级盒子
- 盒子会在内联的方向上扩展并占据父容器在该方向上的所有可用空间,在绝大数情况下意味着盒子会和父容器一样宽
- 每个盒子都会换行
- width和height属性能发挥作用
- 内边距(padding), 外边距(margin) 和 边框(border) 会将其他元素从当前盒子周围“推开”
除非特殊指定,诸如标题(<h1>
等)和段落(<p>
)默认情况下都是块级的盒子。
内联盒子
- 盒子不会产生换行。
width
和height
属性将不起作用。- 垂直方向的内边距、外边距以及边框会被应用但是不会把其他处于
inline
状态的盒子推开。 - 水平方向的内边距、外边距以及边框会被应用且会把其他处于
inline
状态的盒子推开。
用做链接的 <a>
元素、 <span>
、 <em>
以及 <strong>
都是默认处于 inline
状态的。
外边距、内边距和边框是生效的,但它们不会改变其他内容与内联盒子的关系,因此内边距和边框会与段落中的其他单词重叠。
内部显示类型
模型还有内部显示类型,它决定了盒子内部元素是如何布局的。默认情况下按照 正常文档流 布局,也可以通过使用类似 flex
的 display
属性值来更改内部显示类型。
设置 display: flex
,在一个元素上,外部显示类型是 block
,但是内部显示类型修改为 flex
。该盒子的所有直接子元素都会成为flex元素,会根据 弹性盒子(Flexbox )规则进行布局
盒模型
完整的 CSS 盒模型应用于块级盒子,内联盒子只使用盒模型中定义的部分内容。
盒模型的各个部分
- Content box : 这个区域是用来显示内容,大小可以通过设置
width
和height
. - Padding box : 包围在内容区域外部的空白区域; 大小通过
padding
相关属性设置。 - Border box : 边框盒包裹内容和内边距。大小通过
border
相关属性设置。 - Margin box : 这是最外面的区域,是盒子和其他元素之间的空白区域。大小通过
margin
相关属性设置。
标准盒模型:给盒设置 width
和 height
,实际设置的是 content box 。 padding 和 border 再加上设置的宽高一起决定整个盒子的大小。
替代IE盒模型:所有宽度都是可见宽度,所以内容宽度是该宽度减去边框和填充部分。
如果需要使用替代模型,您可以通过为其设置 box-sizing: border-box
来实现。 这样就可以告诉浏览器使用 border-box
来定义区域,从而设定您想要的大小。
html {
box-sizing: border-box;
}
*, *::before, *::after {
box-sizing: inherit;
}
外边距
外边距是盒子周围一圈看不到的空间。它会把其他元素从盒子旁边推开。 外边距属性值可以为正也可以为负。设置负值会导致和其他内容重叠。无论使用标准模型还是替代模型,外边距总是在计算可见部分后额外添加。可以有负数,只是代表了方向。
外边距折叠:两个外边距相接的元素,这些外边距将合并为一个外边距,即最大的单个外边距的大小。
内边距
不能有负数量的内边距,所以值必须是0或正的值。应用于元素的任何背景都将显示在内边距后面,内边距通常用于将内容推离边框。
内联和块的中间状态
display有一个特殊的值,它在内联和块之间提供了一个中间状态。
一个元素使用 display: inline-block
,实现我们需要的块级的部分效果:
- 设置
width
和height
属性会生效。 padding
,margin
, 以及border
会推开其他元素。- 它不会跳转到新行,如果显式添加
width
和height
属性,它只会变得比其内容更大。