在 CSS 布局中 CSS 盒子模型是其中的一项基础且重要的概念。CSS 盒子模型描述了网页元素在页面上所占空间的计算方式,小到元素定位和排列,大到网页整体布局设计,CSS 盒子模型都会参与其中,是前端开发者必须掌握的概念。
CSS盒子模型组成
CSS
中会把所有的HTML
元素都看作是一个 "盒子",所有的样式也都是基于这个盒子。
margin
(外边距):盒子与其他相邻元素的空白区域。border
(边框):盒子中围绕内容和内边距的线条。padding
(内边距):内容与边框之间的空白区域。content
(内容):元素中的文本或后代元素都是其内容
在盒子模型中可以将它们的组成理解为: 盒子的大小 = content + padding + border
。
Note:外边距
margin
不会影响盒子的大小,但会影响盒子的位置。
开发者工具查看盒模型
在开发中,我们通过打开开发者工具查看元素的盒模型:
- 在开发者工具中点击选择元素。
- 鼠标点击要查看的元素。
- 在 Elements - Styles 中最底部即可查看元素盒模型。
CSS盒子模型样式
���们通过一个简单的 CSS 盒子模型样式直观感受盒子模型的呈现效果。
html
<div id="app">hello world</div>
css
div {
/* content 内容区 */
width: 300px;
height: 300px;
/* padding 内边距 */
padding: 20px;
/* border 边框 */
border: black dotted 10px;
/* margin 外边距 */
margin: 50px;
background-color: gray;
}
我们依次解析 CSS 样式:
- 内容区为宽和高相同的
300px
,并且它背景颜色为灰色
。 - 内边距为
20px
,这里体现在虚线边框和内容hello world
之间的距离。 - 边框为
黑色
、点状
、10px
粗的线条。 - 外边距为
50px
,可以看到整个灰色
区域的盒子与浏览器视窗之间的留白。 - 盒子的背景颜色为
灰色
,它默认地就是覆盖整个盒子模型的面积大小。
CSS内容区样式
CSS盒子模型中内容区的样式示例:
width
:元素的 CSS 像素宽度。min-width
:元素的最小 CSS 像素宽度。max-width
:元素的最大 CSS 像素宽度。height
:元素的 CSS 像素高度。min-height
:元素的最小 CSS 像素高度。max-height
:元素的最大 CSS 像素高度。
css
div {
width: 500px;
min-width: 100px;
max-width: 800px;
height: 50px;
min-height: 20px;
max-height: 100px;
}
CSS内边距样式
CSS盒子模型中内边距的样式示例:
padding-left
:元素的左内边距。padding-right
:元素的右内边距。padding-top
:元素的上内边距。padding-bottom
:元素的下内边距。padding
:可以通过组合分别实现不同的内边距样式。
css
div {
padding-left: 10px;
padding-top: 20px;
padding-right: 10px;
padding-bottom: 30px;
/* 同时影响:上下左右 */
padding: 10px;
/* 影响:上下 左右 */
padding: 10px 20px;
/* 影响:上 左右 下 */
padding: 10px 20px 30px;
/* 影响:上 右 下 左 */
padding: 10px 20px 10px 30px;
}
注意:当给行内元素
设置的上下内边距
太大时,可能会覆盖到其他元素:
CSS盒子边框样式
CSS盒子模型中边框的样式示例:
border-width
:边框的宽度。border-style
:边框的样式,如实线solid
,点线dotted
,虚线dashed
,双线double
,无none
。border-color
:边框的颜色。border
:可以通过组合简写的形式实现边框样式。
css
div {
/* 宽度 */
border-width: 1px;
border-left-width: 1px;
border-top-width: 1px;
border-right-width: 1px;
border-bottom-width: 1px;
/* 样式 */
border-style: solid;
border-left-style: solid;
border-top-style: solid;
border-right-style: solid;
border-bottom-style: solid;
/* 颜色 */
border-color: black;
border-left-color: black;
border-top-color: black;
border-right-color: black;
border-bottom-color: black;
/* 组合样式 */
border: 1px solid black;
border-left: 1px solid black;
border-top: 1px solid black;
border-right: 1px solid black;
border-bottom: 1px solid black;
}
CSS盒子外边距
CSS盒子模型中外边距的样式示例:
margin-left
:元素的左外边距margin-right
:元素的右外边距margin-top
:元素的上外边距margin-bottom
:元素的下外边距margin
:可以通过组合简写的形式实现元素外边距样式。
css
div {
margin: 10px;
margin-left: 10px;
margin-top: 20px;
margin-right: 10px;
margin-bottom: 30px;
margin: 10px 10px;
margin: 20px 10px 30px;
margin: 10px 20px 10px 30px;
}
注意:margin
样式使用时的一些特点:
- 子元素的
margin
相对于父元素的content
。 - 行内元素的左右
margin
会生效,上下margin
不会产生效果。 - 块级元素的左右
margin
为auto
,可以呈现水平居中(行内元素无效)。 margin
的值可以是负数
。
CSS样式继承
需要注意的是在盒子模型相关的一些样式是不可继承的:
- 子元素可继承父元素的:字体属性、文本属性(除了vertical-align)、文字颜色等
- 不可继承的:边框、内外边距、背景、宽高、溢出等
box-sizing
前面讲盒子的大小 = content + padding + border
,这是我们直观的感受。同时在盒子模型的样式中有一个box-sizing
属性容易与之混淆。box-sizing
属性主要决定的是元素宽高的计算边界。 box-sizing
属性有以下两个主要的值:
content-box
:这是默认值。在此模式下,元素的宽度和高度仅指内容区域的宽度和高度,不包括内边距(padding)和边框(border)。border-box
:在这种模式下,元素设定的宽度和高度包括了内容、内边距和边框。也就是说,指定的宽度和高度是元素最终呈现的可见区域的尺寸。
同样是CSS盒子模型样
中的例子,另外设置一个box-sizing: border-box
的元素。
html
<d>
<div id="app">hello world</div>
<div id="app2">hello world2</div>
</d>
css
div {
/* content 内容区 */
width: 300px;
height: 300px;
/* padding 内边距 */
padding: 20px;
/* border 边框 */
border: black dotted 10px;
/* margin 外边距 */
margin: 50px;
background-color: gray;
}
#app2 {
box-sizing: border-box;
}
d {
display: flex;
align-items: center;
}
如下图,左边的是默认的box-sizing: content-box
,右边的则是box-sizing: border-box
。可以看到左边的内容区宽度和高度正好容纳了右边的整个盒子大小,也就是说右边盒子的300px
宽和高是以边框作为计算边界的。