
Loading效果现在在实际开发中是很常见的,现在网页的体积较大,又或者是使用Vue一类的前端库,尤其是在Ajax请求的时候,浏览器在打开网页的时候会出现一段时间的白屏,这个时候Loading的出现可以给用户一个很好的交互体验。
具体代码可以前往github查看 仓库地址>>
实现效果
首先先看看所实现的效果
接下来来看看一个个是怎么实现的。
Loading-00
loading-00的效果就如音乐播放时的动态条一般,不停的连续执行。
其主要实现思路如下:
- 每个竖状条都是一个简单的div,div为一个小的圆形。
- 给每个div加上一个动画效果,该动画的效果是高度逐渐变长,最后再变回原样。
- 每个div延迟不同的时间才开始执行,这样就会有先后的层次感。
然后来看看各个部分的代码实现。
基本的div元素
基本的div元素是一个小的圆形。
scss1
.line {
2
display: inline-block;
3
width: 15px;
4
height: 15px;
5
border-radius: 15px;
6
margin-top: 20px;
7
}
定义动画
定义的动画主要是改变div的高度,在完成50%的时候达到最高值,完成100%时恢复到原来高度。
scss1
@keyframes loadingTranslate {
2
50% {
3
height: 40px;
4
}
5
100% {
6
height: 15px;
7
}
8
}
设置动画
将定义的动画添加至animation属性,设置一个动画总执行时间,然后给5个div设置不同的延时时间。
scss1
.line1 {
2
animation: loadingTranslate 1.5s 0s infinite;
3
}
4
.line2 {
5
animation: loadingTranslate 1.5s 0.3s infinite;
6
}
7
.line3 {
8
animation: loadingTranslate 1.5s 0.6s infinite;
9
}
10
.line4 {
11
animation: loadingTranslate 1.5s 0.9s infinite;
12
}
13
.line5 {
14
animation: loadingTranslate 1.5s 1.2s infinite;
15
}
HTML元素
将以上设置的CSS属性都添加至HTML元素中。
html1
<div class="loading">
2
<p>loading-00</p>
3
<div class="line line1"></div>
4
<div class="line line2"></div>
5
<div class="line line3"></div>
6
<div class="line line4"></div>
7
<div class="line line5"></div>
8
</div>
最后的实现效果:
Loading-01
如果细心的看完loading-00的实现过程,一定可以联想到loading-01的实现。
loading-00是通过给高度加动画,那么loading-01就是通过给宽度加动画,同样给5个div不同的延迟时间。
这里只给出其动画定义,其他的内容与loading-00类似,详细的内容可以通过Github查看
1 | @keyframes loadingTranslate { |
2 | 50% { |
3 | width: 40px; |
4 | } |
5 | 100% { |
6 | width: 15px; |
7 | } |
8 | } |
最后实现效果:
Loading-02
loading-02的实现效果如下。
在loading-00和loading-01中是通过给高度和宽度增加动画实现的,而loading-02是通过给五个div增加纵向位移实现的。
loading-02实现的关键点就在于translateY的使用,因为动画是从下往上跳动,所以在完成度50%时,translateY设定为负值。
其定义的动画部分代码如下所示。
1 | @keyframes loadingTranslate { |
2 | 50% { |
3 | transform: translateY(-20px); |
4 | } |
5 | 100% { |
6 | transform: translateY(0px); |
7 | } |
8 | } |
最终效果呈现:
Loading-03
loading-03的实现效果如下。
通过效果图我们发现有两点差异:
- loading过程中透明度会发生变化,这个通过opacity实现。
- 在接近完成时有个上下轻微抖动的效果,这个通过设置小单位的正负translateY值。
得到的动画代码如下。
1 | @keyframes loadingTranslate { |
2 | 0% { |
3 | transform: translateY(0); |
4 | opacity: 1; |
5 | } |
6 | 30% { |
7 | transform: translateY(0); |
8 | opacity: .3; |
9 | } |
10 | 50% { |
11 | transform: translateY(-20px); |
12 | opacity: .8; |
13 | } |
14 | 70% { |
15 | transform: translateY(3px); |
16 | opacity: .8; |
17 | } |
18 | 85% { |
19 | transform: translateY(-3px); |
20 | } |
21 | 100% { |
22 | transform: translateY(0); |
23 | opacity: 1; |
24 | } |
25 | } |
Loading-04
loading-04的动画效果如下。
loading-04的效果同loading-03类似,loading-03是通过纵向的位移变换,可以通过translateY实现。
loading-04是通过水平方向位移变换,可以通过translateX来实现。
而有一点不同的是,loading-04的div初始位置就是translateX(-300px),表示从左侧开始运动。
1 | @keyframes loadingTranslate { |
2 | 50% { |
3 | transform: translateX(0); |
4 | opacity: .8; |
5 | } |
6 | 100% { |
7 | transform: translateX(300px); |
8 | opacity: 0; |
9 | } |
10 | } |
Loading-05
loading-05定义的动画如下所示。
loading-05是旋转效果,可以很容易想到是通过rotate实现。
loading-05中只有一个div,边框设置为虚线即可,其CSS样式如下。
1 | .ring { |
2 | width: 10px; |
3 | height: 10px; |
4 | margin: 0 auto; |
5 | padding: 10px; |
6 | border: 7px dashed #000; |
7 | border-radius: 50%; |
8 | } |
其定义的动画样式如下。
1 | @keyframes loadingTranslate { |
2 | 50% { |
3 | transform: rotate(180deg); |
4 | } |
5 | 100% { |
6 | transform: rotate(360deg); |
7 | } |
8 | } |
Loading-06 & Loading-07
loading-06与loading-07的动画效果如下。
loading-06与loading-07类似,loading-07在loading-06的基础上增加了几个点。
loading-06中是通过设置一个纵向的div-1,在该div-1内增加一个div-2,div-2就是转动的圆点,div-2通过绝对定位计算出实际位置,当div-1大小变化时,div-2也应该重新计算位置。
div-2的CSS代码如下所示。
1 | .ball { |
2 | position: absolute; |
3 | top: -10px; |
4 | left: -1px; |
5 | width: 16px; |
6 | height: 16px; |
7 | border-radius: 100%; |
8 | background: #f44336; |
9 | } |
在loading-07中,div-1内有四个div,分别表示转动的四个圆点,也是通过绝对定位计算偏移位置。
最后设置动画,只需要让div-1在一个动画周期内旋转360度即可。
1 | @keyframes loadingTranslate { |
2 | 100% { |
3 | transform: rotate(360deg); |
4 | } |
5 | } |
Loading-08
loading-08的效果图如下所示。
loading-08的动画主要涉及到放大缩小和旋转两个方面,放大缩小通过scale实现,旋转通过rotate实现。具体的可以看看github上的完整代码。
Loading-09
主要思路如下:
- 构造三个并排的圆
- 通过设置一定的动画延时来使得三个圆有此起彼伏的感觉
infinite表示动画无限次播放,alternate表示动画从头到尾后再从尾到头。
实现代码:
1 | @keyframes loadingTranslate { |
2 | form { |
3 | transform: scale(0.2); |
4 | } |
5 | |
6 | to { |
7 | transform: scale(1.2); |
8 | } |
9 | } |
最终实现效果:
Loading-10
这种是最简单的,HTML只需要一个标签,CSS也是寥寥几行。简单说一下思路:
- 给一个元素设置宽高相等的数值,
- border-radius设置成50%使其变成一个圆形,
- 将背景色设置为透明,给元素加上几个像素的边框,并配上自己喜欢的颜色,
- 需要注意的是,这里要将其中一个边的边框设置为透明,使其看起来像是一个只有四分之三的圆环,
- 然后为其设置动画,让它动起来就可以了。
实现代码:
1 | @keyframes loadingRotate { |
2 | from { |
3 | transform: translate(0%, 0%) rotate(0deg); |
4 | } |
5 | to { |
6 | transform: translate(0%, 0%) rotate(360deg); |
7 | } |
8 | } |
最终实现效果:
参考:
头条号——Coder分享