CSS 一个非常基础也是非常重要的部分就是 - 盒子模型,主要知识点有盒子的概念、布局方式、box-sizing 属性、特殊的盒子模型以及边距塌陷,掌握了它们之后大部分布局问题应该都能轻松解决。
先认识一下:
可以在浏览器 F12 打开控制台,输入这行代码,给页面上所有的元素设置边框样式,一览其排列:
$$('*').map(x => x.style.border = '1px solid')
盒模型
在 CSS 盒子模型中,每个的 HTML 元素都会被当作是一个矩形的盒子,然后对它们进行从上到下,从左到右的布局。 一个盒子通常包括四个区域,从里到外分别是:
- 内容区域 - 代表盒子的实际内容部分,它是由 width 宽度和 height 高度来确定的
- 内间距区域 - 代表盒子与实际内容之间的空白区域,由 padding 属性设置
- 边框区域 - 代表盒子的边框,是内间距区域和外边距区域的边界,由 border 属性设置
- 外边距区域 - 代表此盒子的边框与相邻的其他盒子边框之间的距离,由 margin 属性设置
标准盒模型
标准盒子模型:元素实际占位宽度 = 内容的宽度(content)+ border + padding + margin
IE 盒模型
- IE盒子模型:元素实际占位宽度=内容宽度(content+border+padding)+ margin
box-sizing 属性
用来控制元素的盒子模型的解析模式,默认为content-box。
context-box:W3C的标准盒子模型,设置元素的 height/width 属性指的是content部分的高/宽
border-box:IE传统盒子模型。设置元素的height/width属性指的是border + padding + content部分的高/宽
box-sizing属性可以设置使用哪种标准的盒模型
- border-box IE盒模型
- content-box W3C标准盒模型
特殊的盒子-替换元素
除了上面两种盒模型外,css 盒子模型中还有一种特殊的盒子:替换元素。
替换元素是说,它们加载的是外部内容,并不会受现有的 CSS 属性的影响。常见的替换元素有 、 等,这些标签都是用来加载外部文件的,当前 HTML 页面中的 CSS 样式并不会影响它们的内容,比如说
不过,可以通过 CSS 来控制替换元素在盒子中的位置,比如说用 加载一张图片,我们可以限制 盒子的宽高,然后利用 object-fit 属性,让图片等比例占满整个盒子,裁掉显示不下的部分,然后通过 object-position 来设置图片在盒子中的位置,可以是靠下或者居中等:
<img
src="https://upload.wikimedia.org/wikipedia/commons/3/3f/Jammu_kashmir_pangong_lake-1920x1080.jpg"
alt=""
/>
img {
width: 300px;
height: 300px;
object-fit: cover;
object-position: center;
}
盒子的布局方式
多个盒子之间会有不同的布局方式,它是通过设置显示类型来实现的。根据盒子本身与外部相邻的其他盒子之间的排列方式,还有盒子内部的子盒子之间的排列方式,我们可以把它们分为外部显示类型和内部显示类型两种。
外部显示类型 (相邻盒子之间)
外部显示类型控制的是相邻盒子之间的布局,分为块级盒子和行内盒子两种。它们是浏览器默认的布局方式。
block 块级盒子
块级盒子,比如 div,p,h1 等,它的宽度(指盒子的整体宽度)会占满整个浏览器,并且后边的盒子会被挤占到下一行去显示。
inline 行内盒子
行内盒子比如 span, a 等,它的宽度是内容的宽度,后边的盒子会跟在它的后边继续排列。
内部显示类型 (父子盒子之间)
内部显示类型则是控制这个盒子内部的子盒子之间的排列方式,上边说的 block 块级和 inline 行内盒子是正常的文档流,块级盒子内部的盒子也是按照这种方式排列,要注意的是行内盒子里边只能有行内盒子,不能有块级盒子。我们可以通过设置 display 的值来修改内部盒子的排列方式。 比如设置为 flex 可以变成流式布局
inline-block 显示类型
如果想让一个盒子的外部类型保持 inline 行内状态,不把后边的盒子挤占到下一行,但是又想同时设置宽高、padding 和 margin,那么可以使用 inline-block 这个显示类型,这样这个盒子就有了宽高,并且无论是水平还是垂直方向上的 padding 和 margin,都可以把周围的盒子的空间挤占掉。