跟随黑马学前端-16,CSS高级技巧

第十六天:CSS高级技巧

常识只有一个问题: 就是它不常见

学习目标

  • 精灵图

  • 字体图标

  • CSS三角

  • CSS用户界面样式

  • vertical-align属性应用

  • 溢出的文字省略号显示

  • 常见布局技巧

精灵图


为什么需要精灵图?
image-20221227101139486

一般来说,网页是放在服务器上的,一个网页中往往会应用很多小的背景图像来做修饰,当网页中的图像过多时,服务器就会频繁的接收和发送请求图片,造成服务器压力过大,这将大大降低页面的加载速度

所以,**为了有效的减少服务器接收和发送请求的次数,提高网页的加载速度,**出现了CSS精灵技术(也称作CSS Sprites,CSS雪碧)

核心技术:将网页中的一些小背景图像整合到一张大图中,这样服务器就只需要一次请求就可以了


精灵图的使用

使用精灵图核心:

  1. 精灵技术主要针对于背景图片使用,就是把多个小背景图片整合到一张大图片中

  2. 这张大图片也被叫做sprites精灵图或者雪碧图

  3. 移动背景图片位置,此时可以用background-position

  4. 移动的距离就是这个目标的x和y坐标。注意网页中的坐标有所不同(右x下y)

  5. 一般情况下都是往上往左走。所以数值为负值

  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
<!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>
.box1 {
width: 60px;
height: 60px;
/* background-color: pink; */
margin: 100px auto;
background: url(images/sprits.png) no-repeat -182px 0;
/* background-position: -182px 0; */
}

.box2 {
width: 27px;
height: 25px;
background-color: pink;
margin: 200px;
background: url(images/sprits.png) no-repeat -155px -106px;
}
</style>
</head>

<body>
<div class="box1"></div>
<div class="box2"></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="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>
span{
display:inline-block;
}

.p {
width: 100px;
height: 112px;
background: url(images/abcd.png) no-repeat -493px -276px;
}
.i{

width: 60px;
height: 108px;
background: url(images/abcd.png) no-repeat -215px -141px;
}
.k{

width: 105px;
height: 114px;
background: url(images/abcd.png) no-repeat -495px -142px;
}
</style>
</head>

<body>
<span class="p"></span>
<span class="i"></span>
<span class="n"></span>
<span class="k"></span>

</body>

</html>

字体图标


字体图标使用场景:主要用于显示网页中通用、常用的一些小图标

精灵图有很多优点,但是缺点也很明显:

  1. 图片文件还是比较大的

  2. 图片本身放大和缩小就会失真

  3. 图片制作完成之后,想要更换很麻烦

所以有一种技术的出现很好的解决了上面的问题,就是字体图标icon-font

字体图标可以为前端工程师提供一种方便高效的图标使用方式,展示的是图标,本质属于字体


字体图标的优点
  • 轻量级:一个图标字体要比一系列的图像要小,一旦字体加载了,图标就会马上渲染出来,减少了服务器的请求

  • 灵活性:本质其实就是文字,可以很随意的改变颜色,产生阴影、透明效果、旋转等

  • 兼容性:几乎支持所有的浏览器

注意:字体图标并不能替代精灵技术,只是对工作中图标部分技术的提升和优化

总结:

  1. 如果遇到一些结构和样式比较简单的小图标,就用字体图标

  2. 如果遇到一些结构和样式比较复杂的小图片,就用精灵图


字体图标的使用

字体图标是一些网站常见的小图标,我们可以直接上网下载。因此使用可以分为:

  1. 字体图标的下载

    icomoon字体库

    阿里iconfont

  2. 字体图标的引入(引入HTML页面中)

    • 把下载包里面的fonts文件夹放入页面根目录下

    • 在CSS样式中全局声明字体:简单理解就是把这字体文件通过CSS引入我们页面中

      一定注意字体文件路径的问题

      image-20221227113725873

  3. 字体图标的追加(以后添加新的小图标)

    如果工作中,原来的字体图标不够用了,我们需要添加新的字体图标到原来的字体文件中

    把压缩包里面的selection.json重新上传,然后选择自己想要的新的图标,重新下载压缩包,并替换原来的文件即可

