第十六天:CSS高级技巧
常识只有一个问题: 就是它不常见
学习目标
-
精灵图
-
字体图标
-
CSS三角
-
CSS用户界面样式
-
vertical-align属性应用
-
溢出的文字省略号显示
-
常见布局技巧
精灵图
为什么需要精灵图?
一般来说,网页是放在服务器上的,一个网页中往往会应用很多小的背景图像来做修饰,当网页中的图像过多时,服务器就会频繁的接收和发送请求图片,造成服务器压力过大,这将大大降低页面的加载速度
所以,**为了有效的减少服务器接收和发送请求的次数,提高网页的加载速度,**出现了CSS精灵技术(也称作CSS Sprites,CSS雪碧)
核心技术:将网页中的一些小背景图像整合到一张大图中,这样服务器就只需要一次请求就可以了
精灵图的使用
使用精灵图核心:
-
精灵技术主要针对于背景图片使用,就是把多个小背景图片整合到一张大图片中
-
这张大图片也被叫做sprites精灵图或者雪碧图
-
移动背景图片位置,此时可以用background-position
-
移动的距离就是这个目标的x和y坐标。注意网页中的坐标有所不同(右x下y)
-
一般情况下都是往上往左走。所以数值为负值
-
使用精灵图的时候要精确测量,每个小背景图片的大小和位置
精灵图案例
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; margin: 100px auto; background: url(images/sprits.png) no-repeat -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>
|
字体图标
字体图标使用场景:主要用于显示网页中通用、常用的一些小图标
精灵图有很多优点,但是缺点也很明显:
-
图片文件还是比较大的
-
图片本身放大和缩小就会失真
-
图片制作完成之后,想要更换很麻烦
所以有一种技术的出现很好的解决了上面的问题,就是字体图标icon-font
字体图标可以为前端工程师提供一种方便高效的图标使用方式,展示的是图标,本质属于字体
字体图标的优点
注意:字体图标并不能替代精灵技术,只是对工作中图标部分技术的提升和优化
总结:
-
如果遇到一些结构和样式比较简单的小图标,就用字体图标
-
如果遇到一些结构和样式比较复杂的小图片,就用精灵图
字体图标的使用
字体图标是一些网站常见的小图标,我们可以直接上网下载。因此使用可以分为:
-
字体图标的下载
icomoon字体库
阿里iconfont
-
字体图标的引入(引入HTML页面中)
-
字体图标的追加(以后添加新的小图标)
如果工作中,原来的字体图标不够用了,我们需要添加新的字体图标到原来的字体文件中
把压缩包里面的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-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-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
|
<!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-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-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
属性值 |
描述 |
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> <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 |
把元素的顶端与行中最低的元素的顶端对齐 |
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:图片底部会有一个空白缝隙,原因是行内块元素会和文字的基线对齐
主要解决方法:
-
给图片添加vertical-align:middle|top|bottom;
-
可以把图片转换成块级元素dispaly:inline-block
溢出的文字省略号显示
-
单行文本溢出显示省略号
必须满足三个条件:
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: nowrap; overflow: hidden; text-overflow: ellipsis;
} </style> </head> <body> <div>我也不知道写啥,自行脑补</div> </body> </html>
|
-
多行文本溢出显示省略号
- 多行文本溢出显示省略号,有较大的兼容性问题,适合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; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
} </style> </head>
<body> <div>我也不知道写啥,自行脑补,我也不知道写啥,自行脑补,我也不知道写啥,自行脑补</div> </body>
</html>
|
常见布局技巧
巧妙利用一个技术更快更好的布局:
-
margin负值的运用
-
文字围绕浮动元素
-
行内块的巧妙运用
-
css三角强化
margin负值
在几个并列排序的盒子中,如果添加border,那么会出现外边框重复的情况,我们想要任意相邻的两个盒子之间只有一个边框,就会用到margin负值
-
让每个盒子margin往左移动-1px 正好压住相邻盒子的边框
-
鼠标经过某个盒子的时候,提高当前盒子的层级即可(如果没有定位,则添加相对定位(保留位置),如果有定位,则添加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{ width: 150px; height: 200px; border: 1px solid red; list-style: none; float: left; margin-left: -1px; } ul li:hover{ 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>
|
文字围绕浮动元素
一般我们的构思方法就是创建两个盒子,一个写文字一个填图片。然后将两个盒子添加左右浮动,再进行文字对齐
现在的构思方法:创建一个大盒子,然后在大盒子里填写好文字,再在小盒子里填好图片,把小盒子浮动在大盒子之上,接着对大盒子的文字进行文字环绕。别忘了,浮动的初衷就是为了进行文字环绕
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>
|
行内块巧妙运用
应用场景: 上一页+下一页+页面跳转
按照一般的方法,我们需要设置很多的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="#"><<上一页</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="#">>>下一页</a> 到第 <input type="text"> 页 <button>确定</button> </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
| <!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; 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; border-color: transparent red transparent transparent; border-style: solid; 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; border-color: transparent red transparent transparent; border-style: solid; 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>
|