思维导图 [一]

传统布局和flex布局对比

传统布局特点

兼容性好

布局繁琐

局限性,不能再移动端很好的布局

flex布局特点

操作方便,布局极其简单,移动端使用比较广泛

pc端浏览器支持情况比较差

IE11或更低版本不支持flex或仅支持部分

建议

移动端 或者 PC端不需要兼容低版本浏览器 就可以使用用flex布局

flex布局原理

给父盒子设置display:flex;来控制子元素的排列方式

flex布局注意事项

使用flex布局就不要使用浮动、vertical-align,这两个样式会失效

flex布局中没有X轴和Y轴的概念

主轴和交叉轴是相对的,可以变换的。主轴方向是横的,交叉轴方向就是竖的。主轴方向是竖的,交叉轴方向就是横的

主轴相关配置

注意事项

1.主轴侧轴相关配置要写到父盒子中

flex-direction

功能和注意事项

功能:设置主轴的方向

注意事项:主轴和交叉轴是相对的,可以变换的。主轴是横的,交叉轴就是竖的,主轴是竖的,交叉轴就是横的

取值范围

说明
row(默认)主轴为横轴,子元素横着排列(默认,常用)
column主轴为纵轴,子元素竖着排列

flex-direction:row(默认值,常用)

主轴为横轴,子元素横着排列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<style>
.box {
/* 在父盒子中通过display: flex启用flex布局,用来控制子盒子的排列 */
display: flex;
/* 设置主轴排列方向为横轴,那么子元素会横着排列 */
flex-direction: row;
width: 100px;
height: 100px;
background-color: burlywood;
}
.box > span {
width: 40px;
height: 40px;
background-color: coral;
}
</style>

<div class="box">
<span>1</span>
<span>2</span>
</div>

1623660908216(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623660908216.png)

flex-direction:column (偶尔用)

主轴为纵轴,子元素从上到下排列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<style>
.box {
/* 在父盒子中通过display: flex启用flex布局,用来控制子盒子的排列 */
display: flex;
/* 设置主轴排列方向为纵轴,那么子元素竖着排列 */
flex-direction: column;
width: 100px;
height: 100px;
background-color: burlywood;
}
.box > span {
width: 40px;
height: 40px;
background-color: coral;
}
</style>

<div class="box">
<span>1</span>
<span>2</span>
</div>

1623661237965(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623661237965.png)

justify-content

功能

设置主轴上的子元素排列方式

取值范围

说明
flex-start(默认)从主轴头部开始排列
flex-end从主轴尾部开始排列
center居中显示
space-around平分剩余空间
space-between先两边贴边,再平分剩余空间

justify-content:flext-start(默认)

主轴为横轴时,从左向右排列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<style>
.box {
/* 在父盒子中通过display: flex启用flex布局,用来控制子盒子的排列 */
display: flex;
/* 设置主轴排列方向为横轴 */
flex-direction: row;
/* 设置主轴排列方式,因为主轴方向为横轴,flex-start表示从头部开始排列,所以排列方式为从左到右 */
justify-content: flex-start;
width: 100px;
height: 100px;
background-color: burlywood;
}
.box > span {
width: 40px;
height: 40px;
background-color: coral;
}
</style>

<div class="box">
<span>1</span>
<span>2</span>
</div>

1623662578223(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623662578223.png)

主轴为纵轴时,从上向下排列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<style>
.box {
/* 在父盒子中通过display: flex启用flex布局,用来控制子盒子的排列 */
display: flex;
/* 设置主轴排列方向为横轴 */
flex-direction: column;
/* 设置主轴排列方式,因为主轴方向为纵轴,flex-start表示从头部位置排列,头部位置在上,所以排列方式为从上到下 */
justify-content: flex-start;
width: 100px;
height: 100px;
background-color: burlywood;
}
.box > span {
width: 40px;
height: 40px;
background-color: coral;
}
</style>

<div class="box">
<span>1</span>
<span>2</span>
</div>

1623662675756(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623662675756.png)

justify-content:flex-end

