盒模型

一旦你开始用 CSS 做间距调整,你就会遇到所有人都遇到的同一个难题:你设置了宽度,加上一些内边距,元素却比你要求的宽。两个段落靠得比数字显示的要近。这都不是 bug。这就是盒模型,一套决定每个元素占用多少空间的规则。一旦你能想象出它的样子,大多数间距上的惊喜就不再是惊喜了。
每个元素都是一个盒子
CSS 把页面上的每个元素都当作一个矩形,哪怕是单个词或一个链接。这个矩形由四层从里到外堆叠而成,这就是**盒模型**:中间是内容,周围是内边距,然后是边框,最外面是外边距。
想象一张挂在墙上的相框照片。照片是内容。照片周围的白色垫子是内边距,是框内的呼吸空间。木制框架本身是边框。这个框架和下一个框架之间的空墙壁是外边距。每个你设置样式的元素都以同样的方式打包,从里到外。
.card {
padding: 16px; /* 内部空间,围绕内容 */
border: 2px solid #333; /* 框架 */
margin: 24px; /* 外部空间,推开相邻元素 */
}padding、border 和 margin
三个间距层各有一个作用。**内边距**是内部空间,在内容和边框之间。外边距是外部空间,推开其他元素。边框是它们之间的线。
你可以一次为所有四条边设置一个值,也可以针对单一边:
.card {
padding: 20px; /* 四条边都是 20px */
margin-bottom: 32px; /* 仅底部边 */
}简写 padding: 20px 是快速说"上、右、下、左都一样"的方法。当你需要一条边与其他边不同时,使用像 margin-bottom 这样的特定属性。
padding,当两个盒子靠得太近时使用 margin。一个像 padding: 20px 这样的值覆盖所有四条边,或在只有一条边需要改变时命名一条边如 margin-bottom。 box-sizing:content-box vs border-box
这是让几乎所有人吃惊的地方。你设置卡片为 width: 300px,加上一些内边距,卡片在页面上的宽度就超过了 300 像素。你没做错。默认情况下,width 只测量中间的内容,任何内边距和边框都被加到上面。
有一个单行修复让 width 按你期望的方式表现。设置 box-sizing: border-box,现在你输入的宽度是盒子的完整宽度,包括内边距和边框:
.card {
box-sizing: border-box; /* width 现在包含内边距和边框 */
width: 300px;
padding: 20px; /* 卡片保持 300px 宽,不是 340px */
}width 只测量中间的内容,所以内边距和边框使盒子比你输入的数字更大。设置 box-sizing: border-box 修复了这个:宽度变成完整的盒子,包括内边距和边框。这个绊倒了我很久,所以早点记住它值得。 外边距折叠
还有一个惊喜,它是关于外边距堆叠。把两个段落放在彼此上面,给第一个 24px 的底部外边距,给第二个 16px 的顶部外边距,你可能期望它们之间有 40px 的间隔。你实际上得到 24px。
这被称为**外边距折叠**。当两个垂直外边距相遇时,浏览器不会将它们相加。它保留较大的两个,丢弃较小的。所以较大的外边距赢,间隔是 24px,不是 40px。它仅与上下外边距发生,永远不与内边距发生。
.intro {
margin-bottom: 24px;
}
.details {
margin-top: 16px;
/* 它们之间的间隔是 24px,较大的外边距,不是 40px */
}24px 下面遇见 16px 上面给出 24px 的间隔,不是 40px。它仅与上下外边距发生,第一次它会让每个人吃惊。 
