【CSS简介、基础选择器、字体属性、文本属性、引入方式】

本文档是个人对 Pink 老师课程的总结归纳及补充,转载请注明出处!

一、CSS简介

CSS 的主要使用场景就是布局网页,美化页面的。

1.1 HTML的局限性

HTML 只关注内容的语义,虽然 HTML 可以做简单的样式,但是带来的是无尽的臃肿、繁琐和低维护性……

1.2 CSS网页的美容师

CSS 是 层叠样式表 的简称。

有时我们也会称之为 CSS样式表级联样式表

CSS 也是一种 标记语言

CSS 主要用于设置 HTML 页面中的文本样式(字体、大小、颜色、对齐方式……)、图片样式(宽高、边框样式、边距……)以及版面的布局和外观显示样式。

CSS 让我们的网页更加丰富多彩,布局更加灵活自如,简单理解:CSS 可以美化 HTML,让 HTML 更漂亮,同时让页面布局更简单。

总结:

  • HTML 搭建结构,填入元素内容
  • CSS 美化 HTML,布局网页元素
  • CSS 最大价值:由 HTML 专注去做结构呈现,样式交给 CSS,即:结构 与 样式 分离

1.3 CSS语法规范

使用 HTML 时,需要遵从一定的规范,CSS 也是如此,要想熟练地使用 CSS 对网页进行修饰,首先需要了解 CSS 样式规则。

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

  • 选择器 是用于选出需要设置 CSS 样式的 HTML 标签,花括号内是对该对象设置的具体样式
  • 属性属性值“键值对” 的形式出现 属性: 属性值;
  • 属性是对指定的对象设置的样式属性,例如:字体大小、文本颜色等
  • 属性和属性值之间用英文 : 分开
  • 多个 “键值对” 之间用英文 ; 进行区分(末尾的键值对可以不加 ;

所有的样式,都包含在 <style> 标签内,表示是样式表。

<style> 一般写到 </head> 里。

1
2
3
4
5
6
7
8
<head>
<style type="text/css">
h4 {
color: bule;
font-size: 100px;
}
</style>
</head>

注意:<style> 标签可以写到其他标签内部并作用与该标签区域内,但是强烈不推荐这种写法!

type="text/css" 可以省略。

1.4 CSS代码风格

1.4.1 样式格式书写

  • 紧凑格式(不推荐)
1
h3 { color: deeppink; font-size: 20px; }
  • 展开格式(推荐
1
2
3
4
h3 {
color: deeppink;
font-size: 20px;
}

强烈推荐第二种格式,因为更直观!不用担心占用空间,因为后期可以通过代码压缩工具来压缩代码。

1.4.2 样式大小书写

  • 大写(不推荐)
1
2
3
H3 {
COLOR: PINK;
}
  • 小写(推荐
1
2
3
h3 {
color: pink;
}

强烈推荐样式选择器,属性名,属性值关键字全部使用小写字母,特殊情况除外。

凡是你不确定是否用大写的都一律用小写就对了!

1.4.3 空格规范

1
2
3
h3 {
color: pink;
}
  • 属性值前面冒号后面,保留一个空格
  • 选择器(标签)和前花括号中间,保留一个空格

二、CSS基础选择器

2.1 CSS选择器的作用

选择器就是根据不同的需求把不同的标签选出来,这就是选择器的作用,简单来说,就是:选择标签用的。

1
2
3
4
h1 {
color: red;
font-size: 25px;
}

以上 CSS 做了两件事:

  • 找到所有的 h1 标签。(选对人)
  • 设置这些标签的样式:颜色为红色、字体大小为 25 像素。(做对事)

2.2 选择器的分类

选择器分为 基础选择器复合选择器 两个大类,本文首先介绍一下基础选择器。

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

2.3 标签选择器

标签选择器(元素选择器)是指用 HTML 标签名称作为选择器,按标签名称分类,为页面中某一类标签指定统一的 CSS 样式。

语法:

1
2
3
4
5
6
标签名 {
属性1: 属性值1;
属性2: 属性值2;
属性3: 属性值3;
...
}

作用:

标签选择器可以把某一类标签全部选择出来,比如所有的 <div> 标签和所有的 <span> 标签。

优点:

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

缺点:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>基础选择器之标签选择器</title>
<style type="text/css">
/* 会对所有的该标签元素运用样式,优点:快速统一,缺点:无法差异化设置 */
p {
color: green;
}

div {
color: pink;
}
</style>
</head>

<body>
<p></p>
<p></p>
<p></p>
<div>女生</div>
<div>女生</div>
<div>女生</div>
</body>

</html>

2.4 类选择器

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

CSS 语法:

1
2
3
4
.类名 {
属性1: 属性值1;
...
}

例如:将所有拥有 red 类的 HTML 元素均设置为红色。

1
2
3
.red {
color: red;
}

HTML 语法:

1
<div class="red">变红色</div>

类选择器在 HTML 中以 class 属性表示,在 CSS 中,类选择器以一个 . 号显示。

注意:

  • 类选择器使用 .(英文点号)进行标识,后面紧跟类名(自定义,我们自己命名的)
  • 可以理解为给这个标签起了一个别名来表示
  • 长名称或词组可以使用中横线 - 来为类命名
  • 不能使用已有的关键字作为类名
  • 不要使用纯数字、中文等命名,尽量使用英文字母来表示
  • 命名要有意义,尽量使别人一眼就知道这个类名的目的(可读性第一,长度第二,推荐使用英语,如果是使用拼音请使用全拼
  • 命名规范:见附件(Web前端开发规范手册.pdf)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>基础选择器之类选择器</title>
<style type="text/css">
/* 类选择器口诀:样式 . 定义,结构 class 调用,一个或多个,开发最常用 */
.red {
width: 100px;
height: 100px;
background-color: red;
}

.green {
width: 100px;
height: 100px;
background-color: green;
}
</style>
</head>

<body>
<div class="red"></div>
<div class="green"></div>
<div class="red"></div>
</body>

</html>

类选择器——多类名

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

  • 在标签 class 属性中写多个类名
  • 多个类名中间必须用 空格 分开
  • 这个标签就可以分别具有这些类名的样式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>基础选择器之类选择器</title>
<style type="text/css">
/* 一个标签可以运用多个类选择器,之间用空格隔开 */
.red {
color: red;
}

.font35 {
font-size: 35px;
}
</style>
</head>

<body>
<div class="red font35">zhoujirui</div>
</body>

</html>

多类名开发中使用场景

  • 可以把一些标签元素相同的样式(共同的部分)放到一个类里面
  • 这些标签都可以调用这个公共的类,然后再调用自己独有的类
  • 从而节省 CSS 代码,统一修改也非常方便(模块化、可重用化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>基础选择器之类选择器</title>
<style type="text/css">
/* 类选择器最大的优势在于:复用 */
.box {
width: 100px;
height: 100px;
}

.red {
background-color: red;
}

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

<body>
<div class="box red"></div>
<div class="box green"></div>
<div class="box red"></div>
</body>

</html>

多类名选择器在后期布局比较复杂的情况下,是使用得较多的。

2.5 id选择器

id 选择器可以为标有特定 id 的 HTML 元素指定特定的样式。

HTML 元素以 id 属性来设置 id 选择器,CSS 中 id 选择器以 # 来定义。

语法:

1
2
3
4
#id名 {
属性1: 属性值1;
...
}

例如:将 id 为 nav 元素中的内容设置为红色。

1
2
3
#nav {
color: red;
}

注意:id 属性只能在每个 HTML 文档中出现一次。

口诀:样式 # 定义,结构 id 调用,只能调用一次,别人切勿使用。

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

  • 类选择器 (class) 好比人的名字,一个人可以有多个名字,同时一个名字也可以被多个人使用
  • id 选择器好比人的身份证号码,全中国是唯一的,不可重复(同一个 id 选择器只能调用一次)
  • id 选择器和类选择器最大的不同在于使用次数上
  • 类选择器在修改样式中用的最多,id 选择器一般用于页面唯一性的元素上,经常和 JavaScript 搭配使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>基础选择器之id选择器</title>
<style type="text/css">
/* id 选择器口诀:样式 # 定义,结构 id 调用,只能调用一次,别人切勿使用 */
#pink {
color: pink;
}
</style>
</head>

<body>
<div id="pink">zhoujirui</div>
</body>

</html>

再次强调:同一 id 只能定义一次,同一 id 选择器也只能调用一次!(对于 CSS 修改样式来说,最好使用类选择器,id 选择器主要与后面的 JS 搭配使用)。

2.6 通配符选择器

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

语法:

1
2
3
4
* {
属性1: 属性值1;
...
}
  • 通配符选择器不需要调用,自动就给所有的元素使用样式
  • 特殊情况才使用,后面讲解使用场景
1
2
3
4
5
// 利用通配符选择器清除所有的元素标签的内外边距,后期讲
* {
margin: 0;
padding: 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>基础选择器之通配符选择器</title>
<style type="text/css">
/* * 给 html 标签所有的元素都使用样式,并且这个过程是自动完成的,不需要手动调用 */
* {
color: red;
}
</style>
</head>

<body>
<div>我的</div>
<span>我的</span>
<ul>
<li>还是我的</li>
</ul>
</body>

</html>

2.7 基础选择器总结

基础选择器 作用 特点 使用情况 用法
标签选择器 可以选出所有相同的标签,比如:p 不能差异化选择 较多 p {color: red;}
类选择器 可以选出 1 个或者 多个 标签 可以根据需求选择 非常多 .nav {color: red;}
id 选择器 一次只能选择 1 个标签 ID 属性只能在每个 HTML 文档中出现一次,也只能调用一次 一般和 js 搭配 #nav {color: red;}
通配符选择器 选择所有的标签 选择的太多,有部分不需要 特殊情况使用 * {color: red;}
  • 每个基础选择器都有使用场景,都需要掌握
  • 如果是修改样式,类选择器是使用最多的

三、CSS字体属性

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

3.1 字体系列

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

1
2
3
4
5
6
7
p {
font-family: "Microsoft YaHei";
}

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

Apple 官网字体:

1
2
3
body {
font-family: "SF Pro SC", "SF Pro Text", "SF Pro Icons", "PingFang SC", "Helvetica Neue", "Helvetica", "Arial", sans-serif
}

Instagram 官网字体:

1
2
3
body {
font-family: -apple-system, BlinkMacSystemFont,"Segoe UI", Roboto, Helvetica, Arial, sans-serif
}

知乎官网字体:

1
2
3
>body {
font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, WenQuanYi Micro Hei, sans-serif
>}

爱奇艺官网字体:

1
2
3
body {
font-family: PingFangSC-Regular, Helvetica, Arial, Microsoft Yahei, sans-serif
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS字体属性之字体系列</title>
<style type="text/css">
/* 浏览器会从第一个字体开始进行适配,如果本机可以适配的话,那么就使用该字体,否则看下一个字体,
如果都不可以,那么浏览器会使用自带的默认字体,所以实际开发中一般建议使用比较标准化的字体 */
h2 {
/* font-family: '微软雅黑'; 可以使用中文,但不建议 */
font-family: "Microsoft YaHei", Arial, sans-serif;
}

p {
font-family: "Times New Roman", Times, serif;
}
</style>
</head>

<body>
<h2>JERRY的秘密</h2>
<p>姓名:周吉瑞</p>
<p>生日:2000年5月4日</p>
<p>性别:男</p>
<p>婚姻状况:单身</p>
</body>

</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS字体属性之字体系列</title>
<style type="text/css">
/* 一些情况下,如果要全局设置字体可以直接在 body 标签选择器中指明 */
body {
font-family: "Microsoft YaHei", Arial, sans-serif;
}
</style>
</head>

<body>
<h2>JERRY的秘密</h2>
<p>姓名:周吉瑞</p>
<p>生日:2000年5月4日</p>
<p>性别:男</p>
<p>婚姻状况:单身</p>
</body>

</html>

注意:浏览器字体是依据用户操作系统来调用的,所以这里介绍一种 Windows 系统安装字体的方法。

当然实际开发中通常浏览器请求时,会把字体文件随 HTML CSS JS 等一同传送到客服端。

![](D:\桌面\HTML5+CSS3 笔记\01【HTML基础】\mark-img\2021041511462678.png)

3.2 字体大小

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

1
2
3
p {
font-size: 20px;
}
  • px(像素)大小是我们网页的最常用的单位
  • 谷歌浏览器默认的文字大小为:16px
  • 不同浏览器可能默认显示的字号大小不一致,我们尽量给一个明确值大小,不要默认大小
  • 可以给 body 指定整个页面文字的大小
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS字体属性之字体大小</title>
<style type="text/css">
/* 全局设置时,一般在 body 标签选择器中指定文字大小,谷歌浏览器默认 16px,
但是最好还是指定一个明确值,以保证在不同浏览器中的效果是一样的 */
body {
font-size: 24px;
}

/* 标题标签比较特殊,body 中的设置对其是不生效的,需要单独指定文字大小 */
h2 {
font-size: 54px;
}
</style>
</head>

<body>
<h2>JERRY的秘密</h2>
<p>姓名:周吉瑞</p>
<p>生日:2000年5月4日</p>
<p>性别:男</p>
<p>婚姻状况:单身</p>
</body>

</html>

3.3 字体粗细

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

1
2
3
p {
font-weight: bold;
}
属性值 描述
normal 默认值(不加粗的)
bold 定义粗体(加粗的)
100-900 400 等同于 normal,而 700 等同于 bold,其它值一般不使用,注意这个数字后面不跟单位
  • 学会让加粗标签(比如 h 和 strong 等)变为不加粗,或者让其他标签加粗
  • 实际开发时,我们更喜欢用数字表示粗细
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS字体属性之字体粗细</title>
<style type="text/css">
.bold {
/* font-weight: bold; */
/* 实际开发中,我们更提倡使用数字来表示加粗的效果 */
/* 这个 700 的后面不要跟单位 */
font-weight: 700;
}

/* 使文字不加粗 */
h2 {
/* font-weight: normal; */
font-weight: 400;
}
</style>
</head>

<body>
<h2>JERRY的秘密</h2>
<p>姓名:周吉瑞</p>
<p>生日:2000年5月4日</p>
<p>性别:男</p>
<p class="bold">婚姻状况:单身</p>
</body>

</html>

3.4 文字样式

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS字体属性之字体样式(风格)</title>
<style type="text/css">
p {
/* 让不倾斜的字体倾斜 */
font-style: italic;
}

em {
/* 让倾斜的字体不倾斜 */
font-style: normal;
}
</style>
</head>

<body>
<p>上课时候的你</p>
<em>下课时候的你</em>
</body>

</html>

3.5 字体复合属性

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

1
2
3
4
5
6
7
body {
font: font-style font-weight font-size/line-height font-family;
}

body {
font: normal 400 font-size/line-height "Microsoft YaHei", Arial, sans-serif;
}
  • 使用 font 属性时,必须按上面语法格式中的顺序书写,不能更换顺序,并且各个属性间以空格隔开
  • 不需要设置的属性可以省略(取默认值),但必须保留 font-size 和 font-family 属性,否则 font 属性将不起作用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS字体属性之复合属性</title>
<style type="text/css">
/* 想要 div 文字变倾斜、加粗、字号设置为 16 像素,并且是微软雅黑 */
div {
/* font-style: italic;
font-weight: 700;
font-size: 16px;
font-family: 'Microsoft YaHei'; */

/* 复合属性:简写的方式,里面的顺序不能打乱 以空格隔开 */
/* font: font-style font-weight font-size/line-height font-family; */
font: italic 700 16px 'Microsoft YaHei';
/* 注意:不需要设置的属性可以省略(取默认值),但必须保留 font-size 和 font-family 属性,否则 font 属性将不起作用 */
/* font: 20px 'Microsoft YaHei'; */
}
</style>
</head>

<body>
<div>三生三世十里桃花,一心一意百行代码</div>
</body>

</html>

3.6 字体属性总结

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

四、CSS文本属性

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

4.1 文本颜色

color 属性用于定义文本的颜色。

1
2
3
div {
color: red;
}
表示方式 属性值
预定义的颜色值 red,green,blue,black,white,gray
十六进制 #FF0000,#FF6600,#29D794(每两位对应:#红R绿G蓝B)
RGB 代码 rgb(255, 0, 0) 或 rgb(100%, 0%, 0%)

注意:开发中最常用的是十六进制。

熟记开发常用色:

黑色:black#000000rgb(0, 0, 0)(三原色啥也没有混合就为黑)

白色:white#FFFFFFrgb(255, 255, 255)(三原色全满混合就为白)

灰色:gray#808080rgb(128, 128, 128)(三原色全半混合就为灰)

红色:red#FF0000rgb(255, 0, 0)

绿色:green#008000rgb(0, 128, 0)(绿色较为特殊,green 对应的是 #008000)

蓝色:blue#0000FFrgb(0, 0, 255)

黄色:yellow#FFFF00rgb(255, 255, 0)

青色:#00FFFFrgb(0, 255, 255)

洋红:#FF00FFrgb(255, 0, 255)

橙色:orange

粉色:pink

烈粉色:hotpink(浓度低)、deeppink(浓度高)

天蓝色:skyblue

深色系:dark颜色 如:darkgreen

浅色系:light颜色 如:lightgreen

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS文本外观属性之文本颜色</title>
<style type="text/css">
div {
/* color: deeppink; */
/* color: #FF1493; 最常用 */
color: rgb(255, 20, 147);
}
</style>
</head>

<body>
<div>pink</div>
</body>

</html>

4.2 文本对齐

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

1
2
3
div {
text-align: center;
}
属性值 解释
left 左对齐(默认值)
rigth 右对齐
center 居中对齐
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS文本外观之文本对齐</title>
<style type="text/css">
h1 {
/* 本质是让 h1 盒子里面的文字水平居中对齐 */
/* text-align: center; */
text-align: right;
}
</style>
</head>

<body>
<h1>右对齐的标题</h1>
</body>

</html>

注意:

text-align 属性只能作用于 块级元素,并让该块级元素内的 行内元素 实现居中(不一定是文字)。

上述例子中:h1 为块级元素,所以给 h1 设置 text-align,便会作用于里面的文本(如果里面还有行内元素的话,也会一同作用)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS文本外观之文本对齐</title>
<style type="text/css">
div {
text-align: center;
}
</style>
</head>

<body>
<div>
<p>zhoujiruizhoujirui</p>
</div>
</body>

</html>

上述例子中:为 div 设置 text-align 之所以能够使其内部的块级元素 p 里的文字居中,原因是 p 会继承父元素 div 的 text-align 属性,所以相当于对 p 设置了 text-align。

4.3 文本装饰

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

1
2
3
div {
text-decoration: underline;
}
属性值 描述
none 默认,没有装饰线(最常用
underline 下划线,链接 a 自带下划线(常用)
overline 上划线(几乎不用)
line-through 删除线(不常用)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS文本外观之文本装饰</title>
<style type="text/css">
/* 默认为 none 没有装饰 */
div {
/* 上划线 几乎不用 */
/* text-decoration: overline; */
/* 删除线 不常用 */
/* text-decoration: line-through; */
/* 下划线 常用,链接 a 自带下划线 */
text-decoration: underline;
}

a {
/* 取消 a 默认的下划线 */
text-decoration: none;
color: #333333;
}
</style>
</head>

<body>
<div>粉红色的回忆</div>
<a href="http://jerry-z-j-r.github.io">JERRY</a>
</body>

</html>

4.4 文本缩进

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS文本外观之文本缩进</title>
<style type="text/css">
p {
font-size: 24px;
/* 文本的首行缩进多少距离,不仅可以为正值,还可以为负值 */
/* text-indent: 20px; */
/* em 为相对于当前元素的大小单位 */
text-indent: 2em;
}
</style>
</head>

<body>
<p>打开北京、上海与广州的地铁地图,你会看见三张纵横交错的线路网络,
这代表了中国最成熟的三套城市轨道交通系统</p>

<p>可即使是这样,在北上广生活的人依然少不了对地铁的抱怨,其中谈及最多的问题便是拥挤,
对很多人而言,每次挤地铁的过程,都像是一场硬仗。更何况,还都是败仗居多。</p>

<p>那么,当越来越多的二线甚至三线城市迎接来了自己的地铁,中国哪里的地铁是最拥挤的呢?</p>
</body>

</html>

4.5 行间距(行高)

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

1
2
3
p {
line-height: 26px;
}
  • 行间距 = 上间距 + 文本高度 + 下间距

  • 上下间距 = (行间距 - 文本高度)/ 2

  • 文本高度 = font-size

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS文本外观之行间距</title>
<style type="text/css">
/* 行间距 = 上间距 + 文本高度 + 下间距 */
/* 行间距 = 行高 */
/* 文本高度 = 字体像素大小 */
/* 上下间距 = (行间距 - 文本高度)/ 2 */
p {
line-height: 25px;
}
</style>
</head>

<body>
<p>打开北京、上海与广州的地铁地图,你会看见三张纵横交错的线路网络,
这代表了中国最成熟的三套城市轨道交通系统</p>

<p>可即使是这样,在北上广生活的人依然少不了对地铁的抱怨,其中谈及最多的问题便是拥挤,
对很多人而言,每次挤地铁的过程,都像是一场硬仗。更何况,还都是败仗居多。</p>

<p>那么,当越来越多的二线甚至三线城市迎接来了自己的地铁,中国哪里的地铁是最拥挤的呢?</p>
</body>

</html>

补充:行间距测量技巧:上一行文字的底部与本行文字的底部之间的距离就是行间距。

![](D:\桌面\HTML5+CSS3 笔记\01【HTML基础】\mark-img\20210405144715962.jpg)

4.6 文本属性总结

属性 表示 注意点
color 文本颜色 我们通常用 十六进制 而且通常是简写形式 #fff(6 个一样可以简写)
text-align 文本对齐 可以设定文字水平的对齐方式
text-indent 文本缩进 通常我们用于段落首行缩进2个字的距离 text-indent: 2em;
text-decoration 文本修饰 牢记 添加下划线 underline 取消下划线 none
line-height 行高 控制行与行之间的距离

五、CSS引入方式

5.1 CSS的三种引入方式

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

  • 行内样式表(行内式)
  • 内部样式表(嵌入式)
  • 外部样式表(外链式)

5.2 行内样式表

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

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

5.3 内部样式表

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

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

5.4 外部样式表

实际开发都是外部样式表,适合于样式比较多的情况,核心是:样式单独写到 CSS 文件中,之后把 CSS 文件引入到 HTML 页面中使用。

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

  • 新建一个后缀名为:.css 的样式文件,把所有的 CSS 代码都放入此文件中
  • 在 HTML 页面中,使用 <link> 标签引入这个文件
1
<link rel="stylesheet" type="text/css" href="css文件路径">
属性 作用
rel 定义当前文档与被链接文档之间的关系,在这里**需要指定为 “stylesheet”**,表示被链接的文档是一个样式表文件
type 定被链接文档的 MIME 类型,该属性最常见的 MIME 类型是 “text/css”,该类型描述样式表,目前的浏览器已经支持省略 “type” 属性
href 定义所链接外部样式表文件的 URL,可以是相对路径,也可以是绝对路径

注意:使用外部样式表设定 CSS,通常也被称为 外链式链接式引入,这种方式是开发中常用的方式。

5.5 CSS引入方式总结

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

【CSS复合选择器、元素显示模式、背景】

本文档是个人对 Pink 老师课程的总结归纳及补充,转载请注明出处!

一、CSS的复合选择器

1.1 什么是复合选择器

在 CSS 中,可以根据选择器的类型把选择器分为:基础选择器复合选择器,复合选择器是建立在基础选择器之上,对基础选择器进行组合形成的。

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

1.2 后代选择器

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

语法:

1
元素1 元素2 { 样式声明 }

上述语法表示选择 元素 1 里面的所有元素 2 (后代元素)。

例如:

1
ul li { 样式声明 } 		/* 选择 ul 里面所有的 li 标签元素 */
  • 元素1 和 元素2 中间用 空格 隔开
  • 元素1 是父级,元素2 是子级,最终选择的是 元素2,即:元素1 是不会生效样式的
  • 元素2 可以是儿子,也可以是孙子等,只要是 元素1 的后代即可
  • 元素1 和 元素2 可以是任意基础选择器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>复合选择器之后代选择器</title>
<style>
/* 把 ol 里面的小 li 选出来改为 pink */
ol li {
color: pink;
}

/* 把 ol 里面的小 a 选出来改为 red */
ol a {
color: red;
}

/* 把 ul 里面的小 li 选出来改为 green */
ul li {
color: green;
}

/* 把 nav 类中的 li 里面的 a 选出来改为 yellow */
.nav li a {
color: yellow;
}
</style>
</head>

<body>
<ol>
<li>我是 ol 的孩子</li>
<li>我是 ol 的孩子</li>
<li>我是 ol 的孩子</li>
<li><a href="#">我是 ol 的孙子</a></li>
</ol>
<ul>
<li>我是 ul 的孩子</li>
<li>我是 ul 的孩子</li>
<li>我是 ul 的孩子</li>
<li><a href="#">我是 ul 的孙子,但是我不会变化</a></li>
</ul>
<ul class="nav">
<li><a href="#">我偏要变色!并且只能我一个人色……</a></li>
</ul>
</body>

</html>

1.3 子选择器

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

注意:是最近一级而并非最近一个

语法:

1
元素1>元素2 { 样式声明 }

上述语法表示选择元素1 里面的所有直接后代(子元素)元素2。

例如:

1
div>p { 样式声明 } 	/* 选择 div 里面所有最近一级 p 标签元素 */
  • 元素1 和 元素2 中间用 大于号 隔开
  • 元素1 是父级,元素2 是子级,最终选择的是元素2,即元素1 是不会生效样式的
  • 元素2 必须是亲儿子,其孙子、重孙之类都不归他管,你也可以叫:亲儿子选择器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>复合选择器之子元素选择器</title>
<style>
.nav>a {
color: red;
}
</style>
</head>

<body>
<div class="nav">
<a href="#">我是儿子1</a>
<p>
<a href="#">我是孙子1</a>
<a href="#">我是孙子2</a>
</p>
<a href="#">我是儿子2</a>
</div>
</body>

</html>

1.4 并集选择器

并集选择器 可以选择多组标签,同时为他们定义相同的样式,通常用于集体声明
并集选择器 是各选择器通过英文逗号 , 连接而成,任何形式的选择器都可以作为并集选择器的一部分。

语法:

1
元素1, 元素2, 元素3 { 样式声明 }
1
2
3
4
5
6
元素1,
元素2,
元素3 {
样式声明
}
/* 推荐写法,编码风格 */

上述语法表示选择元素1、元素2 和 元素3。

例如:

1
ul, div { 样式声明 }		 /* 选择 ul 和 div标签元素 */
  • 元素1 和 元素2 中间用逗号隔开(最后一个不加逗号)
  • 逗号可以理解为和的意思
  • 并集选择器通常用于集体声明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>复合选择器之并集选择器</title>
<style>
/* 要求1:请把熊大和熊二改为粉色 */
/* div,
p {
color: pink;
} */

/* 要求2:请把熊大和熊二改为红色,还有小猪一家改为粉色 */
div,
p,
.pig li {
color: pink;
}
/* 语法规范:并集选择器通常竖着写 */
</style>
</head>

<body>
<div>熊大</div>
<p>熊二</p>
<span>光头强</span>
<ul class="pig">
<li>小猪佩奇</li>
<li>猪爸爸</li>
<li>猪妈妈</li>
</ul>
</body>

</html>

1.5 伪类选择器

伪类选择器 用于向某些选择器添加特殊的效果,比如:给链接添加特殊效果(链接伪类),或选择第 n 个元素(结构伪类)。
伪类选择器 书写最大的特点是用冒号 : 表示,比如::hover:first-child
因为伪类选择器很多,比如:链接伪类结构伪类 等,所以这里先讲解常用的链接伪类选择器。

伪类的由来:因为在页面中并没有这个真实存在的类,所以称为 “伪类”。

1.6 链接伪类选择器

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

  • 为了确保生效且不冲突,请按照 LVHA 的顺序声明 :link :visited :hover :active

  • 记忆法:love hate 或者 lv 包包 hao

  • 因为 a 链接在浏览器中具有默认样式,所以我们实际工作中都需要给链接单独指定样式

链接伪类选择器实际工作开发中的写法:

1
2
3
4
5
6
7
8
9
/* a 是标签选择器 所有的链接 */
a {
color: gray;
}

/* :hover 是链接伪类选择器 鼠标经过 */
a:hover {
color: red; /* 鼠标经过的时候,由原来的 灰色 变成了红色 */
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>复合选择器之链接伪类选择器</title>
<style>
/* 注意:要学会触类旁通,这里不只是可以改变颜色,当链接为图片时还可以改图片 */
/* 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;
}
</style>
</head>

<body>
<a href="#">小猪佩奇</a>
</body>

</html>

image-20220802232452777

注意::hover :active 也适用于其他标签元素。

1.7 :focus伪类选择器

:focus 伪类选择器用于选取获得焦点的表单元素。

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

1
2
3
input:focus {
background-color: yellow;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>复合选择器之focus伪类选择器</title>
<style>
/* 把获得光标的 input 表单元素选区出来 */
input:focus {
background-color: pink;
color: red;
}
</style>
</head>

<body>
<input type="text">
<input type="text">
<input type="text">
</body>

</html>

image-20220802232505662

1.8 复合选择器总结

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

强调:复合选择器的层级写得越细越好(可读性,可维护性,安全性),同时将复合选择器的层级写得越细,可以提前避免大部分的选择器优先级混乱!

二、CSS 的元素显示模式

2.1 什么是元素显示模式

作用:网页的标签非常多,在不同地方会用到不同类型的标签,了解他们的特点可以更好的布局我们的网页。

元素显示模式 就是元素(标签)以什么方式进行显示,比如 <div> 自己占一行,比如一行可以放多个 <span>

HTML 元素一般分为 块元素行内元素 两种类型。

2.2 块元素

常见的块元素有 <h1> ~ <h6><p><div><ul><ol><li><dl><dt><dd><table><tr><form> 等,其中 <div> 标签是最典型的块元素。

块级元素的特点:

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

注意:

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

2.3 行内元素

常见的行内元素有 <a><span><em><strong> 等,其中 <span> 标签是最典型的行内元素,有的地方也将行内元素称为内联元素。

行内元素的特点:

  • 相邻行内元素在一行上,一行可以显示多个

  • 高、宽直接设置是无效的

  • 默认宽度就是它本身内容的宽度

  • 行内元素只能容纳文本或其他行内元素(a 除外)

注意:

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

2.4 行内块元素

在行内元素中有几个特殊的标签:<img><input><th><td>,它们同时具有 块元素行内元素 的特点,有些资料称它们为 行内块元素

行内块元素的特点:

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

2.5 元素显示模式总结

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

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

2.6 元素显示模式转换

特殊情况下,我们需要元素模式的转换,简单理解: 一个模式的元素需要另外一种模式的特性
比如:想要增加链接 <a> 的触发范围。

  • 转换为块元素:display: block;(由于经常需要设置宽高,所以通常会将行内元素转换为块元素)
  • 转换为行内元素:display: inline;
  • 转换为行内块:display: inline-block;(常用)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>元素显示模式之显示模式的转换</title>
<style>
a {
width: 150px;
height: 50px;
background-color: orange;
/* 把行内元素 a 转换为 块级元素 */
display: block;
}

div {
width: 300px;
height: 100px;
background-color: black;
color: white;
/* 把 div 块级元素转化为行内元素 */
display: inline;
}

span {
width: 300px;
height: 30px;
background-color: skyblue;
/* 行内元素转化为行内块元素 */
display: inline-block;
}
</style>
</head>

<body>
<a href="#">我是行内元素</a>
<a href="#">我是行内元素</a>
<div>我是块级元素</div>
<div>我是块级元素</div>
<span>行内元素转化为行内块元素</span>
<span>行内元素转化为行内块元素</span>
</body>

</html>

2.7 简洁版小米侧边栏案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<!doctype html>
<html lang="zh-CN">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>简洁版小米侧边栏案例</title>
<style>
/* 1、把 a 转换为块级元素 */
a {
display: block;
width: 230px;
height: 40px;
background-color: #55585a;
font-size: 14px;
color: #fff;
text-decoration: none;
text-indent: 2em;
/* 一个小技巧:单行文字垂直居中的代码,让文字的行高等于盒子的高度 */
line-height: 40px;
}

/* 2、鼠标经过链接变换背景颜色 */
a:hover {
background-color: #ff6700;
}
</style>
</head>

<body>
<!--
说明:在实际开发中,为了避免链接堆叠,从而降低浏览器排名
开发中一般都将这些链接放在无序列表中,这里只是为了方便演示才这样使用
-->
<a href="#">手机 电话卡</a>
<a href="#">电视 盒子</a>
<a href="#">笔记本 平板</a>
<a href="#">出行 穿戴</a>
<a href="#">智能 路由器</a>
<a href="#">健康 儿童</a>
<a href="#">耳机 音响</a>
</body>

</html>

image-20220802232547122

2.8 小技巧:单行文字垂直居中

CSS 没有给我们提供文字垂直居中的代码,这里我们可以使用一个小技巧来实现。

解决方案:文字的行高 等于 盒子的高度 就可以让文字在当前盒子内垂直居中。

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

2.9 一个注意点:块级元素不会自动换行

当块级元素的宽度超过其父元素宽度时,其不会发生换行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"
name="viewport">
<meta content="ie=edge" http-equiv="X-UA-Compatible">
<title>块级元素不会自动换行</title>
<style>
.clearfix:before,
.clearfix:after {
content: "";
display: table;
}

.clearfix:after {
clear: both;
}

.clearfix {
*zoom: 1;
}

div {
background-color: #FFFF00;
width: 600px;
height: 300px;
color: #FFFFFF;
font-size: 24px;
}

.div {
background-color: #000;
width: 730px;
height: 100px;
margin: 20px 0;
}

span {
background-color: #000;
width: 700px;
height: 100px;
margin: 20px 0;
}
</style>
</head>
<body>
<div class="clearfix">
<div class="div">块级元素 块级元素 块级元素 块级元素 块级元素 块级元素 块级元素 块级元素 块级元素 块级元素 块级元素 块级元素</div>
<span>行内元素 行内元素 行内元素 行内元素 行内元素 行内元素 行内元素 行内元素</span>
</div>
</body>
</html>

三、CSS 的背景

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

3.1 背景颜色

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

1
background-color: 颜色值;

一般情况下元素背景颜色默认值是 transparent(透明),我们也可以手动指定背景颜色为透明色。

1
background-color: transparent;

目前 CSS 还支持丰富的渐变色,但是某些浏览器不支持,这里了解即可,具体内容请查阅资料。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!doctype html>
<html lang="zh-CN">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>渐变</title>
<style>
#grad1 {
height: 200px;
/* 浏览器不支持时显示 */
background-color: red;
/* 线性渐变 - 从上到下(默认情况下)*/
background-image: linear-gradient(#e66465, #9198e5);
}
</style>
</head>

<body>
<h3>线性渐变 - 从上到下</h3>
<p>从顶部开始的线性渐变。起点是红色,慢慢过渡到蓝色:</p>

<div id="grad1"></div>

<p><strong>注意:</strong> Internet Explorer 9 及之前的版本不支持渐变。</p>
</body>

</html>

3.2 背景图片

background-image 属性描述了元素的背景图像,实际开发常用于 logo 或者一些装饰性的小图片或者是超大的背景图片, 优点是非常便于控制位置(精灵图也是一种运用场景)。

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

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

1
2
3
4
5
6
background-color: pink;
background-image: url(../images/logo.png);
/* 1、背景图片不平铺 */
/* background-repeat: no-repeat; */
/* 2、默认情况下,背景图片是平铺的 */
/* background-repeat: repeat; */ /* 页面元素既可以添加背景颜色也可以添加背景图片,只不过背景图片区域会覆盖背景颜色 */

3.3 背景平铺

如果需要在 HTML 页面上对背景图像进行平铺,可以使用 background-repeat 属性。

注:平铺可以简单的理解为“重复”。

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

3.4 背景图片位置

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

1
background-position: x y;

参数代表的意思是:x 坐标 和 y 坐标,可以使用 方位名词 或者 精确单位

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

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

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

background-attachment 后期可以制作 视差滚动 的效果。

1
background-attachment : scroll | fixed
参数 作用
scroll 背景图像是随对象内容滚动的(可见区域取决于背景图像的高度)
fixed 背景图像固定
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>超大背景图片</title>
<style>
body {
background-image: url(images/bg.jpg);
background-repeat: no-repeat;
background-position: center top;
/* 把背景图片固定住 */
background-attachment: fixed;
color: #fff;
font-size: 20px;
}
</style>
</head>

<body>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
<p>天王盖地虎, pink老师一米五</p>
</body>

</html>

image-20220802232609489

3.6 背景复合写法

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

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

这是实际开发中,我们更提倡的写法。

3.7 背景色半透明

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

1
background: rgba(0, 0, 0, 0.3);
  • 最后一个参数是 alpha 透明度,取值范围在 0~1 之间
  • 习惯把 0.3 的 0 省略掉,写为 background: rgba(0, 0, 0, .3);
  • 注意:背景半透明是指盒子背景半透明,盒子里面的内容不受影响
  • CSS3 新增属性,是 IE9+ 版本浏览器才支持的
  • 但是现在实际开发,我们不太关注兼容性写法了,可以放心使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>背景色透明写法</title>
<style>
div {
width: 300px;
height: 300px;
/* background-color: black; */
background: rgba(0, 0, 0, .3);
}
</style>
</head>

<body>
<!-- 只是让背景颜色半透明,盒子里的内容并不受影响 -->
<div>zhoujirui</div>
</body>

</html>

3.8 背景总结

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

背景图片:实际开发常见于 logo 或者一些装饰性的小图片或者是超大的背景图片,优点是非常便于控制位置(精灵图也是一种运用场景)。

3.9 王者荣耀案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>背景位置案例一之王者荣耀点击选项</title>
<style>
/* 对于 logo 图片来说,最常用的方法便是利用背景来设置,而并非直接插入图片 */
h3 {
width: 118px;
height: 40px;
font-size: 14px;
font-weight: 400;
line-height: 40px;
background-image: url(../image/icon.png);
background-repeat: no-repeat;
background-position: left center;
text-indent: 2em;
}

h3 a {
color: #000;
text-decoration: none;
}
</style>
</head>

<body>
<h3><a href="#">成长守护平台</a></h3>
</body>

</html>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>背景位置案例二之王者荣耀背景图片</title>
<style>
body {
background-image: url(../image/b.jpg);
background-repeat: no-repeat;
background-position: center top;
}
</style>
</head>

<body>
<!-- 对于网页中的大面积图片而言,一般不采用直接插入图片的方式来做,
因为图片的分辨率及尺寸是固定的但是显示器或网页窗口的大小分辨率则是会改变的,
直接插入图片的话不方便控制图片大小及位置 -->
<!-- <img src="../image/b.jpg" alt=""> -->
</body>

</html>

【Emmet语法】

本文档是个人对 Pink 老师课程的总结归纳及补充,转载请注明出处!

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

  • 快速生成 HTML 结构语法
  • 快速生成 CSS 样式语法

快速生成HTML结构语法

  • 生成标签直接输入标签名按 tab 键即可,比如 div 然后 tab 键, 就可以生成 <div></div>
  • 如果想要生成多个相同标签加上 * 就可以了,比如 div*3 就可以快速生成 3 个 div
  • 如果有父子级关系的标签,可以用 > 比如 ul>li 就可以了
  • 如果有兄弟关系的标签,用 + 就可以了 比如 div+p
  • 如果生成带有 类名 或者 id 名字的标签, 直接写 标签.demo 或者 标签#demo 再按下 tab 键就可以了
  • 如果生成的事物有顺序,可以用自增符号 $
  • 如果想要在生成的标签内部写内容可以用 {} 表示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Emmet语法之快速生成HTML结构语法</title>
</head>

<body>
<!-- div -->
<div></div>
<!-- table -->
<table></table>
<!-- div*6 -->
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<!-- p*4 -->
<p></p>
<p></p>
<p></p>
<p></p>
<!-- ul>li -->
<ul>
<li></li>
</ul>
<!-- div>span -->
<div><span></span></div>
<!-- div+p -->
<div></div>
<p></p>
<!-- .nav -->
<div class="nav"></div>
<!-- #banner -->
<div id="banner"></div>
<!-- p.one -->
<p class="one"></p>
<!-- span.gray -->
<span class="gray"></span>
<!-- ul>li#two -->
<ul>
<li id="two"></li>
</ul>
<!-- .demo*5 -->
<div class="demo"></div>
<div class="demo"></div>
<div class="demo"></div>
<div class="demo"></div>
<div class="demo"></div>
<!-- .demo$*5 -->
<div class="demo1"></div>
<div class="demo2"></div>
<div class="demo3"></div>
<div class="demo4"></div>
<div class="demo5"></div>
<!-- div{pink老师不是gay} -->
<div>pink老师不是gay</div>
<!-- div{他不喜欢男人}*6 -->
<div>他不喜欢男人</div>
<div>他不喜欢男人</div>
<div>他不喜欢男人</div>
<div>他不喜欢男人</div>
<div>他不喜欢男人</div>
<div>他不喜欢男人</div>
<!-- div{$}*6 -->
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
</body>

</html>

快速生成CSS样式语法

CSS 基本采取简写形式即可。

  • 比如 w200tab 可以 生成 width: 200px;
  • 比如 lh26pxtab 可以生成 line-height: 26px;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Emmet语法之快速生成CSS样式语法</title>
<style>
.one {
/* tac */
text-align: center;
/* ti2e */
text-indent: 2em;
/* w */
/* width: ; */
/* h */
/* height: ; */
/* w24 */
width: 24px;
/* h24 */
height: 24px;
/* tdn */
text-decoration: none;
}
</style>
</head>

<body>

</body>

</html>

快速格式化代码

VSCode 快速格式化代码:Shift + Alt + F

WebStorm 快速格式化代码:Ctrl + Alt + L

【CSS三大特性】

本文档是个人对 Pink 老师课程的总结归纳及补充,转载请注明出处!

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

层叠性

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

层叠性原则:

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

注:就近的标准是:后 > 前

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS三大特性之层叠性</title>
<style>
div {
color: red;
}

div {
color: pink;
}
</style>
</head>

<body>
<!-- pink 色 -->
<div>周吉瑞</div>
</body>

</html>

继承性

现实中的继承:我们继承了父亲的姓。

CSS 中的继承:子标签会继承父标签的某些样式,如:文本颜色和字号,简单的理解就是:子承父业。

  • 恰当地使用继承可以简化代码,降低 CSS 样式的复杂性
  • 子元素可以继承父元素的样式( text-font-line-color ) 文本、字体、段落、颜色
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS三大特性之继承性</title>
<style>
div {
color: pink;
font-size: 14px;
}
</style>
</head>

<body>
<div>
<p>周吉瑞</p>
</div>
</body>

</html>

行高的继承

1
2
3
body {
font: 12px/1.5 'Microsoft YaHei';
}
  • 行高可以跟单位也可以不跟单位
  • 如果子元素没有设置行高,则会继承父元素的行高为 1.5
  • 此时子元素的行高是:当前元素文字大小 * 1.5
  • body 行高 1.5 这样写法最大的优势就是里面的子元素可以根据自己文字的大小自动调整行高
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS三大特性之继承性——行高的继承</title>
<style>
body {
color: pink;
/* font: 12px/18px; */
font: 12px/1.5; /* 12 + 12 * 0.5 = 18 */
}

div {
/* 子元素继承了父元素 body 的行高 1.5 */
/* 这个 1.5 就是当前元素文字大小 font-size 的 1.5 倍 */
/* 所以当前 div 的行高就是:14 + 14 * 0.5 = 21px */
font-size: 14px;
}

p {
/* 1.5 * 16 = 24 当前行高 */
font-size: 16px;
}

/* li 没有手动指定文字大小,则会继承父亲(此处的父亲可以层层向上推)的文字大小 */
/* 即:body 12px 所有 li 的文字大小为 12px */
/* 当前 li 的行高就是 12 * 1.5 = 18 */
</style>
</head>

<body>
<div>周吉瑞</div>
<p>JERRY</p>
<ul>
<li>没有指定文字大小</li>
</ul>
</body>

</html>

优先级

  • 选择器相同,则执行层叠性
  • 选择器不同,则根据选择器权重执行

选择器权重如下表所示:

选择器 选择器权重
继承 或 * 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
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS三大特性之优先级</title>
<style>
div {
color: pink;
}

.test {
color: red;
}

#demo {
color: green;
}
</style>
</head>

<body>
<div class="test">你笑起来真好看</div> <!-- red -->
<div class="test" id="demo">你笑起来真好看</div> <!-- green -->
<div class="test" id="demo" style="color: blue;">你笑起来真好看</div> <!-- blue -->
<!--
假如在 css 选择器 某一个属性值后面跟上 !important,那么这个属性一定会执行!
例如:div {
color: pink !important;
}
...
<div class="test" id="demo" style="color: blue;">你笑起来真好看</div> -- pink --
-->

</body>

</html>

优先级注意问题:

  • 权重是由 4 组数字组成的,但是不会有进位!
  • 可以理解为:类选择器 永远大于 元素选择器ID 选择器 永远大于 类选择器,以此类推!
  • 等级判断 从左到右,如果某一位数值相同,则判断下一位数值
  • 可以简单的记忆:通配符继承 权重为 0,标签选择器 为 1,伪类)选择器为 10,ID 选择器为 100,行内样式表 为 1000,!important 无穷大
  • 继承的权重是 0,不管父元素权重多高,子元素得到的权重都是 0 !
  • a 链接浏览器默认指定了一个样式,所以它不参与继承,所以设置样式需要选中单独设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS三大特性之优先级——注意问题</title>
<style>
/* 父亲的权重是 100 */
#father {
color: red !important;
}

/* p 继承的权重为 0 */
/* 所以以后我们看标签到底执行哪一个样式,就先看这个标签有没有直接被选出来
如果直接被选择出来了,那么就与父亲无关了!*/
p {
color: pink;
}
</style>
</head>

<body>
<!-- 继承的权重是 0,不管父元素权重多高,子元素得到的权重都是 0 -->
<div id="father">
<p>你还是很好看</p> <!-- pink -->
</div>
<!-- a 链接浏览器默认指定了一个样式,所以它不参与继承,所以给 a 改样式必须直接把 a 选出来 -->
<a href="#">我是单独的样式</a>
</body>

</html>

权重的叠加:

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

注意:再次强调!权重虽然会叠加,但一定不会进位!(1万个元素选择器也比不过一个类选择器)。

从左到右逐位比较,只有左一位同样大,才比较右边一位!

例如:

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

如果要对某一元素设置样式,那么就必须给它足够高的权重(注意:是给他,而不是他的父亲!)。

提高选择器权重的技巧之一:

  • 多写几层类选择器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS三大特性之优先级——权重叠加</title>
<style>
/* 复合选择器会有权重叠加的问题 */
/* 权重虽然会叠加,但是永远不会有进位 例如:十个 0,0,0,1 相加为 0,0,0,10 而不是 0,0,1,0 */
/* ul li 权重 0,0,0,1 + 0,0,0,1 = 0,0,0,2 */
ul li {
color: green;
}

/* li 的权重是 0,0,0,1 */
li {
color: red;
}

/* .nav li 权重 0,0,1,0 + 0,0,0,1 = 0,0,1,1 */
.nav li {
color: pink;
}
</style>
</head>

<body>
<ul class="nav">
<li>大猪蹄子</li> <!-- pink -->
<li>大肘子</li> <!-- pink -->
<li>猪尾巴</li> <!-- pink -->
</ul>
</body>

</html>

【CSS盒子模型】

本文档是个人对 Pink 老师课程的总结归纳及补充,转载请注明出处!

页面布局要学习三大核心盒子模型浮动定位

学习好盒子模型能非常好的帮助我们布局页面。

一、看透网页布局的本质

网页布局过程:

  • 先准备好相关的网页元素,网页元素基本都是盒子

  • 利用 CSS 设置好盒子样式,然后摆放到相应位置

  • 往盒子里面装内容

网页布局的核心本质: 就是利用 CSS 摆盒子!

二、盒子模型(Box Model)组成

所谓盒子模型:就是把 HTML 页面中的布局元素看作是一个矩形的盒子,也就是一个盛装内容的容器
CSS 盒子模型本质上是一个盒子,封装周围的 HTML 元素,它包括:边框外边距内边距、和 内容

三、边框(border)

border 可以设置元素的边框。

边框有三部分组成:边框宽度(粗细)边框样式边框颜色

语法:

1
border: border-width || border-style || border-color
属性 作用
border-width 定义边框粗细,单位是 px
border-style 边框的样式
border-color 边框颜色

边框样式 border-style 可以设置如下值:

  • none:没有边框,即忽略所有边框的宽度(默认值)
  • solid:边框为单实线(最为常用的)
  • dashed:边框为虚线
  • dotted:边框为点线

边框简写:

1
border: 1px solid red; 	/* 没有顺序 */

边框分开写法:

1
border-top: 1px solid red; 		/* 只设定上边框,其余同理 */

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>盒子模型之边框的复合写法</title>
<style>
div {
width: 300px;
height: 200px;
/*
-- border-width 边框的粗细,一般情况下使用 px --
border-width: 5px;
-- border-width 边框的样式 solid 实线边框 dashed 虚线边框 dotted 点线边框 --
border-style: solid;
background-color: pink;
*/
/* 边框的复合写法 简写: */
border: 10px dotted skyblue;
/* 利用 CSS 层叠性将上边框单独覆盖 */
border-top: 10px dotted pink;
background-color: black;
}
</style>
</head>

<body>
<div></div>
</body>

</html>

3.1 表格的细线边框

表格中两个单元格相邻的边框会重叠在一起,呈现出加粗的效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>表格边框——今日小说排行榜</title>
<style>
table {
width: 500px;
height: 249px;
}

th {
height: 35px;
}

table,
td,
th {
border: 1px solid black;
/* 合并相邻的边框 */
/* border-collapse: collapse; */
font-size: 14px;
text-align: center;
}
</style>
</head>

<body>
<table align="center" cellspacing="0">
<thead>
<tr>
<th>排名</th>
<th>关键词</th>
<th>趋势</th>
<th>进入搜索</th>
<th>最近七日</th>
<th>相关链接</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>鬼吹灯</td>
<td><img src="down.jpg"></td>
<td>456</td>
<td>123</td>
<td> <a href="#">贴吧</a> <a href="#">图片</a> <a href="#">百科</a> </td>
</tr>

<tr>
<td>1</td>
<td>鬼吹灯</td>
<td><img src="down.jpg"></td>
<td>456</td>
<td>123</td>
<td> <a href="#">贴吧</a> <a href="#">图片</a> <a href="#">百科</a> </td>
</tr>
<tr>
<td>3</td>
<td>西游记</td>
<td><img src="up.jpg"></td>
<td>456</td>
<td>123</td>
<td> <a href="#">贴吧</a> <a href="#">图片</a> <a href="#">百科</a> </td>
</tr>
<tr>
<td>1</td>
<td>鬼吹灯</td>
<td><img src="down.jpg"></td>
<td>456</td>
<td>123</td>
<td> <a href="#">贴吧</a> <a href="#">图片</a> <a href="#">百科</a> </td>
</tr>
<tr>
<td>1</td>
<td>鬼吹灯</td>
<td><img src="down.jpg"></td>
<td>456</td>
<td>123</td>
<td> <a href="#">贴吧</a> <a href="#">图片</a> <a href="#">百科</a> </td>
</tr>
<tr>
<td>1</td>
<td>鬼吹灯</td>
<td><img src="down.jpg"></td>
<td>456</td>
<td>123</td>
<td> <a href="#">贴吧</a> <a href="#">图片</a> <a href="#">百科</a> </td>
</tr>
</tbody>
</table>
</body>

</html>

border-collapse 属性控制浏览器绘制表格边框的方式。

它控制相邻单元格的边框。

语法:

1
border-collapse: collapse;
  • collapse 单词是合并的意思
  • border-collapse: collapse; 表示相邻边框合并在一起
1
2
3
4
5
6
7
8
9
table,
td,
th {
border: 1px solid black;
/* 合并相邻的边框 */
border-collapse: collapse;
font-size: 14px;
text-align: center;
}

3.2 边框会影响盒子实际大小

边框会额外增加盒子的实际区域大小。因此我们有两种方案解决:

  • 测量盒子大小的时候,不量边框
  • 如果测量的时候包含了边框,则需要 width、height 减去边框宽度(注意减单边还是双边)

注意:盒子实际区域大小 = 内容区大小 + 内边距大小 + 边框大小 + 外边距大小

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>边框会影响盒子的实际大小</title>
<style>
/* 我们需要一个 200*200 的盒子, 但是这个盒子有 10 像素的红色边框 */
div {
width: 180px;
height: 180px;
background-color: pink;
border: 10px solid black;
}
</style>
</head>

<body>
<div></div>
</body>

</html>

四、内边距(padding)

padding 属性用于设置内边距,即边框与内容之间的距离

属性 作用
padding-left 左内边距
padding-rigth 右内边距
padding-top 上内边距
padding-bottom 下内边距

padding 属性(简写属性)可以有一到四个值。

值的个数 表达意思
padding: 5px; 1 个值,代表上下左右都有 5 像素内边距
padding: 5px 10px; 2 个值,代表上下内边距是 5 像素,左右内边距是 10 像素
padding: 5px 10px 20px; 3 个值,代码上内边距 5 像素,左右内边距 10 像素,下内边距 20 像素
padding: 5px 10px 20px 30px; 4 个值,上是 5 像素,右 10 像素,下 20 像素,左是 30 像素(顺时针)

以上 4 种情况,我们实际开发都会遇到。

当我们给盒子指定 padding 值之后,发生了 2 件事情:

  • 内容和边框有了距离,添加了内边距
  • padding 影响了盒子实际区域大小

也就是说,如果盒子已经有了宽度和高度,此时再指定内边距,会撑大盒子区域!

解决方案:

  • 如果保证盒子跟效果图大小保持一致,则让 width、height 减去多出来的内边距大小即可
  • 如果盒子本身没有指定 width、height 属性,则此时 padding 不会撑开盒子区域大小

【padding 撑大盒子】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>padding 撑大盒子</title>
<style>
div {
background-color: #000;
width: 100px;
height: 100px;
/* padding: 30px; */
}
</style>
</head>

<body>
<div></div>
</body>

</html>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>padding 撑大盒子</title>
<style>
div {
background-color: #000;
width: 100px;
height: 100px;
padding: 30px;
}
</style>
</head>

<body>
<div></div>
</body>

</html>

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>盒子模型之内边距</title>
<style>
div {
width: 200px;
height: 200px;
background-color: pink;
/*
padding-top: 5px;
padding-rigth: 10px;
padding-bottom: 20px;
padding-rigth: 30px;
*/
/* 内边距复合写法(简写) 上、右、下、左 */
padding: 5px 10px 20px 30px;
/* 由于在对盒子指定高宽后,padding 会撑大盒子 */
/* 所以,此时盒子大小为:240*225 */
/* 注意:这里的“盒子大小”指的是盒子所占据的大小,盒子真实的 width 和 height 依旧是 200px */
}
</style>
</head>

<body>
<div>
盒子内容是 content,盒子内容是 content,盒子内容是 content
</div>
</body>

</html>

padding 的使用技巧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>新浪导航案例-padding影响盒子的好处</title>
<style>
.nav {
height: 41px;
border-top: 3px solid #ff8500;
border-bottom: 1px solid #edeef0;
background-color: #fcfcfc;
line-height: 41px;
}

.nav a {
/* a 属于行内元素,要指定高度,必须要转换为行内块元素 */
display: inline-block;
height: 41px;
/* 没有指定宽度,此时设置 padding 会使盒子内容之间的距离相同 */
padding: 0 20px;
font-size: 12px;
color: #4c4c4c;
text-decoration: none;
}

.nav a:hover {
background-color: #eee;
color: #ff8500;
}
</style>
</head>

<body>
<div class="nav">
<a href="#">设为首页</a>
<a href="#">手机新浪网</a>
<a href="#">移动客户端</a>
<a href="#">登录</a>
<a href="#">微博</a>
<a href="#">博客</a>
<a href="#">邮箱</a>
<a href="#">网站导航</a>
</div>
</body>

</html>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<!doctype html>
<html lang="zh-CN">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>简洁版小米侧边栏案例-padding影响盒子大小计算</title>
<style>
a {
/* 1、把 a 转换为块级元素 */
display: block;
/* 230 - 30(padding-left)= 200 */
width: 200px;
height: 40px;
background-color: #55585a;
font-size: 14px;
color: #fff;
text-decoration: none;
padding-left: 30px;
/* 一个小技巧:单行文字垂直居中的代码,让文字的行高等于盒子的高度 */
line-height: 40px;
}

/* 2、鼠标经过链接变换背景颜色 */
a:hover {
background-color: #ff6700;
}
</style>
</head>

<body>
<a href="#">手机 电话卡</a>
<a href="#">电视 盒子</a>
<a href="#">笔记本 平板</a>
<a href="#">出行 穿戴</a>
<a href="#">智能 路由器</a>
<a href="#">健康 儿童</a>
<a href="#">耳机 音响</a>
</body>

</html>

五、外边距(margin)

margin 属性用于设置外边距,即控制盒子和盒子之间的距离

属性 作用
margin-left 左外边距
margin-right 右外边距
margin-top 上外边距
margin-bottom 下外边距

margin 简写方式代表的意义跟 padding 完全一致。

外边距典型应用:

外边距可以让块级盒子水平居中,但是必须满足两个条件:

  • 盒子必须指定了宽度 width
  • 盒子左右的外边距都设置为 auto
1
.header { width: 960px; margin: 0 auto;}

常见的写法,以下三种都可以:

  • margin-left: auto; margin-right: auto;
  • margin: auto;
  • margin: 0 auto;

注意:以上方法是让块级元素水平居中,行内元素或者行内块元素水平居中给其父元素添加 text-align: center 即可。

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>盒子模型之外边距margin</title>
<style>
div {
width: 200px;
height: 200px;
background-color: pink;
}

/*
.one {
margin-bottom: 20px;
}
*/

.two {
margin-top: 20px;
}
</style>
</head>

<body>
<div class="one">1</div>
<div class="two">2</div>
</body>

</html>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>块级盒子水平居中对齐</title>
<style>
.header {
width: 900px;
height: 200px;
background-color: pink;
/* 上下 100 左右 auto */
margin: 100px auto;
}
</style>
</head>

<body>
<div class="header"></div>
</body>

</html>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>行内元素、行内块元素水平居中对齐</title>
<style>
.header {
width: 900px;
height: 200px;
background-color: pink;
margin: 100px auto;
/* 行内元素或者行内块元素水平居中给其父元素添加 text-align: center 即可 */
text-align: center;
}

/* 这样是不起作用的 */
/*
span {
margin: 0 auto;
}
*/
</style>
</head>

<body>
<div class="header">
<span>里面的文字</span>
</div>
<div class="header">
<img src="../image/icon.png" alt="">
</div>
</body>

</html>

5.1 外边距合并

使用 margin 定义块元素的垂直外边距时,可能会出现外边距的合并。

注意:内边距没有合并一说!浮动的盒子不会发生外边距合并!

主要有两种情况:

  • 相邻块元素垂直外边距的合并
  • 嵌套块元素垂直外边距的塌陷

5.1.1 相邻块元素垂直外边距的合并

当上下相邻的两个块元素(兄弟关系)相遇时,如果上面的元素有下外边距 margin-bottom,下面的元素有上外边距 margin-top ,则他们之间的垂直间距不是 margin-bottommargin-top 之和。而是取两个值中的较大者,这种现象被称为相邻块元素垂直外边距的合并(准确的描述应该是:大的外边距覆盖小的)。

解决方案:

尽量只给一个盒子添加 margin 值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>相邻块元素垂直外边距的合并</title>
<style>
.one {
width: 200px;
height: 200px;
background-color: hotpink;
margin-bottom: 100px;
}

.two {
width: 200px;
height: 200px;
background-color: skyblue;
margin-top: 100px;
}
</style>
</head>

<body>
<div class="one">one</div>
<div class="two">two</div>
</body>

</html>

5.1.2 嵌套块元素垂直外边距的塌陷

对于两个嵌套关系(父子关系)的块元素,当子元素有上外边距,此时父元素会塌陷较大的外边距值(外边距效果显示在父元素之上)。

解决方案:

  • 可以为父元素定义上边框(比如:可以给一个透明 transparent 边框)
  • 可以为父元素定义上内边距
  • 可以为父元素添加 overflow: hidden

还有其他方法,比如浮动、固定,绝对定位的盒子不会有塌陷问题,后面咱们再总结。

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>外边距合并-嵌套块级元素垂直外边距塌陷</title>
<style>
.father {
width: 400px;
height: 400px;
background-color: black;
margin-top: 50px;
}

.son {
width: 200px;
height: 200px;
background-color: pink;
margin-top: 100px;
}
</style>
</head>

<body>
<div class="father">
<div class="son"></div>
</div>
</body>

</html>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>外边距合并-嵌套块级元素垂直外边距塌陷</title>
<style>
.father {
width: 400px;
height: 400px;
background-color: black;
margin-top: 50px;
/* border: 1px solid transparent; */
overflow: hidden;
}

.son {
width: 200px;
height: 200px;
background-color: pink;
margin-top: 100px;
}
</style>
</head>

<body>
<div class="father">
<div class="son"></div>
</div>
</body>

</html>

注意:外边距的合并在利用盒子布局页面的时候是经常发生的!

六、清除内外边距

网页元素很多都带有默认的内外边距,而且不同浏览器默认的也不一致。因此我们在布局前,首先要清除下网页元素的内外边距。

1
2
3
4
* {
padding:0; /* 清除内边距 */
margin:0; /* 清除外边距 */
}

注意:行内元素为了照顾兼容性,尽量只设置左右内外边距,不要设置上下内外边距(某些时候,行内元素对上下内外边距不生效)。但是转换为块级和行内块元素就可以了。

七、案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>综合案例-MI产品模块</title>
<style>
* {
margin: 0;
padding: 0;
}

body {
background-color: #f5f5f5;
}

a {
color: #333;
text-decoration: none;
}

.box {
width: 298px;
height: 415px;
background-color: #fff;
/* 让块级的盒子水平居中对齐 */
margin: 100px auto;
}

.box img {
/* 图片的宽度和父亲一样宽 */
width: 100%;
}

.review {
height: 70px;
font-size: 14px;
/* 因为这个段落没有 width 属性,所以 padding 不会撑开盒子的宽度 */
padding: 0 28px;
/* 因为这个段落有 height 属性,所以 padding-top 会撑大盒子,所以我们用 margin-top */
/* 其实用 padding-top 也可以,但是需要手动减去 top 值,麻烦且不规范 */
margin-top: 30px;
}

.appraise {
font-size: 12px;
color: #b0b0b0;
padding: 0 28px;
margin-top: 20px;
}

.info {
font-size: 14px;
padding: 0 28px;
margin-top: 15px;
}

.info h4 {
display: inline-block;
font-weight: 400;

}

.info span {
color: #ff6700;
}

.info em {
/* 不倾斜 */
font-style: normal;
color: #ebe4e0;
margin: 0 6px 0 15px;
}
</style>
</head>

<body>
<div class="box">
<img src="images/img.jpg" alt="">
<p class="review">快递牛,整体不错蓝牙可以说秒连。红米给力</p>
<div class="appraise">来自于 117384232 的评价</div>
<div class="info">
<h4> <a href="#">Redmi AirDots真无线蓝...</a></h4>
<!-- 特殊元素可以用 em 包裹 -->
<em>|</em>
<span> 99.9元</span>
</div>
</div>
</body>

</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<!doctype html>
<html lang="zh-CN">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>综合案例-快报模板</title>
<style>
* {
margin: 0;
padding: 0;
}

li {
/* 去除列表前的圆点 */
/* 之所以把这条语句单独写,是因为整个页面都需要把 li 的圆点去除 */
list-style: none;
}

.box {
width: 248px;
height: 163px;
border: 1px solid #ccc;
margin: 100px auto;
}

.box h3 {
height: 32px;
border-bottom: 1px dotted #ccc;
font-size: 14px;
font-weight: 400;
line-height: 32px;
/* 由于该盒子带有一个下边框,所以缩进不能使用 margin,否则下边框也会一同缩进,
此处就用 padding。并且此处没有设置 width,所以 padding-left 也不会撑大盒子 */
padding-left: 15px;
}

.box ul li a {
font-size: 12px;
color: #666;
text-decoration: none;
}

.box ul li a:hover {
text-decoration: underline;
}

.box ul li {
height: 23px;
line-height: 23px;
padding-left: 20px;
}

.box ul {
margin-top: 7px;
}
</style>
</head>

<body>
<div class="box">
<h3>品优购快报</h3>
<ul>
<li><a href="#">【特惠】爆款耳机5折秒!</a></li>
<li><a href="#">【特惠】母亲节,健康好礼低至5折!</a></li>
<li><a href="#">【特惠】语音折叠台灯99元!</a></li>
<li><a href="#">【特惠】9.9元3D打印!</a></li>
<li><a href="#">【特惠】格力智能空调立省1000元!</a></li>
</ul>
</div>
</body>

</html>

八、总结

a、布局为啥用不同盒子,我只想用 div?

标签都是有语义的,合理的地方用合理的标签。比如产品标题就用 h,大量文字段落就用 p

b、为啥用辣么多类名?

类名就是给每个盒子起了一个名字,可以更好的找到这个盒子,选取盒子更容易,后期维护也更方便。

c、到底用 margin 还是 padding?

大部分情况两个可以混用,两者各有优缺点,但是根据实际情况,总是有更简单的方法实现。

一般来说,盒子与盒子之间统一用 margin,内容与边框之间用 padding。

d、自己做没有思路?

布局有很多种实现方式,可以开始先模仿大牛的写法,然后再做出自己的风格。

最后一定多运用辅助工具,比如屏幕画笔,PS 等等。

【圆角边框、盒子阴影、文字阴影】

本文档是个人对 Pink 老师课程的总结归纳及补充,转载请注明出处!

一、圆角边框

CSS 3 新增了圆角边框样式。

border-radius 属性用于设置元素的外边框圆角。

语法:

1
border-radius: length;

原理:

border-radius 顾名思义:边框半径。

(椭)圆与边框的交集形成圆角效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>圆角边框</title>
<style>
div {
width: 300px;
height: 150px;
background-color: pink;
border-radius: 24px;
}
</style>
</head>

<body>
<div></div>
</body>

</html>

注意:

  • 参数值可以为数值或百分比的形式
  • 如果是正方形,想要设置为圆形,那么只需要把数值修改为高度或者宽度的一半即可,或者直接写为 50%
  • 如果是个矩形,设置为高度的一半就可以做 “胶囊” 效果了
  • 该属性是一个简写属性,可以跟多个值
    • 四个值:左上角、右上角、右下角、左下角(从左上开始顺时针)
    • 三个值:左上、右上+左下、右下(对角为一组)
    • 两个值:左上+右下、右上+左下(对角为一组)
  • 同时可以对特定角单独设置
    • 左上角:border-top-left-radius
    • 右上角:border-top-right-radius
    • 右下角:border-bottom-right-radius
    • 左下角:border-bottom-left-radius
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>圆角边框常用写法</title>
<style>
.yuanxing {
width: 200px;
height: 200px;
background-color: pink;
/* border-radius: 100px; */
/* 50% 就是宽度和高度的一半 等价于 100px */
border-radius: 50%;
}

.juxing {
width: 300px;
height: 100px;
background-color: pink;
/* 圆角矩形设置为高度的一半 */
border-radius: 50px;
}

.radius {
width: 200px;
height: 200px;
/* border-radius: 10px 20px 30px 40px; */
/* border-radius: 10px 40px; */
border-top-left-radius: 20px;
background-color: pink;
}
</style>
</head>

<body>
1. 圆形的做法:
<div class="yuanxing"></div>
2. 圆角矩形的做法:
<div class="juxing"></div>
3. 可以设置不同的圆角:
<div class="radius"></div>
</body>

</html>

二、盒子阴影

CSS 3 新增了盒子阴影。

box-shadow 属性用于为盒子添加阴影。

语法:

1
box-shadow: h-shadow v-shadow blur spread color inset;
描述
h-shadow 必须。水平阴影的位置,允许负值。
v-shadow 必须。垂直阴影的位置,允许负值。
blur 可选。模糊距离(虚实程度)。
spread 可选。阴影的尺寸(大小)。
color 可选。阴影的颜色,请参阅 CSS 颜色值(阴影多为半透明颜色)。
inset 可选。将外部阴影(outset)改为内部阴影(outset 不能指定,默认为空即可)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>盒子阴影</title>
<style>
div {
width: 200px;
height: 200px;
background-color: salmon;
margin: 100px auto;
/* box-shadow: 10px 10px; */
}

/* 伪类不仅仅可以用于 a 链接,还能用于其他标签 */
/* 原先盒子没有影子,当我们鼠标经过盒子就添加阴影效果 */
div:hover {
box-shadow: 10px 10px 10px -4px rgba(0, 0, 0, .3);
}
</style>
</head>

<body>
<div></div>
</body>

</html>

三边阴影、双边阴影、单边阴影的设置方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>盒子阴影 三边阴影、双边阴影、单边阴影</title>
<style>
div {
width: 100px;
height: 100px;
background-color: #000;
margin: 25px auto;
color: white;
}

.a {
box-shadow: 0 0 25px 5px red;
}

/* 三边阴影就是直接把整个阴影部分往下边移 */
.b {
box-shadow: 0 6px 10px 0 red;
}

/* 两边阴影要用盒子嵌套来解决 */
.c1 {
box-shadow: 0 10px 10px -5px red;
}

.c2 {
width: 100%;
box-shadow: 0 -10px 10px -5px red;
}

/* 单边阴影就是直接把整个阴影部分往下边移,并且减小阴影大小 */
.d {
box-shadow: 0 10px 10px -5px red;
}
</style>
</head>

<body>
<div class="a">四边阴影</div>
<div class="b">三边阴影</div>
<div class="c1">
<div class="c2">两边阴影</div>
</div>
<div class="d">一边阴影</div>
</body>

</html>

三、文字阴影

CSS 3 新增了文字阴影。

text-shadow 属性用于为文本添加阴影。

语法:

1
text-shadow: h-shadow v-shadow blur color;
描述
h-shadow 必须。水平阴影的位置。允许负值。
v-shadow 必须。垂直阴影的位置。允许负值。
blur 可选。模糊的距离(虚实程度)。
color 可选。阴影的颜色。参阅 CSS 颜色值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>文字阴影</title>
<style>
div {
font-size: 50px;
color: salmon;
font-weight: 700;
text-shadow: 5px 5px 6px rgba(0, 0, 0, .3);
}
</style>
</head>

<body>
<div>
你是阴影,我是火影
</div>
</body>

</html>

【CSS浮动】

本文档是个人对 Pink 老师课程的总结归纳及补充,转载请注明出处!

一、浮动(float)

1.1 传统网页布局的三种方式

网页布局的本质:用 CSS 来摆放盒子,把盒子摆放到相应位置。

CSS 提供了三种传统布局方式(简单说就是盒子如何进行排列)。

  • 普通流(标准流)
  • 浮动
  • 定位

这里指的只是传统布局,其实还有一些特殊高级的布局方式。

1.2 标准流(普通流/文档流)

所谓的标准流:就是标签按照规定好的默认方式排列。

  1. 块级元素会独占一行,从上向下顺序排列。
  2. 行内元素会按照顺序,从左到右顺序排列,碰到父元素边缘则自动换行。

以上都是标准流布局,我们前面学习的就是标准流,标准流是最基本的布局方式。

这三种布局方式都是用来摆放盒子的,盒子摆放到合适位置,布局自然就完成了。

注意:实际开发中,一个页面基本都包含了这三种布局方式(后面移动端学习新的布局方式) 。

1.3 为什么需要浮动?

提问:我们用标准流能很方便的实现如下效果吗?

  1. 如何让多个块级盒子(div)水平排列成一行?

比较难,虽然转换为行内块元素可以实现一行显示,但是他们之间会有大的空白缝隙,很难控制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>行内块中间有缝隙</title>
<style>
div {
width: 150px;
height: 200px;
background-color: #d87093;
display: inline-block;
}
</style>
</head>

<body>
<div>1</div>
<div>2</div>
<div>3</div>
</body>

</html>

  1. 如何实现两个盒子的左右对齐?

总结: 有很多的布局效果,标准流没有办法完成,此时就可以利用浮动完成布局。 因为浮动可以改变元素标签默认的排列方式。

浮动最典型的应用:可以让多个块级元素一行内排列显示。

网页布局第一准则:多个块级元素纵向排列找标准流,多个块级元素横向排列找浮动!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>多个块级元素横向排列找浮动</title>
<style>
div {
float: left;
width: 150px;
height: 200px;
background-color: #d87093;
}
</style>
</head>

<body>
<div>1</div>
<div>2</div>
<div>3</div>
</body>

</html>

拓展:浮动的盒子不会发生外边距合并!

1.4 什么是浮动?

float 属性用于创建浮动框,将其移动到一边,直到左边缘或右边缘触及包含块或另一个浮动框的边缘。

语法:

1
选择器 { float: 属性值;}
属性 描述
none 元素不浮动(默认值)
left 元素向左浮动
right 元素向右浮动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>什么是浮动</title>
<style>
.left,
.right {
float: left;
width: 200px;
height: 200px;
background-color: pink;
}
</style>
</head>

<body>
<div class="left">左青龙</div>
<div class="right">右白虎</div>
</body>

</html>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>什么是浮动</title>
<style>
.left,
.right {
float: left;
width: 200px;
height: 200px;
background-color: pink;
}

/* 层叠性 */
.right {
float: right;
}
</style>
</head>

<body>
<div class="left">左青龙</div>
<div class="right">右白虎</div>
</body>

</html>

1.5 浮动特性(重难点)

加了浮动之后的元素,会具有很多特性,需要我们掌握。

  1. 浮动元素会脱离标准流(脱标)
  2. 浮动的元素会一行内显示并且元素顶部对齐
  3. 浮动的元素会具有行内块元素的特性

下面分别解释:

(1)浮动元素会脱离标准流(脱标)

  • 脱离标准普通流的控制(浮) 移动到指定位置(动),(俗称脱标)
  • 浮动的盒子不再保留原先的位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>浮动特性1</title>
<style>
/* 设置了浮动(float)的元素会:
1.脱离标准普通流的控制(浮)移动到指定位置(动)。
2.浮动的盒子不再保留原先的位置 */
.box1 {
float: left;
width: 200px;
height: 200px;
background-color: pink;
}

.box2 {
width: 300px;
height: 300px;
background-color: gray;
}
</style>
</head>

<body>
<div class="box1">浮动的盒子</div>
<div class="box2">标准流的盒子</div>
</body>

</html>

(2)浮动的元素会一行内显示并且元素顶部对齐

  • 如果多个盒子都设置了浮动,则它们会按照属性值一行内显示并且顶端对齐排列。
  • 浮动的元素是互相贴靠在一起的(不会有缝隙),如果父级宽度装不下这些浮动的盒子,多出的盒子会另起一行对齐。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>浮动元素特性-浮动元素一行显示</title>
<style>
div {
float: left;
width: 200px;
height: 200px;
background-color: pink;
}

.two {
background-color: skyblue;
height: 249px;
}

.four {
background-color: skyblue;
}
</style>
</head>

<body>
<div>1</div>
<div class="two">2</div>
<div>3</div>
<div class="four">4</div>
</body>

</html>

(3)浮动的元素会具有行内块元素的特性

任何元素都可以浮动。不管原先是什么模式的元素,添加浮动之后具有行内块元素相似的特性。

  • 块级盒子:没有设置宽度时默认宽度和父级一样宽,但是添加浮动后,它的大小根据内容来决定
  • 行内盒子:宽度默认和内容一样宽,直接设置高宽无效,但是添加浮动后,它的大小可以直接设置
  • 浮动的盒子中间是没有缝隙的,是紧挨着一起的
  • 即:默认宽度由内容决定,同时支持指定高宽,盒子之间无空隙
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>浮动的元素具有行内块元素特点</title>
<style>
/* 任何元素都可以浮动。不管原先是什么模式的元素,添加浮动之后具有行内块元素相似的特性。 */
span,
div {
float: left;
width: 200px;
height: 100px;
background-color: pink;
}

/* 如果行内元素有了浮动,则不需要转换块级\行内块元素就可以直接给高度和宽度 */
p {
float: right;
height: 200px;
background-color: skyblue;
}
</style>
</head>

<body>
<span>span1</span>
<span>span2</span>

<div>div</div>
<p>pppppppppppppp</p>
</body>

</html>

注意:之所以顶部没有对齐,原因是 p 标签自带的外边距 > span div 自带的外边距。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>浮动的元素具有行内块元素特点</title>
<style>
* {
margin: 0px;
}

/* 任何元素都可以浮动。不管原先是什么模式的元素,添加浮动之后具有行内块元素相似的特性。 */
span,
div {
float: left;
width: 200px;
height: 100px;
background-color: pink;
}

/* 如果行内元素有了浮动,则不需要转换块级\行内块元素就可以直接给高度和宽度 */
p {
float: right;
height: 200px;
background-color: skyblue;
}
</style>
</head>

<body>
<span>span1</span>
<span>span2</span>

<div>div</div>
<p>pppppppppppppp</p>
</body>

</html>

1.6 浮动元素经常和标准流父级搭配使用

为了约束浮动元素位置,我们网页布局一般采取的策略是:

先用标准流的父元素排列上下位置,之后内部子元素采取浮动排列左右位置。符合网页布局第一准侧。

应用举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>浮动元素搭配标准流父盒子1</title>
<style>
.box {
width: 1200px;
height: 460px;
background-color: black;
margin: 0 auto;
}

.left {
float: left;
width: 230px;
height: 460px;
background-color: pink;
}

.right {
float: left;
width: 970px;
height: 460px;
background-color: skyblue;
}
</style>
</head>

<body>
<div class="box">
<div class="left">左侧</div>
<div class="right">右侧</div>
</div>
</body>

</html>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>浮动元素搭配标准流父盒子2</title>
<style>
* {
margin: 0;
padding: 0;
}

/* 取消 li 前的圆点 */
li {
list-style: none;
}

.box {
width: 1226px;
height: 285px;
background-color: pink;
/* 让大盒子水平居中 */
margin: 0 auto;
}

.box li {
width: 296px;
height: 285px;
background-color: gray;
float: left;
/* 每个小盒子用右边距隔开 */
margin-right: 14px;
}

/* 取消最后一个小盒子的右外边距 */
/* 这里必须写 .box .last 要注意权重的问题 20 */
.box .last {
margin-right: 0;
}
</style>
</head>

<body>
<ul class="box">
<li>1</li>
<li>2</li>
<li>3</li>
<li class="last">4</li>
</ul>
</body>

</html>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>浮动布局练习3</title>
<style>
.box {
width: 1226px;
height: 615px;
background-color: pink;
margin: 0 auto;
}

.left {
float: left;
width: 234px;
height: 615px;
background-color: gray;
}

.right {
float: left;
width: 992px;
height: 615px;
background-color: skyblue;
}

.right>div {
float: left;
width: 234px;
height: 300px;
background-color: pink;
margin-left: 14px;
margin-bottom: 14px;
}
</style>
</head>

<body>
<div class="box">
<div class="left">左青龙</div>
<div class="right">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>
</div>
</div>
</body>

</html>

二、常见网页布局

2.1 初识常见网页布局

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>常见网页布局</title>
<style>
* {
margin: 0;
padding: 0;
}

li {
list-style: none;
}

.top {
height: 50px;
background-color: gray;
}

.banner {
width: 980px;
height: 150px;
background-color: gray;
margin: 10px auto;
}

.box {
width: 980px;
margin: 0 auto;
height: 300px;
background-color: pink;
}

.box li {
float: left;
width: 237px;
height: 300px;
background-color: gray;
margin-right: 10px;
}

.box .last {
margin-right: 0;
}

/* 只要是通栏的盒子(和浏览器一样宽)不需要指定宽度 */
.footer {
height: 200px;
background-color: gray;
margin-top: 10px;
}
</style>
</head>

<body>
<div class="top">top</div>
<div class="banner">banner</div>
<div class="box">
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li class="last">4</li>
</ul>
</div>
<div class="footer">footer</div>
</body>

</html>

2.2 浮动布局注意点

(1)浮动和标准流的父盒子搭配

先用标准流的父元素排列上下位置,之后内部子元素采取浮动排列左右位置。

(2)一个元素浮动了,理论上其余的兄弟元素也要浮动

一个盒子里面有多个子盒子,如果其中一个盒子浮动了,那么其他兄弟也应该浮动,以防止引起问题。

浮动的盒子只会影响浮动盒子后面的标准流,不会影响前面的标准流。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>浮动注意点</title>
<style>
/* 如果一个子元素浮动了,尽量其他盒子也浮动,这样保证这些子元素一行显示 */
.box {
width: 900px;
height: 300px;
background-color: black;
margin: 0 auto;
}

.damao {
float: left;
width: 200px;
height: 200px;
background-color: palevioletred;
}

.ermao {
float: left;
width: 200px;
height: 150px;
background-color: palegreen;
}

.sanmao {
float: left;
width: 300px;
height: 240px;
background-color: skyblue;
}
</style>
</head>

<body>
<div class="box">
<div class="damao">大毛</div> <!-- float: left; -->
<div class="ermao">二毛</div> <!-- float: left; -->
<div class="sanmao">三毛</div> <!-- float: left; -->
</div>
</body>

</html>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>浮动注意点</title>
<style>
/* 浮动的盒子只会影响浮动盒子后面的标准流,不会影响前面的标准流。 */
/* 大毛为标准流,所以大毛会占据其所在的一行,后面的二毛就算浮动也不会跑到大毛上方!*/
.box {
width: 900px;
height: 300px;
background-color: black;
margin: 0 auto;
}

.damao {
/* float: left; */
width: 200px;
height: 200px;
background-color: palevioletred;
}

.ermao {
float: left;
width: 200px;
height: 150px;
background-color: palegreen;
}

.sanmao {
float: left;
width: 300px;
height: 240px;
background-color: skyblue;
}
</style>
</head>

<body>
<div class="box">
<div class="damao">大毛</div> <!-- 标准流 -->
<div class="ermao">二毛</div> <!-- float: left; -->
<div class="sanmao">三毛</div> <!-- float: left; -->
</div>
</body>

</html>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>浮动注意点</title>
<style>
/* 浮动的盒子只会影响浮动盒子后面的标准流,不会影响前面的标准流。 */
.box {
width: 900px;
height: 300px;
background-color: black;
margin: 0 auto;
}

.damao {
float: left;
width: 200px;
height: 200px;
background-color: palevioletred;
}

.ermao {
/* float: left; */
width: 200px;
height: 150px;
background-color: palegreen;
}

.sanmao {
float: left;
width: 300px;
height: 240px;
background-color: skyblue;
}
</style>
</head>

<body>
<div class="box">
<div class="damao">大毛</div> <!-- float: left; -->
<div class="ermao">二毛</div> <!-- 标准流 -->
<div class="sanmao">三毛</div> <!-- float: left; -->
</div>
</body>

</html>

由于大毛是浮动的,所以原来大毛的位置会空出来,此时二毛就会向上补齐空位,由于二毛高度小于大毛,所以二毛被大毛挡住了,又因为二毛是标准流,所以二毛会占据所在的一行,所以后面浮动的三毛就只能在二毛的底部之下,又由于大毛也是浮动的,所以三毛就会紧贴在大毛右侧。

三、清除浮动

3.1 思考题

我们前面浮动元素有一个标准流的父元素,他们有一个共同的特点,都是有高度的。

但是,所有的父盒子都必须有高度吗?

答案:不一定!比如,一个产品列表,随着时期的不同,产品数量也不同,所需的盒子大小也会随之改变,那么直接固定盒子高度的形式显然就是不行的。再比如,文章之类的盒子,不同的文章字数是不相同的,那么显然盒子也不能直接固定高度。

理想中的状态,让子盒子撑开父亲。有多少孩子,我父盒子就有多高。

但是不给父盒子高度会有问题吗?

答案:会!但有方法解决(清除浮动)。

3.2 为什么需要清除浮动?

由于父级盒子很多情况下不方便给高度,但是子盒子浮动又不占有位置,最后父级盒子高度为 0 时,就会影响下面的标准流盒子。

  • 由于浮动元素不再占用原文档流的位置,所以它会对后面的元素排版产生影响

  • 此时一但父盒子下面有其他盒子,那么布局就会发生严重混乱!

3.3 清除浮动本质

  • 清除浮动的本质是清除浮动元素造成的影响
  • 如果父盒子本身有高度,则不需要清除浮动
  • 清除浮动之后,父级就会根据浮动的子盒子自动检测高度。父级有了高度,就不会影响下面的标准流了

3.4 清除浮动

语法:

1
选择器 { clear: 属性值; }
属性值 描述
left 不允许左侧有浮动元素(清除左侧浮动的影响)
right 不允许右侧有浮动元素(清除右侧浮动的影响)
both 同时清除左右两侧浮动的影响

我们实际工作中,几乎只用 clear: both;

清除浮动的策略是:闭合浮动。

3.5 清除浮动方法

  1. 额外标签法也称为隔墙法,是 W3C 推荐的做法。(实际开发不推荐)
  2. 父级添加 overflow 属性
  3. 父级添加 after 伪元素
  4. 父级添加 双伪元素

3.6 清除浮动 —— 额外标签法

额外标签法也称为隔墙法,是 W3C 推荐的做法。

额外标签法会在浮动元素末尾添加一个空的标签。例如 <div style="clear: both"></div>,或者其他标签(如 <br> 等)。

  • 优点: 通俗易懂,书写方便
  • 缺点: 添加许多无意义的标签,结构化较差

注意: 要求这个新的空标签必须是块级元素

总结:

  • 清除浮动本质是?

清除浮动的本质是清除浮动元素脱离标准流造成的影响。

  • 清除浮动策略是?

闭合浮动。只让浮动在父盒子内部影响,不影响父盒子外面的其他盒子。

  • 额外标签法?

隔墙法,就是在最后一个浮动的子元素后面添加一个额外空标签(块级标签),添加清除浮动样式。

实际工作可能会遇到,但是不常用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>清除浮动之额外标签法</title>
<style>
.box {
width: 800px;
border: 3px solid black;
margin: 0 auto;
}

.damao {
float: left;
width: 300px;
height: 200px;
background-color: salmon;
}

.ermao {
float: left;
width: 200px;
height: 200px;
background-color: skyblue;
}

.footer {
height: 200px;
background-color: gray;
}

.clear {
clear: both;
}
</style>
</head>

<body>
<div class="box">
<div class="damao">大毛</div>
<div class="ermao">二毛</div>
<div class="ermao">二毛</div>
<div class="ermao">二毛</div>
<div class="ermao">二毛</div>
<div class="clear"></div>
<!-- 这个新增的盒子要求必须是块级元素不能是行内元素 -->
<!-- <span class="clear"></span> -->
</div>
<div class="footer"></div>

</body>

</html>

3.7 清除浮动 —— 父级添加 overflow

可以给父级添加 overflow 属性,将其属性值设置为 hiddenautoscroll

子不教,父之过,注意是给父元素添加代码。

  • 优点:代码简洁
  • 缺点:无法显示溢出的部分
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>overflow清除浮动</title>
<style>
.box {
/* 清除浮动 */
overflow: hidden;
width: 800px;
border: 1px solid blue;
margin: 0 auto;
}

.damao {
float: left;
width: 300px;
height: 200px;
background-color: purple;
}

.ermao {
float: left;
width: 200px;
height: 200px;
background-color: pink;
}

.footer {
height: 200px;
background-color: black;
}
</style>
</head>

<body>
<div class="box">
<div class="damao">大毛</div>
<div class="ermao">二毛</div>
</div>
<div class="footer"></div>

</body>

</html>

3.8 清除浮动 —— :after 伪元素法

:after 方式是额外标签法的升级版,也是给父元素添加代码。

原理:自动在父盒子里的末尾添加一个 行内盒子,我们将它转换为 块级盒子,就间接实现了额外标签法。

1
2
3
4
5
6
7
8
9
10
11
12
.clearfix:after {
content: "";
display: block;
height: 0;
clear: both;
visibility: hidden;
}

.clearfix {
/* IE6、7 专有 */
*zoom: 1;
}

注意:类名不一定非要是 clearfix,但是还是推荐这么写以提高可读性。

  • 优点:没有增加标签,结构更简单
  • 缺点:需要单独照顾低版本浏览器
  • 代表网站: 百度、淘宝网、网易等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>伪元素清除浮动</title>
<style>
.clearfix:after {
content: "";
display: block;
height: 0;
clear: both;
visibility: hidden;
}

.clearfix {
/* IE6、7 专有 */
*zoom: 1;
}

.box {
width: 800px;
border: 1px solid blue;
margin: 0 auto;
}

.damao {
float: left;
width: 300px;
height: 200px;
background-color: purple;
}

.ermao {
float: left;
width: 200px;
height: 200px;
background-color: pink;
}

.footer {
height: 200px;
background-color: black;
}
</style>
</head>

<body>
<div class="box clearfix">
<div class="damao">大毛</div>
<div class="ermao">二毛</div>
</div>
<div class="footer"></div>

</body>

</html>

3.9 清除浮动 —— 双伪元素清除浮动

额外标签法的升级版,也是给给父元素添加代码。

原理:自动在父盒子里的两端添加两个行内盒子,并把它们转换为 表格,间接实现了额外标签法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.clearfix:before,
.clearfix:after {
content: "";
display: table;
}

.clearfix:after {
clear: both;
}

.clearfix {
/* IE6、7 专有 */
*zoom:1;
}

注意:类名不一定非要是 clearfix,但是还是推荐这么写以提高可读性。

  • 优点:代码更简洁

  • 缺点:需要单独照顾低版本浏览器

  • 代表网站:小米、腾讯等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>双伪元素清除浮动</title>
<style>
.clearfix:before,
.clearfix:after {
content: "";
display: table;
}

.clearfix:after {
clear: both;
}

.clearfix {
*zoom: 1;
}

.box {
width: 800px;
border: 1px solid blue;
margin: 0 auto;
}

.damao {
float: left;
width: 300px;
height: 200px;
background-color: purple;
}

.ermao {
float: left;
width: 200px;
height: 200px;
background-color: pink;
}

.footer {
height: 200px;
background-color: black;
}
</style>
</head>

<body>
<div class="box clearfix">
<div class="damao">大毛</div>
<div class="ermao">二毛</div>
</div>
<div class="footer"></div>

</body>

</html>

3.10 清除浮动总结

为什么需要清除浮动?

  • 父级没高度
  • 子盒子浮动了
  • 影响下面布局了,我们就应该清除浮动了
清除浮动的方式 优点 缺点
额外标签法(隔墙法) 通俗易懂,书写方便 添加许多无意义的标签,结构化较差
父级 overflow: hidden; 书写简单 溢出隐藏
父级 after 伪元素 结构语义化正确 由于 IE6~7 不支持 :after,兼容性问题
父级双伪元素 结构语义化正确 由于 IE6~7 不支持 :after,兼容性问题

after 伪元素、双伪元素 清除浮动的原理将在后面的 CSS3 中解释。

【学成在线案例】

本文档是个人对 Pink 老师课程的总结归纳及补充,转载请注明出处!

一、准备素材和工具

  • 学成在线 PSD 源文件

  • 开发工具 = PS(切图)+ VSCode(代码)+ Chrome(测试)

二、案例准备工作

我们本次采取结构与样式相分离思想:

  1. 创建 study 目录文件夹(用于存放我们这个页面的相关内容)
  2. study 目录内新建 images 文件夹,用于保存图片
  3. 新建首页文件 index.html(以后我们网站首页统一规定为 index.html
  4. 新建 style.css 样式文件作为我们本次采用的外链样式表
  5. 将样式引入到我们的 HTML 页面文件中
  6. 样式表写入清除内外边距的样式,来检测样式表是否引入成功

三、CSS属性书写顺序

建议遵循以下顺序:

  1. 布局定位属性:display / position / float / clear / visibility / overflow(建议 display 第一个写,毕竟关系到模式)

  2. 自身属性:width / height / margin / padding / border / background

  3. 文本属性:color / font / text-decoration / text-align / vertical-align / white- space / break-word

  4. 其他属性(CSS3):content / cursor / border-radius / box-shadow / text-shadow / background:linear-gradient …

1
2
3
4
5
6
7
8
9
10
11
12
13
.jdc {
display: block;
position: relative;
float: left;
width: 100px;
height: 100px;
margin: 0 10px;
padding: 20px 0;
font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif;
color: #333;
background: rgba(0,0,0,.5);
border-radius: 10px;
}

四、页面布局分析

为了提高网页制作的效率,布局时通常有以下的布局流程:

  1. 必须确定页面的版心(可视区),我们测量可得知

  2. 分析页面中的行模块,以及每个行模块中的列模块。其实页面布局,就是一行行罗列而成的

  3. 制作 HTML 结构。我们还是遵循,先有结构,后有样式的原则。结构永远最重要

  4. 开始运用盒子模型的原理,通过 div + CSS 布局来控制网页的各个模块

五、确定版心

这个页面的版心是 1200 像素,每个版心都要水平居中对齐,可以定义版心为公共类:

1
2
3
4
.w {
width: 1200px;
margin: auto;
}

六、头部制作

  • 1 号是版心盒子 header 1200 * 42 的盒子水平居中对齐,上下给一个 margin 值就可以
  • 版心盒子里面包含 2 号盒子 logo
  • 版心盒子里面包含 3 号盒子 nav 导航栏
  • 版心盒子里面包含 4 号盒子 search 搜索框
  • 版心盒子里面包含 5 号盒子 user 个人信息
  • 注意:要求里面的 4 个盒子必须都是浮动

导航栏注意点:

实际开发中,我们不会直接用链接 a 而是用 li 包含链接(li + a)的做法。

  1. li + a 语义更清晰,一看这就是有条理的列表型内容
  2. 如果直接用 a,搜索引擎容易辨别为有堆砌关键字嫌疑(故意堆砌关键字有被搜索引擎降权的风险),从而影响网站排名

七、banner 制作

  • 1 号盒子是通栏的大盒子 banner,不给宽度,给高度,给一个蓝色背景
  • 2 号盒子是版心,要水平居中对齐
  • 3 号盒子版心内,左对齐 subnav 侧导航栏
  • 4 号盒子版心内,右对齐 course 课程

八、精品推荐小模块

  • 大盒子水平居中 goods 精品,注意此处有个盒子阴影
  • 1 号盒子是标题 h3 左侧浮动
  • 2 号盒子里面放链接左侧浮动, goods-item 距离可以控制链接的左右外边距(注意行内元素只给左右内外边距)
  • 3 号盒子右浮动 mod 修改

九、精品推荐大模块

  • 1 号盒子为最大的盒子, box 版心水平居中对齐
  • 2 号盒子为上面部分,box-hd 里面左侧标题 h3 左浮动,右侧链接 a 右浮动
  • 3 号盒子为底下部分,box-bd 里面是无序列表,有 10 个小 li 组成
  • li 最右侧外边距的问题,这里有个小技巧:给 box-bd 里的 ul 宽度为 1215 就可以一行装开 5li,因为 ul 为块级元素,当块级元素宽度大于父元素宽度时,块级元素不会自动换行。

复习点:我们用到清除浮动,因为 box-hd 里面的盒子个数不一定是多少,所以我们就不给高度了,但是里面的盒子浮动会影响下面的布局,因此需要清除浮动。

十、底部模块

  • 1 号盒子是通栏大盒子,底部 footer 给高度,底色是白色
  • 2 号盒子版心水平居中
  • 3 号盒子版权 copyright 左对齐
  • 4 号盒子链接组 links 右对齐

十一、代码

  • index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
<!doctype html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>学成在线首页</title>
<link rel="stylesheet" href="style.css">
</head>

<body>
<!-- 1.头部区域开始啦 -->
<div class="header w">
<!-- logo部分 -->
<div class="logo">
<img src="images/logo.png" alt="">
</div>
<!-- 导航栏部分 nav -->
<div class="nav">
<ul>
<li><a href="#">首页</a></li>
<li><a href="#">课程</a></li>
<li><a href="#">职业规划</a></li>
</ul>
</div>
<!-- 搜索模块 -->
<div class="search">
<input type="text" value="输入关键词">
<button></button>
</div>
<!-- 用户模块 -->
<div class="user">
<img src="images/user.png" alt="" style="vertical-align: middle;">
qq-lilei
</div>
</div>
<!-- 头部区域结束啦 -->
<!-- 2. banner部分start -->
<div class="banner">
<!-- 版心 -->
<div class="w">
<div class="subnav">
<ul>
<li><a href="#">前端开发 <span> &gt; </span></a></li>
<li><a href="#">前端开发 <span> &gt; </span> </a></li>
<li><a href="#">前端开发 <span> &gt; </span> </a></li>
<li><a href="#">前端开发 <span> &gt; </span> </a></li>
<li><a href="#">前端开发 <span> &gt; </span> </a></li>
<li><a href="#">前端开发 <span> &gt; </span> </a></li>
<li><a href="#">前端开发 <span> &gt; </span> </a></li>
<li><a href="#">前端开发 <span> &gt; </span> </a></li>
<li><a href="#">前端开发 <span> &gt; </span> </a></li>
</ul>
</div>

<!-- course 课程表模块 -->
<div class="course">
<h2>我的课程表</h2>
<div class="bd">
<ul>
<li>
<h4>继续学习 程序语言设计</h4>
<p>正在学习-使用对象</p>
</li>
<li>
<h4>继续学习 程序语言设计</h4>
<p>正在学习-使用对象</p>
</li>
<li>
<h4>继续学习 程序语言设计</h4>
<p>正在学习-使用对象</p>
</li>
</ul>

<a href="#" class="more">全部课程</a>
</div>
</div>
</div>
</div>
<!-- banner部分end -->
<!-- 3.精品推荐模块开始 -->
<div class="goods w">
<h3>精品推荐</h3>
<ul>
<li><a href="#">jQuery</a></li>
<li><a href="#">jQuery</a></li>
<li><a href="#">jQuery</a></li>
<li><a href="#">jQuery</a></li>
<li><a href="#">jQuery</a></li>
</ul>
<a href="#" class="mod">修改兴趣</a>
</div>
<!-- 精品推荐模块结束 -->
<!-- 4. box核心内容区域开始 -->
<div class="box w">
<div class="box-hd">
<h3>精品推荐</h3>
<a href="#">查看全部</a>
</div>
<div class="box-bd">
<ul class="clearfix">
<li>
<img src="images/pic.png" alt="">
<h4>
Think PHP 5.0 博客系统实战项目演练
</h4>
<div class="info">
<span>高级</span> • 1125人在学习
</div>
</li>
<li>
<img src="images/pic.png" alt="">
<h4>
Think PHP 5.0 博客系统实战项目演练
</h4>
<div class="info">
<span>高级</span> • 1125人在学习
</div>
</li>
<li>
<img src="images/pic.png" alt="">
<h4>
Think PHP 5.0 博客系统实战项目演练
</h4>
<div class="info">
<span>高级</span> • 1125人在学习
</div>
</li>
<li>
<img src="images/pic.png" alt="">
<h4>
Think PHP 5.0 博客系统实战项目演练
</h4>
<div class="info">
<span>高级</span> • 1125人在学习
</div>
</li>
<li>
<img src="images/pic.png" alt="">
<h4>
Think PHP 5.0 博客系统实战项目演练
</h4>
<div class="info">
<span>高级</span> • 1125人在学习
</div>
</li>
<li>
<img src="images/pic.png" alt="">
<h4>
Think PHP 5.0 博客系统实战项目演练
</h4>
<div class="info">
<span>高级</span> • 1125人在学习
</div>
</li>
<li>
<img src="images/pic.png" alt="">
<h4>
Think PHP 5.0 博客系统实战项目演练
</h4>
<div class="info">
<span>高级</span> • 1125人在学习
</div>
</li>
<li>
<img src="images/pic.png" alt="">
<h4>
Think PHP 5.0 博客系统实战项目演练
</h4>
<div class="info">
<span>高级</span> • 1125人在学习
</div>
</li>
<li>
<img src="images/pic.png" alt="">
<h4>
Think PHP 5.0 博客系统实战项目演练
</h4>
<div class="info">
<span>高级</span> • 1125人在学习
</div>
</li>
<li>
<img src="images/pic.png" alt="">
<h4>
Think PHP 5.0 博客系统实战项目演练
</h4>
<div class="info">
<span>高级</span> • 1125人在学习
</div>
</li>

</ul>
</div>
</div>
<!-- 4. box核心内容区域结束 -->

<!-- 5. footer 模块制作 -->
<div class="footer">
<div class="w clearfix">
<div class="copyright">
<img src="images/logo.png" alt="">
<p>学成在线致力于普及中国最好的教育它与中国一流大学和机构合作提供在线课程。<br>
© 2017年XTCG Inc.保留所有权利。-沪ICP备15025210号</p>
<a href="#" class="app">下载APP</a>
</div>
<div class="links">
<dl>
<dt>关于学成网</dt>
<dd><a href="#">关于</a></dd>
<dd><a href="#">管理团队</a></dd>
<dd><a href="#">工作机会</a></dd>
<dd><a href="#">客户服务</a></dd>
<dd><a href="#">帮助</a></dd>
</dl>
<dl>
<dt>关于学成网</dt>
<dd><a href="#">关于</a></dd>
<dd><a href="#">管理团队</a></dd>
<dd><a href="#">工作机会</a></dd>
<dd><a href="#">客户服务</a></dd>
<dd><a href="#">帮助</a></dd>
</dl>
<dl>
<dt>关于学成网</dt>
<dd><a href="#">关于</a></dd>
<dd><a href="#">管理团队</a></dd>
<dd><a href="#">工作机会</a></dd>
<dd><a href="#">客户服务</a></dd>
<dd><a href="#">帮助</a></dd>
</dl>
</div>
</div>
</div>
</body>

</html>
  • style.css
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
* {
margin: 0;
padding: 0;
}

.w {
width: 1200px;
margin: auto;
}

body {
background-color: #f3f5f7;
}

li {
list-style: none;
}

a {
text-decoration: none;
}

.clearfix:before,
.clearfix:after {
content: "";
display: table;
}

.clearfix:after {
clear: both;
}

.clearfix {
*zoom: 1;
}

.header {
height: 42px;
/* background-color: pink; */
/* 注意此地方会层叠 w 里面的 margin,所以要把 auto 也加上 */
margin: 30px auto;
}

.logo {
float: left;
width: 198px;
height: 42px;
}

.nav {
float: left;
margin-left: 60px;
}

/* 此处给 li 里面的 a 设置边距,又给 li 设置边距,
原因是为了使 a:hover 的下划线长度合理
下划线长度占据 a 标签的宽度+内边距宽度 */

.nav ul li {
float: left;
margin: 0 15px;
}

.nav ul li a {
display: block;
height: 42px;
padding: 0 10px;
line-height: 42px;
font-size: 18px;
color: #050505;
}

.nav ul li a:hover {
border-bottom: 2px solid #00a4ff;
color: #00a4ff;
}

/* search搜索模块 */
.search {
float: left;
width: 412px;
height: 42px;
margin-left: 70px;
}

.search input {
float: left;
width: 345px;
height: 40px;
border: 1px solid #00a4ff;
border-right: 0;
color: #bfbfbf;
font-size: 14px;
padding-left: 15px;
}

.search button {
float: left;
width: 50px;
height: 42px;
/* 按钮button默认有个边框需要我们手动去掉 */
border: 0;
background: url(images/btn.png);
}

.user {
float: right;
/* 行高 = header 高度,使文本上下居中 */
line-height: 42px;
margin-right: 30px;
font-size: 14px;
color: #666;
}

/* banner区域 */
.banner {
height: 421px;
background-color: #1c036c;
}

.banner .w {
height: 421px;
background: url(images/banner2.png) no-repeat top center;
}

.subnav {
float: left;
width: 190px;
height: 421px;
background: rgba(0, 0, 0, 0.3);
}

.subnav ul li {
height: 45px;
line-height: 45px;
padding: 0 20px;
}

.subnav ul li a {
font-size: 14px;
color: #fff;
}

.subnav ul li a span {
float: right;
}

.subnav ul li a:hover {
color: #00a4ff;
}

.course {
float: right;
width: 230px;
height: 300px;
background-color: #fff;
/* 浮动的盒子不会有外边距合并的问题 */
margin-top: 50px;
}

.course h2 {
height: 48px;
background-color: #9bceea;
text-align: center;
line-height: 48px;
font-size: 18px;
color: #fff;
}

.bd {
padding: 0 20px;
}

.bd ul li {
padding: 14px 0;
border-bottom: 1px solid #ccc;
}

.bd ul li h4 {
font-size: 16px;
color: #4e4e4e;
}

.bd ul li p {
font-size: 12px;
color: #a5a5a5;
}

.bd .more {
display: block;
height: 38px;
border: 1px solid #00a4ff;
margin-top: 5px;
text-align: center;
line-height: 38px;
color: #00a4ff;
font-size: 16px;
font-weight: 700;
}

/* 精品推荐模块 */
.goods {
height: 60px;
background-color: #fff;
margin-top: 10px;
box-shadow: 0px 20px 20px -15px rgba(0, 0, 0, 0.1);
/* 行高会继承, 会继承给3个孩子 */
line-height: 60px;
}

.goods h3 {
float: left;
margin-left: 30px;
font-size: 16px;
color: #00a4ff;
}

.goods ul {
float: left;
margin-left: 30px;
}

.goods ul li {
float: left;
}

.goods ul li a {
padding: 0 30px;
font-size: 16px;
color: #050505;
border-left: 1px solid #ccc;
}

.mod {
float: right;
margin-right: 30px;
font-size: 14px;
color: #00a4ff;
}

.box {
margin-top: 30px;
}

.box-hd {
height: 45px;
}

.box-hd h3 {
float: left;
font-size: 20px;
color: #494949;
}

.box-hd a {
float: right;
font-size: 12px;
color: #a5a5a5;
margin-top: 10px;
margin-right: 30px;
}

/* 把 li 的父亲 ul 修改的足够宽一行能装开 5 个盒子就不会换行了,
这样的方式有效的解决了每行最后一个盒子右边距的问题 */
.box-bd ul {
width: 1225px;
}

.box-bd ul li {
float: left;
width: 228px;
height: 270px;
background-color: #fff;
margin-right: 15px;
margin-bottom: 15px;

}

.box-bd ul li img {
width: 100%;
}

.box-bd ul li h4 {
margin: 20px 20px 20px 25px;
font-size: 14px;
color: #050505;
font-weight: 400;
}

.box-bd .info {
margin: 0 20px 0 25px;
font-size: 12px;
color: #999;
}

.box-bd .info span {
color: #ff7c2d;
}

/* footer 模块 */
.footer {
height: 415px;
background-color: #fff;
}

.footer .w {
/* 注意:此处对 footer 里的 w 设置 margin 会发生外边距塌陷,
因为,w 包含在 footer 中,w 的上外边距为 35px,footer 的外边距为 0px,
此时发生外边距塌陷,父元素塌陷较大的外边距值 35px
/* margin-top: 35px; */
padding-top: 35px;
/* padding 不会发生边距合并 */
}

.copyright {
float: left;
}

.copyright p {
font-size: 12px;
color: #666;
margin: 20px 0 15px 0;
}

.copyright .app {
display: block;
width: 118px;
height: 33px;
border: 1px solid #00a4ff;
text-align: center;
line-height: 33px;
color: #00a4ff;
font-size: 16px;
}

.links {
float: right;
}

.links dl {
float: left;
margin-left: 100px;
}

.links dl dt {
font-size: 16px;
color: #333;
margin-bottom: 5px;
}

.links dl dd a {
color: #333;
font-size: 12px;
}
  • 效果图