主轴为横轴时,从右向左排列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<style>
.box {
/* 在父盒子中通过display: flex启用flex布局,用来控制子盒子的排列 */
display: flex;
/* 设置主轴排列方向为横轴 */
flex-direction: row;
/* 设置主轴排列方式,因为主轴方向为横轴,所以排列方式为从右到左 */
justify-content: flex-end;
width: 100px;
height: 100px;
background-color: burlywood;
}
.box > span {
width: 40px;
height: 40px;
background-color: coral;
}
</style>

<div class="box">
<span>1</span>
<span>2</span>
</div>

1623662791509(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623662791509.png)

主轴为纵轴时,从下向上排列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<style>
.box {
/* 在父盒子中通过display: flex启用flex布局,用来控制子盒子的排列 */
display: flex;
/* 设置主轴排列方向为横轴 */
flex-direction: column;
/* 设置主轴排列方式,因为主轴方向为纵轴,所以排列方式为从下到上 */
justify-content: flex-end;
width: 100px;
height: 100px;
background-color: burlywood;
}
.box > span {
width: 40px;
height: 40px;
background-color: coral;
}
</style>


<div class="box">
<span>1</span>
<span>2</span>
</div>

1623662870094(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623662870094.png)

justify-content: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>Document</title>
<style>
.box {
/* 在父盒子中通过display: flex启用flex布局,用来控制子盒子的排列 */
display: flex;
/* 设置主轴排列方向为横轴 */
flex-direction: row;
/* 设置主轴排列方式,因为主轴方向为横轴,所以子元素在横轴居中显示 */
justify-content: center;
width: 100px;
height: 100px;
background-color: burlywood;
}
.box > span {
width: 40px;
height: 40px;
background-color: coral;
}
</style>
</head>
<body>
<div class="box">
<span>1</span>
<span>2</span>
</div>
</body>
</html>

1623663027777(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623663027777.png)

主轴为纵向时,上下居中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<style>
.box {
/* 在父盒子中通过display: flex启用flex布局,用来控制子盒子的排列 */
display: flex;
/* 设置主轴排列方向为横轴 */
flex-direction: column;
/* 设置主轴排列方式,因为主轴方向为纵轴,所以子元素在纵轴居中显示 */
justify-content: center;
width: 100px;
height: 100px;
background-color: burlywood;
}
.box > span {
width: 40px;
height: 40px;
background-color: coral;
}
</style>

<div class="box">
<span>1</span>
<span>2</span>
</div>

1623663076952(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623663076952.png)

justify-content:space-around(常用)

主轴为横轴时

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>Document</title>
<style>
.box {
/* 在父盒子中通过display: flex启用flex布局,用来控制子盒子的排列 */
display: flex;
/* 设置主轴排列方向为横轴 */
flex-direction: row;
/* 设置主轴排列方式 */
justify-content: space-around;
width: 100px;
height: 100px;
background-color: burlywood;
}
.box > span {
width: 40px;
height: 40px;
background-color: coral;
}
</style>
</head>
<body>
<div class="box">
<span>1</span>
<span>2</span>
</div>
</body>
</html>

1623663358530(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623663358530.png)

主轴为纵轴时

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>Document</title>
<style>
.box {
/* 在父盒子中通过display: flex启用flex布局,用来控制子盒子的排列 */
display: flex;
/* 设置主轴排列方向为横轴 */
flex-direction: column;
/* 设置主轴排列方式 */
justify-content: space-around;
width: 100px;
height: 100px;
background-color: burlywood;
}
.box > span {
width: 40px;
height: 40px;
background-color: coral;
}
</style>
</head>
<body>
<div class="box">
<span>1</span>
<span>2</span>
</div>
</body>
</html>

1623663442172(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623663442172.png)

justify-content:space-between(常用)

主轴为横轴时

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>Document</title>
<style>
.box {
/* 在父盒子中通过display: flex启用flex布局,用来控制子盒子的排列 */
display: flex;
/* 设置主轴排列方向为横轴 */
flex-direction: row;
/* 设置主轴排列方式 */
justify-content: space-between;
width: 100px;
height: 100px;
background-color: burlywood;
}
.box > span {
width: 40px;
height: 40px;
background-color: coral;
}
</style>
</head>
<body>
<div class="box">
<span>1</span>
<span>2</span>
</div>
</body>
</html>

1623663674550(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623663674550.png)

