一、盒子模型
1、行标签与块标签
浏览器在显示HTML文档时,由于浏览器会自上而下,自左至右的读取HTML文档,所以默认情况下元素会自动从上而下分成一行行,并在每行中按从左至右的顺序排放。这种从左往右,从上往下的流式排列方式,我们称之为文档流。
1.1、行标签
行标签(内联标签)不会占据容器的一整行,它会和它周围的内容一起,在一行内,从左至右自然的依次显示,如果没有更多的空间,剩下的内容会自动摆放在下一行;并且,对于行标签设置宽度(width
)和高度(height)一般并不会起作用,行标签的宽度和高度决定于标签中内容的高度和宽度,我们之前学习的<a>
标签、<span>
标签、<lable>
标签、<input>
、<img>
标签均是行标签。
注意:<img>
、<textarea>
、<input>
、<select>
、<video>
、<audio>
等标签也可以设置宽度或高度,但它们仍然是行标签。
1.2、块标签
块标签会尽可能占据外层容器的整个宽度,所以,之后的标签自然的被显示在下一行;另外,块标签可以设置自己的宽度(width
)和高度(height
)。我们之前看到的<h1>
到<h6>
标签、<p>
标签、<ol>
标签、<ul>
标签、<li>
标签、<div>
标签等,都属于块标签。
1.3、display属性
标签是否是行标签或块标签均可以使用CSS样式表的display
属性进行设置。
<!DOCTYPE html>
<html>
<head>
<title> display属性 </title>
<meta charset="utf-8">
<style type="text/css">
ul li {
display: inline;
}
</style>
</head>
<body>
<ul>
<li><a href="#">主页</a></li>
<li><a href="#">校友档案</a></li>
<li><a href="#">添加校友</a></li>
</ul>
</body>
</html>
说明:
- 上例中,
<li>
标签默认为块标签,通过样式表display: inline;
,将<li>
标签设置成了行标签。 - 默认情况下,块标签的
display
属性值为block
,行标签的display
属性值为inline
。 - 我们还可以通过
display
属性将标签设置为内联块(inline-block
)标签,设置为内联块标签后,标签不会尽可能的占据外层容器的整个宽度,但是它仍然可以设置宽度(width
)和高度(height
)。
2、盒子模型简介
HTML中所有元素都可以看作一个盒子,这个盒子对该HTML元素进行封装,包括:边距、边框、填充和内容区域。而在所有的元素中,尤其以块级元素的盒子最为标准。在CSS中,盒子模型(box model
)这一术语常常用来设计和布局。
<!DOCTYPE html>
<html>
<head>
<title> 盒子模型 </title>
<meta charset="utf-8">
</head>
<body>
<h2>李白</h2>
<p>字太白,号青莲居士,又号“谪仙人”,是伟大的浪漫主义诗人,被后人誉为“诗仙”。</p>
<p>点击查看校友录<a href="#">免责声明</a></p>
<h3>兴趣爱好</h3>
<ul>
<li>饮酒</li>
<li>赋诗</li>
<li>游历山水</li>
</ul>
<h3>成长足迹</h3>
<ol>
<li>728年:《黄鹤楼送孟浩然之广陵》</li>
<li>732年:《蜀道难》</li>
<li>736年:《将进酒》</li>
<li>759年:《早发白帝城》</li>
</ol>
</body>
</html>
二、盒子模型的结构
盒子模型总共有四部分组成,如下:
组成 | 说明 |
---|---|
内容(content ) | 盒子中真正的内容(文本,图片等) |
填充(padding ) | 边框以内,内容区域周围的部分,又称为内边距或补白,填充是透明的 |
边框(border ) | 边距以内,围绕在填充和内容外的部分 |
边距(margin ) | 边框外的区域,又称为外边距,边距是透明的 |
1、内容
内容区域中包含的是盒子中真正的内容(文本,图片等),需要注意的是,内容区域的默认高度由内容的高度决定。
<!DOCTYPE html>
<html>
<head>
<title> 内容区域 </title>
<meta charset="utf-8">
<style type="text/css">
p {
width: 64px;
height: 21px;
padding: 0;
border: 0;
margin: 0;
}
</style>
</head>
<body>
<p>内容区域</p>
</body>
</html>
2、填充
填充包围在内容区域的边缘,分为上、右、下、左四个区域。
<!DOCTYPE html>
<html>
<head>
<title> 填充 </title>
<meta charset="utf-8">
<style type="text/css">
p {
width: 64px;
height: 21px;
padding: 5px 10px 15px 20px;
border: 0;
margin: 0;
}
</style>
</head>
<body>
<p>内容区域</p>
</body>
</html>
说明:
- 样式表中的
padding
属性用来设置元素的填充。样式padding: 5px 10px 15px 20px;
表示在内容区域的上部填充5
像素,右部填充10
像素,下部填充15
像素,左部填充20
像素。 - 填充有多种设置方式,下面是一些例子:
属性名称 | 解释 | 示例 |
---|---|---|
padding-top | 设置上填充 | padding-top: 5px; |
padding-right | 设置右填充 | padding-right: 10px; |
padding-bottom | 设置下填充 | padding-bottom: 15px; |
padding-left | 设置左填充 | padding-left: 20px; |
padding | 按上、右、下、左的顺序(顺时钟顺序)设置填充 | padding: 5px 10px 15px 20px; |
padding | 按上下、左右两两设置填充,可以在上下填充相同且左右填充也相同的情况下使用 | padding:5px 10px; |
3、边框
边框包围在填充的边缘,也分为上、右、下、左四个区域。
<!DOCTYPE html>
<html>
<head>
<title> 边框 </title>
<meta charset="utf-8">
<style type="text/css">
p {
width: 64px;
height: 21px;
padding: 5px 10px 15px 20px;
border: 5px solid #FFFFFF;
margin: 0;
}
</style>
</head>
<body>
<p>内容区域</p>
</body>
</html>
说明:
- 样式表中的
border
系列属性设置元素的边框,样式border: 5px solid #FFFFFF;
表示元素在上、右、下、左方向都有5
像素的边框,边框为实线,白色。 - 边框可以用不同的样式属性分别设置宽度、风格、颜色,也可以像上例中一样在
border
样式属性中一起设置,下面是几个例子:
属性名称 | 解释 | 示例 |
---|---|---|
border-width | 设置边框的宽度 | border-width: 5px; |
border-style | 设置边框的风格 | border-style: solid; |
border-color | 设置边框的颜色 | border-color: red; |
border | 按顺序分别设置边框的宽度、风格、颜色 | border: 5px solid red; |
- 可以针对边框上、右、下、左中的任意一个方向进行单独设置,下面是几个例子:
属性名称 | 解释 | 示例 |
---|---|---|
border-top | 设置上边框 | border-top: 5px double red; |
border-right-width | 设置右边框的颜色 | border-right-width: 5px; |
border-bottom-style | 设置下边框的风格 | border-bottom-style: dotted; |
border-left-color | 设置左边框的颜色 | border-left-color: red; |
4、边距
边距包围在边框的周围,也分为上、右、下、左四个区域。
<!DOCTYPE html>
<html>
<head>
<title> 边距 </title>
<meta charset="utf-8">
<style type="text/css">
p {
width: 64px;
height: 21px;
padding: 5px 10px 15px 20px;
border: 5px solid #FFFFFF;
margin: 20px 15px 10px 5px;
}
</style>
</head>
<body>
<p>内容区域</p>
</body>
</html>
说明:
- 样式表中的
margin
属性用来设置元素的边距。样式margin: 20px 15px 10px 5px;
表示边框的上部离其他元素有20
像素的距离,边框右部离其他元素有15
像素的距离,边框下部离其他元素有10
像素的距离,边框左部离其他元素有5
像素的距离。 - 同填充一样,边距也有类似的多种设置方式,下面是一些例子:
属性名称 | 解释 | 示例 |
---|---|---|
margin-top | 设置上边距 | margin-top: 20px; |
margin-right | 设置右边距 | margin-right: 15px; |
margin-bottom | 设置下边距 | margin-bottom: 10px; |
margin-left | 设置左边距 | margin-left: 5px; |
margin | 按上、右、下、左的顺序(顺时钟顺序)设置边距 | margin: 20px 15px 10px 5px; |
margin | 按上下、左右两两设置边距,可以在上下边距相同且左右边距也相同的情况下使用 | margin: 5px 10px; |
三、计算盒子模型的尺寸
1、默认的盒子模型
默认情况下,盒子尺寸的计算方式如下:
- 整个盒子的宽度 = 内容区域的宽度 + 左
padding
+ 右padding
+ 左border
+ 右border
+ 左margin
+ 右margin
- 整个盒子的高度 = 内容区域的高度 + 上
padding
+ 下padding
+ 上border
+ 下border
+ 上margin
+ 下margin
2、box-sizing调整盒子尺寸
CSS3中提供了box-sizing
属性,用来改变盒模式中盒子的宽度和高度的默认计算方法。其常见属性值如下:
属性及值 | 说明 |
---|---|
box-sizing: content-box; | 由width 属性和height 属性定义的宽度和高度,只包含盒子的内容区域,这也是盒子模型默认的方式 |
box-sizing: border-box; | 由width 属性和height 属性定义的宽度和高度,由盒子的内容区域,padding ,border 相加组成 |
四、常见问题
1、重置浏览器默认盒子属性
不同的浏览器都会默认给不同的标签一定的盒子属性值,当我们没有设置这些标签的盒子属性值时,会应用浏览器的默认样式。一般情况下,我们需要自由的控制网页,所以经常在样式表的最上面覆盖浏览器的默认样式。
* {
padding: 0;
margin: 0;
border: 0;
}
2、版本兼容问题
一些低版本的IE浏览器无法解析HTML5中的许多新增标签(如IE8),导致CSS不起作用。针对这一问题,我们可以使用兼容JavaScript脚本,只需在页面中引入即可,下面是示例:
<head>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
</head>
由于我们只针对低版本IE浏览器,上面的代码可以优化为:
<head>
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<![endif]-->
</head>
在引入JavaScript脚本之后,还需要在样式表中引入样式,将常见的HTML5新增块级标签的display
属性值设置为block
,下面是示例:
article, aside, figcaption, figure, footer, header, main, nav, section {
display: block;
}