CSS 简介

CSS 是层叠样式表 (Cascading Style Sheets) 的简称

HTML 主要做结构,显示元素内容,CSS 美化 HTML,布局网页,即结构 (HTML) 与样式 (CSS) 相分离

CSS 语法规范

CSS 规则由两个主要部分构成:选择器以及一条或多条声明,如下:

css属性规则

  • 选择器是用于指定 CSS 样式的 HTML 标签,花括号内是对该对象设置的具体样式
  • 属性和属性值以“键值对”的形式出现
  • 属性是对指定的对象设置的样式属性,例如字体大小、文本颜色等
  • 属性和属性值之间用英文 ":" 分开
  • 多个“键值对”之间用英文 "; " 分开
1
2
3
h1 {
color: pink;
}
  1. 选择器(标签)和花括号之间保留空格
  2. 属性的冒号和值之间保留空格

CSS 基础选择器

选择器简单来说就是选择标签用的

选择器分为基础选择器和复合选择器两个大类。

  • 基础选择器是由单个选择器组成的
  • 基础选择器又包括:标签选择器、类选择器、id 选择器和通配符选择器

标签选择器

标签选择器是指用 HTML 标签名称作为选择器,按标签名称分类,为页面中某一类标签指定统一的 CSS 样式,如下:

1
2
3
p {
color:red;
}

优点:能快速为页面中同类型的标签统一设置样式

缺点:不能设计差异化样式,只能选择全部的当前标签

类选择器

如果想要差异化选择不同的标签,单独选一个或者某几个标签,可以使用类选择器,如下:

1
2
3
4
5
6
7
<style>
.red {
color: red;
}
</style>

<div class="red">变红色</div>
  1. 类选择器使用 "." 进行标识,后面紧跟类名(自定义)
  2. 可以理解为给这个标签起了一个名字,可以多个标签重复使用相同类名
  3. 长名称或词组可以添加 "-" 来命名
  4. 不要使用纯数字、中文等命名,尽量使用英文字母来表示
  5. 命名要有意义,尽量让人一眼就能知道这个类名的目的

记忆口诀:样式点定义,结构类调用。一个或多个,开发最常用。

多类名

我们可以给一个标签指定多个类名,从而达到更多的选择目的,简单理解就是一个标签有多个名字。

1.  多类名使用方式

  • 在标签 class 属性中写多个类名
  • 多个类名中间必须用空格分开
  • 这个标签可以分别具有这些类名的样式

2.  多类名开发中使用场景(DRY)

  • 可以把一些标签元素相同的样式放到一个类里面
  • 这些标签都可以调用这个公共的类,然后再调用自己独有的类
  • 节省 CSS 代码,统一修改也方便
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<style>
.box {
width: 150px;
height: 100px;
font-size: 30px;
}

.red {
/* 背景颜色 */
background-color: red;
}

.green {
background-color: green;
}
</style>

<div class="box red">红色</div>
<div class="box green">绿色</div>
<div class="box red">红色</div>

id 选择器

同一个 id 属性在同一个 HTML 文档中只能出现一次

1
2
3
#nav {
color: red;
}

id 选择器和类选择器的区别:

  1. 类选择器(class)好比人的名字,一个人可以有多个名字,同时一个名字也可以被多个人使用
  2. id 选择器好比人的身份证号码,全中国独一无二,不得重复
  3. id 选择器和类选择器最大的不同在于使用次数上
  4. 类选择器在修改样式中使用最多,id 选择器一般用于页面唯一性的元素,经常和 JavaScript 搭配使用

通配符选择器

在 CSS 中,通配符选择器使用 "*" 定义,它表示选取页面中所有的元素(标签),如:

1
2
3
4
* {
margin: 0;
padding: 0;
}
  • 通配符选择器不需要调用,自动给页面中所有元素使用样式
  • 特殊情况下才会使用该选择器

小结

基础选择器对象特点使用情况
标签选择器所有相同标签不能差异化选择较多
类选择器一个或多个标签可以根据需求选择非常多
id 选择器一次只能选择一个标签每个 id 只能用一次一般和 js 搭配
通配符选择器所有标签选择太多,有部分不需要特殊情况使用

CSS 字体属性

CSS Fonts(字体)属性用于定义字体系列、大小、粗细和文字样式(如斜体)。