主轴为纵轴时

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>Document</title>
<style>
.box {
/* 在父盒子中通过display: flex启用flex布局,用来控制子盒子的排列 */
display: flex;
/* 设置主轴排列方向为横轴 */
flex-direction: column;
/* 设置主轴排列方式 */
justify-content: space-between;
width: 100px;
height: 100px;
background-color: burlywood;
}
.box > span {
width: 40px;
height: 40px;
background-color: coral;
}
</style>
</head>
<body>
<div class="box">
<span>1</span>
<span>2</span>
</div>
</body>
</html>

1623663733543(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623663733543.png)

flex-wrap

功能

设置子元素是否换行

取值范围

说明
wrap换行(常用)
nowrap不换行(默认)

flex-wrap:wrap(常用)

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>Document</title>
<style>
.box {
/* 在父盒子中通过display: flex启用flex布局,用来控制子盒子的排列 */
display: flex;
/* 设置主轴排列方向为横轴 */
flex-direction: row;
/* 设置主轴排列方式 */
justify-content: flex-start;
/* 子元素放不下就换行 */
flex-wrap: wrap;
width: 100px;
height: 100px;
background-color: burlywood;
}
.box > span {
width: 40px;
height: 40px;
background-color: coral;
}
</style>
</head>
<body>
<div class="box">
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
</div>
</body>
</html>

1623664075692(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623664075692.png)

flex-wrap:nowrap

内容会挤到一块,子元素设置的宽度或高度会失效。

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>Document</title>
<style>
.box {
/* 在父盒子中通过display: flex启用flex布局,用来控制子盒子的排列 */
display: flex;
/* 设置主轴排列方向为横轴 */
flex-direction: row;
/* 设置主轴排列方式 */
justify-content: flex-start;
/* 子元素放不下就换行 */
flex-wrap: nowrap;
width: 100px;
height: 100px;
background-color: burlywood;
}
.box > span {
width: 40px;
height: 40px;
background-color: coral;
}
</style>
</head>
<body>
<div class="box">
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
</div>
</body>
</html>

1623664134543(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623664134543.png)

交叉轴(侧轴)相关配置

交叉轴和主轴是垂直关系,主轴为横向,交叉轴为纵向。主轴为纵向,交叉轴为横向。

注意事项

交叉轴的相关配置也是写在父盒子中。

align-items 设置侧轴上的子元素的排列方式(主轴不换行)

功能

设置侧轴上的子元素排列方式

取值范围

说明
stretch(默认)侧轴内容拉伸显示
flex-start从侧轴尾部开始排列
flex-end从侧轴尾部开始排列
center居中显示

在线演示地址

https://www.runoob.com/try/playit.php?f=playcss_align-items&preval=stretch

align-items:flex-start

1623682847928(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623682847928.png)

align-items:flex-end

1623682935504(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623682935504.png)

align-items:center

1623682976427(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623682976427.png)

align-items:stretch

1623683036038(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623683036038.png)

align-content 设置侧轴上的子元素的排列方式(主轴换行)

功能

设置子项在侧轴上的排列方式

注意事项

主轴必须换行,flex-wrap:的值是wrap

取值范围

说明
flex-start默认值,在侧轴的头部开始排列
flex-end在侧轴的尾部开始排列
center在侧轴中间显示
space-around子项在侧轴平分剩余空间
space-between子项在侧轴先贴边,剩下的平分剩余空间

在线演示地址

https://www.runoob.com/try/try.php?filename=trycss3_align-content

align-content:flex-start

1623684218538(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623684218538.png)

align-content:flex-end

1623684264695(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623684264695.png)

align-content:center

1623684305973(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623684305973.png)

align-content:space-around

1623684640418(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623684640418.png)

align-content:space-between

1623685526782(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623685526782.png)

align-content 和align-items区别

  • align-items 适用于单行情况下, 只有上对齐、下对齐、居中和 拉伸
  • align-content适应于换行(多行)的情况下(单行情况下无效), 可以设置 上对齐、下对齐、居中、拉伸以及平均分配剩余空间等属性值。
  • 总结就是单行找align-items 多行找 align-content

flex-flow

该属性是 flex-direction 和 flex-wrap 属性的复合属性

