老生常谈-CSS盒模型

188 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

前言

CSS盒模型是一个形象的比喻,就是把所有的html元素比作盒子, 都有各自的宽度width/高度height、内边距padding、边框border和外边距margin

块级盒子和内联盒子

首先,我们要知道css主要使用两种盒子:块级盒子和内联盒子。

  1. 块级盒子有以下特性:
  • 单独在页面流中占据一行。
  • widthheight属性可以生效。
  • padding、border、margin生效。
  1. 内联盒子特性:
  • 不换行,在页面流中不单独占据一行。
  • width和height属性不起作用。
  • 垂直方向的padding和margin不起作用。

分类

完整的 CSS 盒模型应用于块级盒子,内联盒子只使用盒模型中定义的部分内容。

CSS盒模型分为两类:

1.标准盒模型

标准盒模型.png

W3C标准盒模型,由四个部分组成:content box+ padding box +border box + margin box。

在标准模型中,如果你给盒设置 width 和 height,实际设置的是 content box。 padding 和 border 再加上设置的宽高一起决定整个盒子的大小。 如下定义了一个元素:

div {
    width:360px;
    padding: 10px;
    margin: 20px;
    border: 10px solid black;
}

则其标准模型宽度为400px, 即content box的宽度+border+padding = 360px+210px+210px。

2.IE盒模型

IE盒模型也叫作替代盒模型,使用这个模型,所有宽度都是可见宽度,所以内容宽度计算不包括边框和内边距。使用上面相同的样式得到width = 360px。

内容content的宽度和高度:就是我们通过width和height设置的宽度与高度

元素的宽度与高度:宽/高 = 内容宽/高 + 内边距 + 边框

元素空间的宽度与高度:宽/高 = 内容宽/高 + 内边距 + 边框 + 外边距

标准盒模型转换为IE盒模型

因为标准盒模型元素的宽度与高度:宽/高 = 内容宽/高 + 内边距 + 边框,
若改变内边距或者边框大小,元素宽高便会改变,
如果要保持原来元素的宽高,就要改变内容的宽高,
如边距变大多少,内容就缩小多少,
所以为了方便,我们可以转换成IE盒模型。

box-sizing属性

通过box-sizing属性,我们可以将IE盒模型转换成标准盒模型,box-sizing默认取值content-box,即标准盒模型:

box-sizing: content-box

元素的宽度与高度:宽/高 = 内容宽/高 + 内边距 + 边框

box-sizing: border-box

box-sizing: border-box属性就可以将元素变成IE盒模型,可以在不改变元素宽高的情况下,改变内边距和边框大小,加了box-sizing: border-box属性后,元素宽高恒等于width/height取值。

外边距折叠问题

外边距是盒子周围一圈看不到的空间。它会把其他元素从盒子旁边推开。外边距属性值可以为正也可以为负。设置负值会导致和其他内容重叠。无论使用标准模型还是替代模型,外边距总是在计算可见部分后额外添加。

假如我们有两个P段落。顶部段落的页 margin-bottom为 50px。第二段的margin-top 为 30px。则它们上下之间相距多少? 答案是50px,如果你有两个外边距相接的元素,这些外边距将合并为一个外边距,即最大的单个外边距的大小。不过这么说也不确切,具体情况如下:

  • 如果参与折叠的外边距中包含负值,折叠后的外边距的值为最大的正边距与最小的负边距(即绝对值最大的负边距)的和,;也就是说如果有 -13px 8px 100px 叠在一起,边界范围的技术就是 100px -13px 的 87px。
  • 如果所有参与折叠的外边距都为负,折叠后的外边距的值为最小的负边距的值。这一规则适用于相邻元素和嵌套元素。

解决外边距折叠问题

  1. 创建块级格式上下文(可参考我写的BFC块级格式化上下文)
  • float:left或right。
  • position: absolute。
  1. 清除浮动
  • 相邻的两个元素之间的外边距重叠,后一个元素加上clear-fix清除浮动。

最后

个人学习分享,欢迎大家和我一起学习,共同进步鸭!

冲鸭.webp