字体系列

CSS 使用 font-family 属性定义文本的字体系列

1
2
3
4
5
6
7
p {
font-family: "微软雅黑";
}

div {
font-family: Arial, "Microsoft Yahei";
}
  • 各种字体之间必须使用英文状态下的逗号隔开
  • 一般情况下,如果有空格隔开的多个单词组成的字体,加引号
  • 尽量使用系统默认自带字体,保证在任何用户的浏览器中都能正确显示

字体大小

CSS 使用 font-size 属性定义字体大小

1
2
3
p {
font-size: 20px;
}
  • px(像素)大小是我们网页中的最常用的单位
  • 谷歌浏览器默认的文字大小为 16px
  • 不同浏览器可能默认显示的字号大小不一致,我们尽量给一个明确值大小,不要默认大小
  • 可以给 body 指定整个页面文字的大小

字体粗细

CSS 使用 font-weight 属性设置文本字体的粗细

1
2
3
p {
font-weight: bold;
}
属性值描述
normal默认值(不加粗)
bold定义粗体(加粗)
100~900400 等同于 normal,而 700 等同于 bold,注意:这个数字后面不跟单位
  • 学会让加粗标签(比如 h 和 strong 等)不加粗,伙子其他标签加粗
  • 实际开发时,我们更喜欢用数字表示粗细

文本样式

CSS 使用 font-style 属性设置文本的风格

1
2
3
p {
font-style: normal;
}
属性值作用
normal默认值,浏览器会显示标准的字体样式
italic浏览器会显示斜体的字体样式

**注意:**平时我们很少给文字加斜体,反而要给斜体标签(em,i)改为不倾斜字体

字体符合属性

字体属性可以把以上文字样式综合来写,这样更节约代码

1
2
3
body {
font: font-style font-weight font-size/line-height font-family;
}
  • 使用 font 属性时,必须按上面语法格式中的顺序书写,不能更换顺序,并且各个属性间以空格隔开
  • 不需要设置的属性可以省略,但必须保留 font-size 和 font-family 属性,否则 font 属性将不起作用

小结

属性表示注意点
font-size字号我们通常用的单位是 px 像素,一定要跟上单位
font-family字体实际工作中按照团队约定来写字体
font-weight字体粗细记住加粗是 700 或者 bold,不加粗是 normal 或者 400 数字不跟单位
font-style字体样式记住倾斜是 italic,不倾斜是 normal,工作中最常用 normal
font字体连写字体连写有顺序,不能随意换位置;字号和字体必须出现

文本属性

CSS Text(文本)属性可定义文本的外观,比如文本的颜色、对齐文本、装饰文本、文本缩进、行间距等

1
2
3
div {
color: red;
}
表示属性值
预定义的颜色值red,green,blue,pink 等
十六进制#FF0000,#FF6600,#29D794 等
RGB 代码rgb(255, 0, 0)或 rgb(100%, 0%, 0%)

开发中最常用的是十六进制

对齐文本

tex-align 属性用于设置元素内文本内容的水平对齐方式

1
2
3
div {
text-align: center;
}
属性值解释
left左对齐
right右对齐
center居中对齐

装饰文本

text-decoration 属性规定添加到文本的修饰,可以给文本添加下划线、删除线、上划线等

1
2
3
div {
text-decoration: underline;
}
属性值描述
none默认,没有装饰线(最常用)
underline下划线,链接 a 自带下划线(常用)
overline上划线(几乎不用)
line-through删除线(不常用)

文本缩进

text-indent 属性用来指定文本的第一行的缩进,通常是将段落的首行缩进

1
2
3
div {
text-indent: 10px;
}

通过设置该属性,所有元素的第一行都可以缩进一个给定的长度,甚至该长度可以使负值

1
2
3
p {
text-indent: 2em;
}

em 是一个相对单位,就是当前元素(font-size)1 个文字的大小,如果当前元素没有设置大小,则会按照父元素的 1 个文字大小

行间距

line-height 属性用于设置行间的距离。可以控制文字行与行之间的距离

1
2
3
p {
line-height: 26px;
}

小结

属性表示注意点
color文本颜色通常用十六进制
text-align文本对齐可以设定文本水平的对齐方式
text-indent文本缩进通常用于段落首行缩进距离
text-decoration文本修饰记住添加下划线 underline 取消下划线 none
line-height行高控制行与行之间的距离