1
flex-flow:row wrap;

flex布局子项常见属性

  • flex子项目占的份数
  • align-self控制子项自己在侧轴的排列方式
  • order属性定义子项的排列顺序(前后顺序)

flex 属性

flex 属性定义子项目分配剩余空间,用flex来表示占多少份数。

1
2
3
.item {
flex: <number>; /* 默认值 0 */
}

1623685804325(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623685804325.png)

align-self控制子项自己在侧轴上的排列方式

align-self 属性允许单个项目有与其他项目不一样的对齐方式,可覆盖 align-items 属性。

默认值为 auto,表示继承父元素的 align-items 属性,如果没有父元素,则等同于 stretch。

1
2
3
4
span:nth-child(2) {
/* 设置自己在侧轴上的排列方式 */
align-self: flex-end;
}

1623685872763(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623685872763.png)

order 属性定义项目的排列顺序

数值越小,排列越靠前,默认为0。

注意:和 z-index 不一样。

1
2
3
.item {
order: <number>;
}

面试题

如果以下两个面试题能理解,那么flex布局就掌握的非常OK了

使用flex布局完成圣杯布局

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>Document</title>
<!-- 特点:三栏布局,左右两侧固定,中间自适应,并且中间内容需要优先加载 -->
<style>
.big {
display: flex;
width: 100%;
height: 300px;
border: 1px solid black;
}
.big > div:nth-child(1) {
flex: 1;
background-color: coral;
}
.big > div:nth-child(2) {
order: -1;
width: 200px;
background-color: bisque;
}
.big > div:nth-child(3) {
width: 200px;
background-color: burlywood;
}
</style>
</head>
<body>
<div class="big">
<div>center</div>
<div>left</div>
<div>right</div>
</div>
</body>
</html>

使用flex布局完成三点的骰子

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>Document</title>
<style>
div {
display: flex;
justify-content: space-between;
width: 300px;
height: 300px;
border: 1px solid black;
border-radius: 30px;
}
div span {
width: 80px;
height: 80px;
border-radius: 50%;
background-color: coral;
}

div span:nth-child(2) {
align-self: center;
}
div span:nth-child(3) {
align-self: flex-end;
}
</style>
</head>
<body>
<div>
<span></span>
<span></span>
<span></span>
</div>
</body>
</html>

思维导图 [二]

rem单位

rem (root em)是一个相对单位,类似于em,em是父元素字体大小。

不同的是rem的基准是相对于html元素的字体大小。

比如,根元素(html)设置font-size=12px; 非根元素设置width:2rem; 则换成px表示就是24px。

1
2
3
4
5
6
7
8
/* 根html 为 12px */
html {
font-size: 12px;
}
/* 此时 div 的字体大小就是 24px,div字体大小=2*根元素的字体大小12 = 24 */
div {
font-size: 2rem;
}

rem的优势:父元素文字大小可能不一致, 但是整个页面只有一个html,可以很好来控制整个页面的元素大小。

媒体查询

媒体查询作用★

根据不同的分辨率为标签设置不同的样式

什么是媒体查询

媒体查询(Media Query)是CSS3新语法。

  • 使用 @media查询,可以针对不同的媒体类型定义不同的样式
  • @media 可以针对不同的屏幕尺寸设置不同的样式
  • 当你重置浏览器大小的过程中,页面也会根据浏览器的宽度和高度重新渲染页面
  • 目前针对很多苹果手机、Android手机,平板等设备都用得到多媒体查询

媒体查询语法规范

  • 用 @media开头 注意@符号
  • mediatype 媒体类型
  • 关键字 and not only
  • media feature 媒体特性必须有小括号包含
1
2
3
@media mediatype and|not|only (media feature) {
CSS-Code;
}
  1. mediatype 查询类型

将不同的终端设备划分成不同的类型,称为媒体类型

  1. 关键字