CSS三角


网页中常出现一些三角形,使用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
<!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>
.box1 {
width: 0;
height: 0;
/* border: 10px solid pink; */
border-top: 10px solid pink;
border-right: 10px solid red;
border-bottom: 10px solid blue;
border-left: 10px solid green;
}
.box2 {
width: 0;
height: 0;
/* border: 10px solid pink; */
border-top: 10px solid red;
border-right: 10px solid red;
border-bottom: 10px solid transparent;
border-left: 10px solid transparent;
}
</style>
</head>

<body>
<div class="box1"></div>
<div class="box2"></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
<!--
* @Author: Joker_Yue,Joker_Yue@qq.com
* @Date: 2022-12-27 11:46:44
* @LastEditors: Joker_Yue
* @LastEditTime: 2022-12-27 11:57:29
* @FilePath: \HTML\02黑马\11.3.html
* @Description: 案例-京东三角
-->
<!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>
.box1 {
width: 0;
height: 0;
/* border: 10px solid pink; */
border-top: 10px solid pink;
border-right: 10px solid red;
border-bottom: 10px solid blue;
border-left: 10px solid green;
}
.box2 {
width: 0;
height: 0;
/* border: 10px solid pink; */
border-top: 10px solid red;
border-right: 10px solid red;
border-bottom: 10px solid transparent;
border-left: 10px solid transparent;
}
.jd{
position: relative;
width: 120px;
height: 249px;
background-color: pink;
}
.jd span{
position: absolute;
right: 15px;
top: -10px;
width: 0;
height: 0;
/* 照顾兼容性 */
line-height: 0;
font-size: 0;
border: 5px solid transparent;
border-bottom-color: pink;

}
</style>
</head>

<body>
<div class="box1"></div>
<div class="box2"></div>
<div class="jd">
<span></span>
</div>
</body>

</html>

CSS用户界面


什么是界面样式

所谓的界面样式,就是更改一些用户操作样式,以便提高更好的用户体验

  • 更改用户鼠标样式

  • 表单轮廓

  • 防止表单域拖拽


鼠标样式cursor
1
li{cursor:pointer;}
属性值 描述
default 小白 默认
pointer 小手
move 移动
text 文本
not-allowed 禁止
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>鼠标样式</title>
</head>

<body>
<ul>
<li style="cursor: default;">我是默认的鼠标样式</li>
<li style="cursor: pointer;">我是鼠标小白手样式</li>
<li style="cursor:move ;">我是鼠标移动样式</li>
<li style="cursor: text;">我是鼠标文本样式</li>
<li style="cursor: not-allowed;">我是鼠标禁止样式</li>
</ul>
</body>

</html>

轮廓线outline和文本域textarea

给表单添加outline:0;或者outline:none;,就可以去掉默认的蓝色边框

给文本域添加resize:none;就可以防止文本域拖拽

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>
input{
outline: none;
}
textarea{
resize: none;
}
</style>

</head>
<body>
<!-- 1.取消表单轮廓 -->
<input type="text">
<!-- 防止文本拖拽 -->
<textarea name="" id="" cols="30" rows="10"></textarea>
</body>
</html>


vertical-align属性应用

CSS的vertical-align属性使用场景:经常用于设置图片或者表单(行内块元素)和文字垂直对齐

官方解释:用于设置一个元素的垂直对齐方式,但是它只针对于行内元素和行内块元素有效

语法:

1
vertical-align: baseline | top | middle | bottom; 
描述
baseline 默认,元素放置在父元素的基线上
top 把元素的顶端与行中最高元素的顶端对齐
middle 把元素放置在父元素的中部
bottom 把元素的顶端与行中最低的元素的顶端对齐

image-20221227122408610

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!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>利用vertical-align进行图片文字垂直居中</title>
<style>
img{
vertical-align: middle;
}
</style>
</head>
<body>
<img src="images/img.png" alt="">我真帅
</body>
</html>

解决图片底部空白缝隙解决方法