CSS 引入方式

按照 CSS 样式书写的位置(或者引入的方式),CSS 样式表可以分为三大类:

  1. 行内样式表(行内式)
  2. 内部样式表(嵌入式)
  3. 外部样式表(链接式)

行内样式表(少用)

行内样式表是在元素标签内部的 style 属性中设定 CSS 样式,适合于修改简单样式。

1
<div style="color: red; font-size: 12px;">青春不常在,抓紧谈恋爱</div>
  • style 其实就是标签的属性
  • 在双引号中间,写法要符合 CSS 规范
  • 可以控制当前的标签设置样式
  • 由于书写繁琐,并且没有体现出结构与样式相分离的思想,所以不推荐大量使用
  • 使用行内样式表设定 CSS,通常也被称为行内式引入

内部样式表

内部样式表是写到 html 页面内部,是将所有的 CSS 代码抽取出来,单独放到一个 < style> 标签中

1
2
3
4
5
6
<style>
div {
color: red;
font-size: 12px;
}
</style>
  • < style> 标签理论上可以放在 HTML 文档的任何地方,但一般会放在文档的< head> 标签中
  • 通过此种方式,可以方便控制当前整个页面中的元素样式设置
  • 代码结构清晰,但是并没有实现结构与样式完全分离
  • 使用内部样式表设定 CSS,通常也被称为嵌入式引入,这种方式是我们练习时常用的方式

外部样式表

样式单独写到 CSS 文件中,之后把 CSS 文件引入到 HTML 页面中使用,实际开发中最常使用

引入外部样式表分为两步:

  1. 新建一个后缀名为.css的样式文件,把所有 CSS 代码都放入此文件中
  2. 在 HTML 页面中,使用 <link> 标签引入这个文件
1
<link rel="stylesheet" href="css文件路径" />
属性作用
rel定义当前文档与被链接文档之间的关系,在这里需要指定为"stylesheet",表示被链接的文档是一个样式表文件
href定义所链接文件的 URL,可以是相对路径,也可以是绝对路径。
  • 使用外部样式表设定 CSS,通常也被称为外链式或链接式引入,这种方式是开发中最常用的方式

小结

样式表优点缺点使用情况控制范围
行内样式表书写方便,权重高结构样式混写较少控制一个标签
内部样式表部分结构与样式相分离没有彻底分离较多控制一个页面
外部样式表完全实现结构与样式相分离需要引入最多控制多个页面

综合案例-新闻页面

Emmet 语法

Emmet 语法的前身是 Zen coding,它使用缩写,来提高 html/css 的编写速度,Vscode 内部已经集成该语法

快速生成 HTML 结构语法

  1. 生成标签:直接输入标签名,按 tab 键即可
  2. 如果想要生成多个相同标签,加上*就可以了,比如div*3就可以快速生成 3 个 div
  3. 如果有父子级关系的标签,可以用>,比如ul>li
  4. 如果有兄弟关系的标签,可以用+,比如div+p
  5. 如果生成带有类名或者id名字的,直接写.demo或者#demo即可
  6. 如果生成的 div 类名是有顺序的,可以用自增符号$
  7. 如果想要在生成的标签内部写内容,可以用{}表示

快速生成 CSS 样式语法

CSS 基本采取简写形式即可

  1. 比如w200按 tab 即可生成width: 200px;
  2. 比如lh26px按 tab 即可生成line-height: 26px;
  3. 比如tac按 tab 即可生成text-align: center;

快速格式化代码

在 vscode 的settings.json里添加"editor.formatOnSave": true,

CSS 复合选择器

复合选择器是建立在基础选择器之上,对基础选择器进行组合形成的

  • 复合选择器可以更准确、更高效的选择目标元素(标签)
  • 复合选择器是由两个或多个基础选择器,通过不同的方式组合而成的
  • 常用的复合选择器包括:后代选择器、子选择器、并集选择器、伪类选择器等

后代选择器

后代选择器又称为包含选择器,可以选择父元素里面的子元素。其写法就是把外层标签写在前面,内层标签写在后面中间用空格分开,当标签发生嵌套时,内层标签就成为外层标签的后代。