关键字将媒体类型或多个媒体特性连接到一起做为媒体查询的条件。

  • and:可以将多个媒体特性连接到一起,相当于“且”的意思。
  • not:排除某个媒体类型,相当于“非”的意思,可以省略。
  • only:指定某个特定的媒体类型,可以省略。
  1. 媒体特性

    每种媒体类型都具体各自不同的特性,根据不同媒体类型的媒体特性设置不同的展示风格。我们暂且了解三个。

    注意他们要加小括号包含

    img

  2. 媒体查询书写规则

    注意: 为了防止混乱,媒体查询我们要按照从小到大或者从大到小的顺序来写,但是我们最喜欢的还是从小到大来写,这样代码更简洁

    img

代码演示★

最大宽度320PX,超过了就不会生效。如果屏幕宽度小于等于320PX该样式生效

1
2
3
4
5
@media screen and (max-width:320px){
div {
background-color:red;
}
}

最小宽度320PX,如果小于320px就不生效了,如果屏幕宽度大于等于320PX该样式生效

1
2
3
4
5
@media screen and (min-width:320px){
div {
background-color:red;
}
}

如果屏幕宽度在801-900之间使用该样式

1
2
3
4
5
6
7
@media (min-width: 801px) and (max-width: 900px) { 
div {
width: 400px;
height: 400px;
background-color: green;
}
}

less 基础

维护css弊端

CSS 是一门非程序式语言,没有变量、函数、SCOPE(作用域)等概念。

  • CSS 需要书写大量看似没有逻辑的代码,CSS 冗余度是比较高的。
  • 不方便维护及扩展,不利于复用。
  • CSS 没有很好的计算能力
  • 非前端开发工程师来讲,往往会因为缺少 CSS 编写经验而很难写出组织良好且易于维护的 CSS 代码项目。

Less 介绍

Less(LeanerStyle Sheets 的缩写)是一门 CSS扩展语言,也成为CSS预处理器。

做为 CSS的一种形式的扩展,它并没有减少CSS的功能,而是在现有的CSS语法上,为CSS加入程序式语言的特性。

它在CSS 的语法基础之上,引入了变量,Mixin(混入),运算以及函数等功能,大大简化了 CSS 的编写,并且降低了 CSS的维护成本,就像它的名称所说的那样,Less可以让我们用更少的代码做更多的事情。

Less中文网址:http://lesscss.cn/

常见的CSS预处理器:Sass、Less、Stylus

一句话:Less是一门 CSS 预处理语言,它扩展了CSS的动态特性。

VSCode插件安装——EasyLess

Easy LESS 插件用来把less文件编译为css文件

安装完毕插件,重新加载下 vscode。

只要保存一下Less文件,会自动生成CSS文件。

img

less嵌套案例(三点的骰子)★

html

1
2
3
4
5
<div class="big">
<span></span>
<span></span>
<span></span>
</div>

less

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
@fontSize: 24px;
// 标签和标签之前的嵌套关系能够完美体现在less结构中
.big {
display: flex;
justify-content: space-between;
width: 300px;
height: 300px;
border: 1px solid black;
border-radius: 30px;

span {
width: 80px;
height: 80px;
border-radius: 50%;
background-color: orange;

// &表示当前元素,就是&所在的大括号,这里是span,后面跟:nth-child(2) 表示第二个span
//生成 .big span:nth-child(2){}
&:nth-child(2) {
align-self: center;
//这个代码是硬凑的,移动到第二个span变色:生成 .big span:nth-child(2):hover{}
&:hover {
background-color: orangered;
}
}

&:nth-child(3) {
align-self: flex-end;
}
}
}

变量的定义和使用

定义格式 @变量名:值; 变量名用纯英文

使用格式 width:@变量名;

Less 变量名的语法规范

  • 必须有@为前缀
  • 不能包含特殊字符
  • 不能以数字开头
  • 大小写敏感
1
2
3
4
5
6
7
8
9
10
11
// 定义变量
@red: #f00;
div {
// 使用变量
font-size: @red;
}

a {
//使用变量
font-size: @red;
}

&符号

如果遇见 (交集|伪类|伪元素选择器) ,利用&进行连接

1
2
3
4
5
6
7
8
a:hover{
color:red;
}
a{
&:hover{
color:red;
}
}

less 运算

任何数字、颜色或者变量都可以参与运算。就是Less提供了加(+)、减(-)、乘(*)、除(/)算术运算。