bug:图片底部会有一个空白缝隙,原因是行内块元素会和文字的基线对齐

主要解决方法:

  1. 给图片添加vertical-align:middle|top|bottom;

  2. 可以把图片转换成块级元素dispaly:inline-block


溢出的文字省略号显示
  1. 单行文本溢出显示省略号

    必须满足三个条件:

    1
    2
    3
    4
    5
    6
    /* 先强制显示一行内显示文本 */
    white-span : nowrap;(默认normal自动换行)
    /* 超出部分自动隐藏 */
    overflow: hidden;
    /* 文字用省略号代替超出的部分 */
    text-overflow: ellipsis;
    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="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: 80px;
    background-color: pink;
    margin: 100px auto;
    /* 文字自动换行 */
    /* white-space: normal; */
    /* 文字强制一行 */
    white-space: nowrap;
    /* 溢出部分隐藏 */
    overflow: hidden;
    /* 文字溢出用省略号 */
    text-overflow: ellipsis;

    }
    </style>
    </head>
    <body>
    <div>我也不知道写啥,自行脑补</div>
    </body>
    </html>
  2. 多行文本溢出显示省略号

    • 多行文本溢出显示省略号,有较大的兼容性问题,适合webkit浏览器或移动端(移动端大部分是webkit内核)
    1
    2
    3
    4
    5
    6
    7
    8
    overflow:hidden;
    text-overflow:ellipsis;
    /* 弹性伸缩盒子模型显示 */
    display: -webkit-box;
    /* 限制在一个块元素显示的文本的行数,这里表示2行 */
    -webkit-line-clamp:2;
    /* 设置或检索伸缩盒对象的子元素的排列方式 */
    -webkit-box-orient: vertical;
    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>
    div {
    width: 150px;
    height: 80px;
    background-color: pink;
    margin: 100px auto;
    overflow: hidden;
    text-overflow: ellipsis;
    /* 弹性伸缩盒子模型显示 */
    display: -webkit-box;
    /* 限制在一个块元素显示的文本的行数,这里表示2行 */
    -webkit-line-clamp: 2;
    /* 设置或检索伸缩盒对象的子元素的排列方式 */
    -webkit-box-orient: vertical;

    }
    </style>
    </head>

    <body>
    <div>我也不知道写啥,自行脑补,我也不知道写啥,自行脑补,我也不知道写啥,自行脑补</div>
    </body>

    </html>

常见布局技巧

巧妙利用一个技术更快更好的布局:

  1. margin负值的运用

  2. 文字围绕浮动元素

  3. 行内块的巧妙运用

  4. css三角强化


margin负值

在几个并列排序的盒子中,如果添加border,那么会出现外边框重复的情况,我们想要任意相邻的两个盒子之间只有一个边框,就会用到margin负值

image-20221229153810970
  1. 让每个盒子margin往左移动-1px 正好压住相邻盒子的边框

  2. 鼠标经过某个盒子的时候,提高当前盒子的层级即可(如果没有定位,则添加相对定位(保留位置),如果有定位,则添加z-index)

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 http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>margin负值的巧妙运用</title>
<style>
ul li{
/* 1.如果这里添加了下面一句代码, */
/* position: relative; */
width: 150px;
height: 200px;
border: 1px solid red;
list-style: none;
float: left;
margin-left: -1px;
}
ul li:hover{
/* 相对定位会压住其他标准流或者浮动的盒子 */
/* 2.那么就需要将下面这句代码改成 z-index:1;以提高层级。因为只有有定位的盒子才有z-index属性 */
position: relative;
border: 1px solid blue;
}
</style>
</head>
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
</body>
</html>

文字围绕浮动元素
image-20221229155243423

一般我们的构思方法就是创建两个盒子,一个写文字一个填图片。然后将两个盒子添加左右浮动,再进行文字对齐

现在的构思方法:创建一个大盒子,然后在大盒子里填写好文字,再在小盒子里填好图片,把小盒子浮动在大盒子之上,接着对大盒子的文字进行文字环绕。别忘了,浮动的初衷就是为了进行文字环绕