语法格式如下:

1
2
3
4
5
6
7
8
元素1 元素2 {
样式声明;
}

例如:
ul li {
color: pink; /* 选择 ul 里面所有的 li 标签元素 */
}
  • 元素 1 和元素 2 中间用空格分开
  • 元素 1 是父级,元素 2 是子级,最终选择的是元素 2
  • 元素 2 可以是儿子,也可以是孙子等,只要是元素 1 的后代即可
  • 元素 1 和元素 2 可以是任意基础选择器

子选择器

子选择器只能作为某元素的最近一级子元素,简单理解就是选亲儿子元素

语法格式如下:

1
2
3
4
5
6
7
8
元素1>元素2 {
样式声明;
}

例如:
.nav>p {
color: pink; /* 选择 nav 类里最近一级 p 标签元素 */
}
  • 元素 1 和元素 2 中间用大于号隔开
  • 元素 1 是父级,元素 2 是子级,最终选择的是元素 2
  • 元素 2 必须是亲儿子,其孙子、重孙之类的都不归他管

并集选择器

并集选择器可以选择多组标签,同时为他们定义相同的样式,通常用于集体声明。

语法格式如下:

1
2
3
4
5
6
7
8
9
10
11
元素1,
元素2 {
样式声明;
}

例如:
div,
p,
.pig li {
color: pink;
}
  • 元素 1 和元素 2 中间用逗号隔开
  • 逗号可以理解为和的意思
  • 并集通常用于集体声明
  • 约定俗成,并集选择器喜欢竖着写

伪类选择器

伪类选择器用于向某些选择器添加特殊的效果,比如给链接添加特殊效果,或选择第 1 个,第 n 个元素。
伪类选择器书写最大的特点是用冒号:表示,比如::hover:first-child

链接伪类选择器

链接伪类选择器注意事项:

  1. 为了确保生效,请按照 LVHA 的顺序声明(:link:visited:hover:active)
  2. 记忆法:love hate
  3. 因为 a 链接在浏览器具有默认样式,所以实际开发中都需要给链接单独指定样式

语法格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 1.未访问的链接 a:link  把没有点击过的(访问过的)链接选出来 */
a:link {
color: #333;
text-decoration: none;
}

/*2. a:visited 选择点击过的(访问过的)链接 */
a:visited {
color: orange;
}

/*3. a:hover 选择鼠标经过的那个链接 */
a:hover {
color: skyblue;
}

/* 4. a:active 选择的是我们鼠标正在按下还没有弹起鼠标的那个链接 */
a:active {
color: green;
}

:focus 伪类选择器

:focus 伪类选择器用于选取获得焦点的表单元素
焦点就是光标,一般情况 <input> 类表单元素才能获取,因此这个选择器也主要针对于表单元素来说

1
2
3
input:focus {
background-color: pink;
}

小结

选择器作用特征使用情况隔开符号及用法
后代选择器用来选择后代元素可以是子孙后代较多空格 .nav a
子代选择器选择最近一级元素只选亲儿子较少大于 .nav>a
并集选择器选择某些相同样式的元素可以用于集体声明较多逗号 .nav, p
链接伪类选择器选择不同状态的链接跟链接相关较多冒号 a:hover
:focus 选择器选择获得光标的表单跟表单相关较少input:focus

CSS 的元素显示模式

网页的标签非常多,在不同的地方会用到不同类型的标签,了解他们的特点可以更好的布局我们的网页。元素显示模式就是元素(标签)以什么方式进行显示,比如 <div> 自己独占一行,而 <span> 可以一行放多个。
HTML 元素一般分为块元素行内元素两种类型

块级元素

常见的块级元素有 <h1>~<h6> 、<p>、<div>、<ul>、<ol>、<li> 等,其中 <div> 标签最典型

块级元素的特点:

  1. 比较霸道,自己独占一行
  2. 高度、宽度、外边距以及内边距都可以控制
  3. 宽度默认是容器(父级宽度)的 100%
  4. 是一个容器及盒子,里面可以放行内或者块级元素

注意:

  • 文字类的元素内不能使用块级元素
  • <p> 标签主要用于存放文字,因此 <p> 里面不能放块级元素,特别是不能放 <div>
  • 同理,<h1>~<h6> 等都是文字类块级标签,里面也不能放其他块级元素