1
2
3
4
5
6
7
8
9
10
11
/*Less 里面写*/
@witdh: 10px + 5;
div {
border: @witdh solid red;
}
/*生成的css*/
div {
border: 15px solid red;
}
/*Less 甚至还可以这样 */
width: (@width + 5) * 2;

注意

除法运算要加(),比如width: (100rem / @fontSize);

运算符的左边和右边需要有空格

如果参与运算的两个数据都有单位以第一个为准

如果两个值之间只有一个值有单位,则运算结果就取该单位

rem适配方案

适配目标

1.让一些不能等比自适应的元素,达到当设备尺寸发生改变的时候,等比例适配当前设备。

2.使用媒体查询根据不同设备按比例设置html的字体大小,然后页面元素使用rem做尺寸单位,当html字体大小变化元素尺寸也会发生变化,从而达到等比缩放的适配。

技术方案

1.less+rem+媒体查询

2.lflexible.js+rem

总结:

两种方案现在都存在。方案2 更简单

rem适配方案1

详细步骤:(万字文,不想看直接看适配方式2,按照步骤来即可)

①假设设计稿是750px

②假设我们把整个屏幕划分为15等份(划分标准不一可以是20份也可以是10等份)

③每一份作为html字体大小,这里就是50px

④那么在320px设备的时候,字体大小为320/15就是 21.33px

⑤用我们页面元素的大小除以不同的 html字体大小会发现他们比例还是相同的

⑥比如我们以750为标准设计稿

⑦一个100100像素的页面元素在 750屏幕下, 就是 100/ 50 转换为rem 是 2rem2rem 比例是1比1

⑧320屏幕下, html字体大小为21.33 则 2rem= 42.66px 此时宽和高都是 42.66 但是宽和高的比例还是 1比1

⑨但是已经能实现不同屏幕下 页面元素盒子等比例缩放的效果

总结

①最后的公式:页面元素的rem值 = 页面元素值(px) / (屏幕宽度 / 划分的份数)

②屏幕宽度/划分的份数就是 htmlfont-size 的大小

③或者:页面元素的rem值 = 页面元素值(px) / html font-size 字体大小

rem 适配方案2★

相比较适配方案1的优势

适配方案1需要手动写媒体查询,在不同的分辨率上给html标签设置不同的字体大小。媒体查询程阶梯式的,不能做到很精确,比如在320360分辨率上使用的是同样大的字体可能,如果要在320360分辨率上分别显示不同大小的字体,手动实现几乎不可能,但是适配方案2可以实现。

手机淘宝团队出的简洁高效 移动端适配库

我们再也不需要在写不同屏幕的媒体查询,因为里面js做了处理

它的原理是把当前设备划分为N(默认10)等份,但是不同设备下,比例还是一致的。

我们要做的,就是确定好我们当前设备的html 文字大小就可以了

比如当前设计稿是 750px, 那么我们只需要把 html 文字大小设置为 75px(750px / 10) 就可以

里面页面元素rem值: 页面元素的px 值 / 75

剩余的,让flexible.js来去算

github地址:https://github.com/amfe/lib-flexible

使用Flexible.js完成REM布局技术点总结

因为flexible是默认将屏幕分为10等分

但是当屏幕大于750的时候希望不要再去重置html字体了

所以要自己通过媒体查询设置一下

并且要把权重提到最高

VSCode px 转换rem 插件 cssrem

因为cssrem中css自动转化为rem是参照默认插件的16转换的所以需要自己配置

使用步骤

第一步: 为vscode安装并配置cssrem插件

安装插件

1623771090501(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/rem/images/1623771090501.png)

配置插件

文件->首选项-设置 搜索cssrem.填写1REM对应的文字大小。比如原型图750,页面分成10份。那么1REM=75PX 。则填写75即可
1623771144977(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/rem/images/1623771144977.png)

第二步:引入flexible.js到当前项目

flexible.js的作用就是代替媒体查询,给不同分辨率下的html设置字体大小。

点击下载

在页面使用script标签引入js

1
<script src="./flexible.js"></script>

第三步:引入normalize.css,reset.css

normalize.css

点击下载