image-20221229160155443
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>文字围绕浮动元素的妙用</title>
<style>
* {
margin: 0;
padding: 0;
}

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

.pic {
float: left;
width: 120px;
height: 60px;
}

.pic img {
width: 100%;
}
</style>
</head>

<body>
<div class="box">
<div class="pic"><img src="images/img.png" alt=""></div>
<p>阿巴阿巴阿巴阿巴阿巴阿巴阿巴阿巴阿巴阿巴阿巴</p>
</div>
</body>

</html>

行内块巧妙运用
image-20221229162303975

应用场景: 上一页+下一页+页面跳转

按照一般的方法,我们需要设置很多的li,但是我们同时也可以按照行内块来做。因为其本身就可以设置大小,而且本身也会有距离。而且我们可以给行内块元素添加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
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
<!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>
*{
margin: 0;
padding: 0;
}
.box {
text-align: center;
}

.box a {
display: inline-block;
width: 36px;
height: 36px;
background-color: #f7f7f7;
border: 1px solid #ccc;
text-align: center;
line-height: 36px;
text-decoration: none;
color: #333;
font-size: 14px;
}

.box .prev,
.box .next {
width: 85px;
}

.box .current,
.box .elp {
background-color: #fff;
border: none;
}

.box input {
height: 36px;
width: 45px;
border: 1px solid #ccc;
outline: none;
}

.box button {
width: 60px;
height: 36px;
background-color: #f7f7f7;
border: 1px solid #ccc;
}
</style>
</head>

<body>
<div class="box">
<a class="prev" href="#">&lt;&lt;上一页</a>
<a href="#" class="current">2</a>
<a href="#">3</a>
<a href="#">4</a>
<a href="#">5</a>
<a href="#">6</a>
<a href="#" class="elp">...</a>
<a class="next" href="#">&gt;&gt;下一页</a>
到第
<input type="text">

<button>确定</button>
</div>
</body>

</html>

CSS三角巧妙运用

效果:image-20221229164449824

原理:image-20221229164624649

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=`">
<title>CSS三角强化巧妙运用</title>
<style>
.box{
width: 0;
height: 0;
/* 把上边框宽度调大 */
border-top: 100px solid transparent;
border-right: 50px solid skyblue;
/* 左边和下边的宽度设置为0 */
border-bottom: 0px solid blue;
border-left: 0px solid green;
}
</style>
</head>
<body>
<div class="box"></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=`">
<title>CSS三角强化巧妙运用</title>
<style>
.box{
width: 0;
height: 0;
/* 1.只保留右边的边框有颜色 */
border-color: transparent red transparent transparent;
/* 2.样式都是solid */
border-style: solid;
/* 3.上边框宽度要大,右边框宽度稍小,其余的边框改为0 */
border-width: 100px 50px 0 0;
}
</style>
</head>
<body>
<div class="box"></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
<!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=`">
<title>CSS三角强化巧妙运用</title>
<style>
.box{
width: 0;
height: 0;
/* 1.只保留右边的边框有颜色 */
border-color: transparent red transparent transparent;
/* 2.样式都是solid */
border-style: solid;
/* 3.上边框宽度要大,右边框宽度稍小,其余的边框改为0 */
border-width: 100px 50px 0 0;
}
.price{
width: 160px;
height: 24px;
border: 1px solid red;
margin: 0 auto;
line-height: 24px;
}
.miaosha{
position: relative;
float: left;
width: 90px;
height: 100%;
background-color: red;
text-align: center;
color: #fff;
font-weight: 700;
margin-right: 8px;
}

.miaosha i{
/* 这里是三角形的定义和定位 */
position: absolute;
width: 0;height: 0;
border-color: transparent #fff transparent transparent;
border-style: solid;
border-width: 24px 10px 0 0;
right: 0;
top: 0;
}
.origin{
font-size: 12px;
color: gray;
text-decoration: line-through;
}

</style>
</head>
<body>
<div class="box"></div>
<div class="price">
<span class="miaosha">
¥1650
<i></i>
</span>
<span class="origin">¥5650</span>
</div>
</body>
</html>