行内元素

常见的行内元素有 <a>、<strong>、<b>、<em>、<i>、<del>、<s>、<ins>、<u>、<span> 等,其中 <span> 标签最典型

行内元素的特点:

  1. 相邻行内元素在一行上,一行可以显示多个
  2. 高度、宽度直接设置是无效的
  3. 默认宽度就是它本身内容的宽度
  4. 行内元素只能容纳文本或其他行内元素

注意:

  • 链接里面不能再放链接
  • 特殊情况链接 <a> 里面可以放块级元素,但是给 <a> 转换一下块级模式最安全

行内块元素

在行内元素中有几个特殊的标签 —— <img />、<input />、<td> ,它们同时具有块元素和行内元素的特点

行内块元素的特点:

  1. 一行可以显示多个行内块,但是他们之间会有空白间隙。
  2. 默认宽度就是它本身内容的宽度(行内元素特点)
  3. 高度、宽度、外边距和内边距都可以控制(块级元素特点)

小结

元素模式元素排列设置样式默认宽度包含
块级元素一行只能放一个块级元素可以设置高度和宽度容器的 100%容器可以包含任何标签
行内元素一行可以放多个行内元素不可以设置高度宽度它本身内容的宽度容纳文本或者其他行内元素
行内块元素一行可放多个行内块元素可以设置高度和宽度它本身内容的宽度

学习元素显示模式的主要目的就是分清它们各自的特点,当我们网页布局的时候,在合适的地方用合适的标签。

元素显示模式转换

特殊情况下,我们需要元素模式的转换,比如:

  • 转换为块级元素:display: block;
  • 转换为行内元素:display: inline;
  • 转换为行内块元素:display: inline-block;

综合案例-小米侧边栏

制作的核心思路分为两步:

  1. 把链接 a 转换为块级元素,这样链接就可以独占一行,并且有宽度和高度
  2. 鼠标经过 a 给链接设置背景颜色

文字垂直居中

让文字的行高等于盒子的高度,即可让文字在当前盒子内垂直居中。

简单理解:行高的上空隙和下空隙把文字挤到中间,如果行高小于盒子高度,文字会偏上;如果行高大于盒子高度,文字偏下。

CSS 的背景

通过 CSS 背景属性,可以给页面添加背景样式。
背景属性可以设置背景样色、背景图片、背景平铺、背景图片位置、背景图像固定等。

背景颜色

background-color属性定义了元素的背景颜色

语法格式如下:

1
2
3
background-color: pink;
/* 一般情况下背景颜色默认值是 transparent */
background-color: transparent;

背景图片

background-image属性描述了元素的背景图像

语法格式如下:

1
background-image: none | url;
参数值作用
none无背景图(默认)
url使用绝对或相对地址指定背景图像

注意:背景图片后面的地址,千万不要忘记加 url,同时里面的路径不要加引号

背景平铺

background-repeat属性定义了对背景图像平铺方式

语法格式如下:

1
background-repeat: repeat | no-repeat | repeat-x | repeat-y;
参数值作用
repeat背景图像在纵向和横向上平铺(默认)
no-repeat背景图像不平铺
repeat-x背景图像在横向上平铺
repeat-y背景图像在纵向上平铺

背景图片位置

利用background-position属性可以改变图片在背景中的位置

语法格式如下:

1
background-position: x y; /* x 坐标和 有 y 坐标,可以使用方位名词或者精准单位 */
参数值说明
length百分数 | 由浮点数字和单位标识符组成的长度值
positiontop | center | bottom | left | center | right 方位名词
  1. 参数是方位名词
  • 如果指定的两个值都是方位名词,则两个值前后顺序无关,比如 left top 和 top left 效果一致
  • 如果只指定了一个方位名词,另一个值省略,则第二个值默认居中对齐
  1. 参数是精确单位
  • 如果参数值是精确坐标,那么第一个肯定是 x 坐标,第二个肯定是 y 坐标
  • 如果只指定一个数值,那该数值一定是 x 坐标,另一个默认垂直居中
  1. 参数是混合单位
  • 如果指定的两个值是精确单位和方位名词混合使用,则第一个值是 x 坐标,第二个值是 y 坐标

背景图像固定(背景附着)