reset.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
/*点击高亮我们需要清除清除  设置为transparent 完成透明*/
* {
-webkit-tap-highlight-color: transparent;
}
/*在移动端浏览器默认的外观在iOS上加上这个属性才能给按钮和输入框自定义样式*/
input {
-webkit-appearance: none;
}
/*禁用长按页面时的弹出菜单*/
img,
a {
-webkit-touch-callout: none;
}
a {
color: #666;
text-decoration: none;
}
ul {
margin: 0;
padding: 0;
list-style: none;
}
img {
vertical-align: middle;
}
div {
/* css3 盒子模型 */
box-sizing: border-box;
}
.clearfix:after {
content: "";
display: block;
line-height: 0;
visibility: hidden;
height: 0;
clear: both;
}

第四步:适配最小和最大分辨率,并且为body标签设置最小和最大宽度

编写媒体查询的作用:适配最小和最大分辨率。比如要适配的最下分辨率320PX,最大分辨率750PX,分辨率小于320,页面内容就不能再继续缩小;分辨率大于750,页面内容就不能再继续放大。

新建common.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
/* 适配最大分辨率,如果页面超过750PX则设置html文字大小为75px。表示页面内容不能再放大了 */
@media screen and (min-width: 750px){
html {
font-size: 75px !important;
}
}

/* 适配最小分辨率:如果页面小于320px则设置文字大小32px。表示页面内容不能再缩小了。其实最小的手机也就是320,所以320分辨率以下的手机不存在,不适配也可以*/
@media screen and (max-width: 320px){
html {
font-size: 32px !important;
}
}

body {
/*
width写10rem的原因:
1.flexible中默认分成10等分,这里写10rem即可
2.原型图为750PX,所以页面的宽度应该为750PX,但是页面要缩放,不能写死,所以单位应该用REM。
*/
width: 10rem;
min-width: 320px;
max-width: 750px;
/*在PC上显示居中*/
margin:0 auto;
font: 14px/1.5 -apple-system, Helvetica, sans-serif;
color: #666;
background-color:#f2f2f2;
}

最终的html代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!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>Document</title>
<!-- 1.引入flexible.js,帮我们自动计算设置不同分辨率下font-size的值 -->
<script src="./js/flexible.js"></script>
<!-- 2.引入normalize.css -->
<link rel="stylesheet" href="./css/normalize.css" />
<!-- 3.引入reset.css -->
<link rel="stylesheet" href="./css/reset.css" />
<!-- 4.引入common.css -->
<link rel="stylesheet" href="./css/common.css" />
</head>
<body></body>
</html>

思维导图 [三]

响应式开发原理

响应式开发原理

就是使用媒体查询针对不同宽度的设备进行布局和样式的设置,从而适配不同设备的目的。

设备的划分情况:

  • 小于768的为超小屏幕(手机)
  • 768~992之间的为小屏设备(平板)
  • 992~1200的中等屏幕(桌面显示器)
  • 大于1200的宽屏设备(大桌面显示器)

响应式布局容器

响应式需要一个父级做为布局容器,来配合子级元素来实现变化效果。

原理就是在不同屏幕下,通过媒体查询来改变这个布局容器的大小,再改变里面子元素的排列方式和大小,从而实现不同屏幕下,看到不同的页面布局和样式变化。

父容器版心的尺寸划分

  • 超小屏幕(手机,小于 768px):设置宽度为 100%
  • 小屏幕(平板,大于等于 768px):设置宽度为 750px
  • 中等屏幕(桌面显示器,大于等于 992px):宽度设置为 970px
  • 大屏幕(大桌面显示器,大于等于 1200px):宽度设置为 1170px

但是我们也可以根据实际情况自己定义划分

bootstrap的介绍

Bootstrap简介

Bootstrap 来自 Twitter(推特),是目前最受欢迎的前端框架。Bootstrap 是基于HTML、CSS 和 JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加快捷。

中文网 官网 推荐网站

框架:顾名思义就是一套架构,它有一套比较完整的网页功能解决方案,而且控制权在框架本身,有预制样式库、组件和插件。使用者要按照框架所规定的某种规范进行开发。

bootstrap优点

  • 标准化的html+css编码规范
  • 提供了一套简洁、直观、强悍的组件
  • 有自己的生态圈,不断的更新迭代
  • 让开发更简单,提高了开发的效率