background-attachment属性设置背景图像是否固定或者随着页面的其余部分滚动

语法格式如下:

1
background-attachment: scroll | fixed;
参数作用
scroll背景图像是随对象内容滚动
fixed背景图像固定

背景复合写法

实际开发中更提倡该写法

为了简化背景属性的代码,我们可以将这些属性合并简写在同一个属性 background 中。从而节约代码量,当使用简写属性时,没有特定的书写顺序,一般习惯约定顺序为:background: 背景颜色 背景图片地址 背景平铺 背景图像滚动 背景图片位置;

1
background: transparent url(image.jpg) repeat-y fixed top;

背景色半透明

CSS3 为了我们提供了背景颜色半透明的效果

1
background: rgb(0, 0, 0, 0.3);
  • 最后一个参数是 alpha 透明度,取值范围 0~1 之间
  • 我们习惯把 0.3 的 0 省略掉,直接写为.3
  • 背景半透明是指盒子背景半透明,盒子里面的内容不受影响
  • CSS3 新增属性,IE9+版本浏览器才支持
  • 但是实际开发中,我们不太关注兼容性写法了,可以放心使用

小结

属性作用
background-color背景颜色预定义的颜色值/十六进制/RGB 代码
background-image背景图片url(图片路径)
background-repeat背景平铺repeat/no-repeat/repeat-x/repeat-y
background-position背景位置length/position 分别是 x 和 y 坐标
background-attachment背景附着scroll(背景滚动)/fixed(背景固定)
背景简写书写更简单颜色 图片 平铺 滚动 位置
背景半透明背景颜色半透明background: rgb(0, 0, 0, .3)

CSS 的三大特性

CSS 有三个非常重要的特性:层叠性、继承性、优先级

层叠性

相同选择器给设置相同的样式,此时一个样式就会覆盖(层叠)另一个冲突的样式。层叠性主要解决样式冲突的问题。

层叠性原则:

  • 样式冲突,遵循的原则是就近原则,哪个样式离结构近,就执行哪个样式
  • 样式不冲突,不会层叠

长江后浪推前浪,前浪死在沙滩上

继承性

字标签会继承父标签的某些样式,如文本、颜色和字号

  • 恰当地使用继承可以简化代码,降低 CSS 样式的复杂性(DRY)
  • 子元素可以继承父元素的样式(text- | font- | line- 这些元素开头的可以继承,以及 color 属性)
  • 继承性口诀:龙生龙,凤生凤,老鼠生的孩子会打洞

行高的继承性

1
2
3
body {
font: 12px/1.5 "Microsoft Yahei";
}
  • 行高可以跟单位,也可以不跟单位
  • 如果子元素没有设置行高,则会继承父元素的行高为 1.5
  • 此时子元素的行高是当前子元素的文字大小*1.5
  • body 行高 1.5,这样的写法最大的优势就是里面子元素可以根据自己文字大小自动调整行高

优先级

当同一个元素指定多个选择器,就会有优先级的产生

  • 选择器相同,则执行层叠性(就近原则)
  • 选择器不同,则根据选择器权重执行

选择器权重如下表所示:

选择器选择器权重
继承 或者 *0,0,0,0
元素选择器0,0,0,1
类选择器,伪类选择器0,0,1,0
ID 选择器0,1,0,0
行内样式,style=""1,0,0,0
!important无穷大 ∞

优先级注意点:

  1. 权重是有四组数字组成的,但是不会有进位
  2. 可以理解为类选择器永远大于元素选择器,id 选择器永远大于类选择器,以此类推
  3. 等级判断从左向右,如果某一位数值相同,则判断下一位数值
  4. 简单记忆法:通配符和继承权重为 0,标签选择器为 1,类(伪类)选择器为 10,id 选择器为 100,行内样式表为 1000,!important 无穷大,即选择器越精确权重越高
  5. 继承的权重是 0,如果该元素没有直接选中,不管父元素权重多高,子元素得到的权重都 0

**权重叠加:**如果是复合选择器,则会有权重叠加,需要计算权重

  • .nav ul li -----> 0,0,1,2
  • div ul li -------> 0,0,0,3
  • a:hover -------> 0,0,1,1
  • .nav a ---------> 0,0,1,1

CSS 的注释

语法格式如下:

1
/* 需要注释的内容 */