版本简介

2.x.x:停止维护,兼容性好,代码不够简洁,功能不够完善。

3.x.x:目前使用最多,稳定,但是放弃了IE6-IE7。对 IE8 支持但是界面效果不好,偏向用于开发响应式布局、移动设备优先的WEB 项目。

4.x.x:最新版,高级课程中使用

使用步骤

在现阶段我们还没有接触JS相关课程,所以我们只考虑使用它的样式库。

Bootstrap 使用四步曲:

导入bootstrap相关资源到项目

创建 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
<!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">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<title>Bootstrap 101 Template</title>

<!-- Bootstrap -->
<link href="css/bootstrap.min.css" rel="stylesheet">

<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="//cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="//cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<h1>你好,世界!</h1>

<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
<!-- Include all compiled plugins (below), or include individual files as needed -->
<script src="js/bootstrap.min.js"></script>
</body>
</html>

引入相关样式文件

1
2
<!-- Bootstrap 核心样式-->
<link rel="stylesheet" href="./css/bootstrap.min.css">

书写内容

直接拿Bootstrap 预先定义好的样式来使用

修改Bootstrap 原来的样式,注意权重问题

学好Bootstrap 的关键在于知道它定义了哪些样式,以及这些样式能实现什么样的效果

bootstrap布局容器

Bootstrap 需要为页面内容和栅格系统包裹一个 .container 或者.container-fluid 容器,它提供了两个作此用处的类。

.container

  • 响应式布局的容器 固定宽度
  • 大屏 ( >=1200px) 宽度定为 1170px
  • 中屏 ( >=992px) 宽度定为 970px
  • 小屏 ( >=768px) 宽度定为 750px
  • 超小屏 (100%)

.container-fluid

  • 流式布局容器 百分百宽度
  • 占据全部视口(viewport)的容器。

bootstrap栅格系统

Bootstrap提供了一套响应式、移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列。

栅格系统用于通过一系列的行(row)与列(column)的组合来创建页面布局,你的内容就可以放入这些创建好的布局中。

  • 按照不同屏幕划分为1~12 等份
  • 行(row) 可以去除父容器作用15px的边距
  • xs-extra small:超小; sm-small:小; md-medium:中等; lg-large:大;
  • 列(column)大于 12,多余的“列(column)”所在的元素将被作为一个整体另起一行排列
  • 每一列默认有左右15像素的 padding
  • 可以同时为一列指定多个设备的类名,以便划分不同份数 例如 class=”col-md-4 col-sm-6”

栅格嵌套

栅格系统内置的栅格系统将内容再次嵌套。简单理解就是一个列内再分成若干份小列。我们可以通过添加一个新的 .row 元素和一系列 .col-sm-* 元素到已经存在的 .col-sm-*
元素内。

1
2
3
4
5
6
7
<!-- 列嵌套 -->
<div class="col-sm-4">
<div class="row">
<div class="col-sm-6">小列</div>
<div class="col-sm-6">小列</div>
</div>
</div>

列偏移

使用 .col-md-offset-* 类可以将列向右侧偏移。这些类实际是通过使用 * 选择器为当前元素增加了左侧的边距(margin)。

1
2
3
4
5
<!-- 列偏移 -->
<div class="row">
<div class="col-lg-4">1</div>
<div class="col-lg-4 col-lg-offset-4">2</div>
</div>

列排序

通过使用 .col-md-push-* 和 .col-md-pull-* 类就可以很容易的改变列(column)的顺序。

列排序的使用目的就是把左边的列放到右变,右边的列放到左边。实现互换。

1
2
3
4
5
<!-- 列排序 -->
<div class="row">
<div class="col-lg-4 col-lg-push-8">左侧</div>
<div class="col-lg-8 col-lg-pull-4">右侧</div>
</div>

响应式工具

为了加快对移动设备友好的页面开发工作,利用媒体查询功能,并使用这些工具类可以方便的针对不同设备展示或隐藏页面内容。

bootstrap 布局规则★

1.先编写大容器,样式名为container或者container-fluid

2.编写行,样式名为row

3.行中嵌套列

4.如果有需要,列中可以继续嵌套行,行中继续嵌套列..