最近项目上的开发需求比较多,加上没有遇到什么难点,就没有整理相关的问题分享给大家,抽空的时候看到了
项目手写的loading效果觉得很好玩(不是我开发的),就想着自己是不也能动手写几个常见的loadig效果。
该文主要把自己在写的过程中一些思路和想法分享出来,也是对自己掌握的东西做个记录。
第一种:圆的加载
首先我们用svg画一个圆
html:
<svg height="50" width="50" viewBox="0 0 50 50">
<circle cx="25" cy="25" r="20"/>
</svg>
style:
circle {
fill: none; // 圆内填充
stroke: #9bf99b; // 圆周颜色
stroke-width: 2; // 圆周宽度
}
如何使圆由短变长再消失的效果,这样的话我们是不是需要先实现非整圆的效果
确定该圆的周长2πr=2x3.14x20 约等于 125.6
style:半圆
circle {
fill: none; // 圆内填充
stroke: #9bf99b; // 圆周颜色
stroke-width: 2; // 圆周宽度
stroke-dasharray: 63px; // 虚线长63px,间距63px,重复
}
style:少10px周长的圆
circle {
fill: none; // 圆内填充
stroke: #9bf99b; // 圆周颜色
stroke-width: 2; // 圆周宽度
stroke-dasharray: 63px 10px; // 虚线长63px,间距10px,重复
}
style:圆
circle {
fill: none; // 圆内填充
stroke: #9bf99b; // 圆周颜色
stroke-width: 2; // 圆周宽度
stroke-dasharray: 126px; // 虚线长126px,间距126px,重复
}
效果1
先画一个圆,让这个圆由短变长然后逐渐消失。
- stroke-dasharray让圆的周长从1px到100px
- stroke-dashoffset让圆偏移他的可视长度从0px-15px-200px
效果2
接下来,让这个圆有一个旋转的效果
- transform有2d或者3d的转换,比如放大缩小,旋转,倾斜
最终实现的代码:
html:
<div class="circle-loading-svg">
<svg height="50" width="50" viewBox="0 0 50 50">
<circle id="circle" cx="25" cy="25" r="20"/>
</svg>
</div>
style:
#circle{
animation: loading-circle 1.4s ease-in-out infinite;
/* 圆内填充 */
fill: none;
/* 圆周颜色 */
stroke: #9bf99b;
/* 圆周宽度 */
stroke-width: 2;
}
@keyframes loading-circle {
0% {
stroke-dasharray: 1px 200px;
stroke-dashoffset: 0;
}
30% {
stroke-dasharray: 100px 200px;
stroke-dashoffset: -15px;
stroke: green;
}
100% {
stroke-dasharray: 100px 200px;
stroke-dashoffset: -120px;
}
}
.circle-loading-svg {
animation: loading-rotate 1.4s linear infinite;
display: flex;
align-items: center;
justify-content: center;
}
@keyframes loading-rotate {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(1turn);
}
}
第二种:线条加载
确定你加载的线条多少,我这里是用到了8个
html:
<svg height="80" width="80" viewBox="0 0 80 80">
<line id="lineRx" x1="40" y1="40" x2="75" y2="40"/>
<line id="lineFx" x1="40" y1="40" x2="65" y2="65"/>
<line id="lineSx" x1="40" y1="40" x2="40" y2="75"/>
<line id="lineTx" x1="40" y1="40" x2="15" y2="65"/>
<line id="lineR" x1="5" y1="40" x2="40" y2="40"/>
<line id="lineF" x1="15" y1="15" x2="40" y2="40"/>
<line id="lineS" x1="40" y1="5" x2="40" y2="40"/>
<line id="lineT" x1="65" y1="15" x2="40" y2="40"/>
<circle cx="40" cy="40" r="15" fill="#ffffff"/>
</svg>
style:
line {
stroke: #9bf99b;
stroke-width: 2;
}
按照我们平时见到的加载样式,有规律的改变每条线条的颜色就可以实现加载的效果。那我们就要写上动画,每条线都需要变色,并且前一个线条变色消失完 后一条接着变色,依次类推。
html:
<svg height="80" width="80" viewBox="0 0 80 80">
<line id="lineRx" x1="40" y1="40" x2="75" y2="40"/>
<line id="lineFx" x1="40" y1="40" x2="65" y2="65"/>
<line id="lineSx" x1="40" y1="40" x2="40" y2="75"/>
<line id="lineTx" x1="40" y1="40" x2="15" y2="65"/>
<line id="lineR" x1="5" y1="40" x2="40" y2="40"/>
<line id="lineF" x1="15" y1="15" x2="40" y2="40"/>
<line id="lineS" x1="40" y1="5" x2="40" y2="40"/>
<line id="lineT" x1="65" y1="15" x2="40" y2="40"/>
<circle cx="40" cy="40" r="15" fill="#ffffff"/>
</svg>
style:
line {
animation: loading-line 0.8s linear infinite;
stroke: #9bf99b;
stroke-width: 2;
}
@keyframes loading-line {
0% {
stroke: green;
opacity: 1;
}
100% {
opacity: 0;
}
}
#lineRx {
animation-delay: 0s;
}
#lineFx {
animation-delay: 0.11s;
}
#lineSx {
animation-delay: 0.22s;
}
#lineTx {
animation-delay: 0.33s;
}
#lineR {
animation-delay: 0.44s;
}
#lineF {
animation-delay: 0.55s;
}
#lineS {
animation-delay: 0.66s;
}
#lineT {
animation-delay: 0.77s;
}
第三种:水滴加载
画几个水滴
html:
<svg height="20" width="20" viewBox="0 0 20 20">
<circle class="circle cF" cx="10" cy="10" r="5"/>
</svg>
<svg height="20" width="20" viewBox="0 0 20 20">
<circle class="circle cS" cx="10" cy="10" r="5"/>
</svg>
<svg height="20" width="20" viewBox="0 0 20 20">
<circle class="circle cT" cx="10" cy="10" r="5"/>
</svg>
<svg height="20" width="20" viewBox="0 0 20 20">
<circle class="circle cX" cx="10" cy="10" r="5"/>
</svg>
<svg height="20" width="20" viewBox="0 0 20 20">
<circle class="circle cY" cx="10" cy="10" r="5"/>
</svg>
style:
.circle {
fill: #9bf99b;
}
有放大缩小的效果,前一个水滴和后一个水滴有时间延迟
html:
<svg height="20" width="20" viewBox="0 0 20 20">
<circle class="circle cF" cx="10" cy="10" r="5"/>
</svg>
<svg height="20" width="20" viewBox="0 0 20 20">
<circle class="circle cS" cx="10" cy="10" r="5"/>
</svg>
<svg height="20" width="20" viewBox="0 0 20 20">
<circle class="circle cT" cx="10" cy="10" r="5"/>
</svg>
<svg height="20" width="20" viewBox="0 0 20 20">
<circle class="circle cX" cx="10" cy="10" r="5"/>
</svg>
<svg height="20" width="20" viewBox="0 0 20 20">
<circle class="circle cY" cx="10" cy="10" r="5"/>
</svg>
style:
.circle {
animation: loading-big 0.8s linear infinite;
fill: #9bf99b;
}
.cF {
animation-delay: 0.11s;
}
.cS {
animation-delay: 0.22s;
}
.cT {
animation-delay: 0.33s;
}
.cX {
animation-delay: 0.44s;
}
.cY {
animation-delay: 0.55s;
}
@keyframes loading-big {
0% {
fill: green;
r: 10px;
}
100% {
fill: #9bf99b;
r: 2px;
}
}
第四种:矩形加载
画几个矩形
html:
<svg width="120" height="200" viewBox="0 0 70 200">
<rect class="cF" x="0" y="20" width="10" height="20"/>
<rect class="cS" x="20" y="20" width="10" height="20"/>
<rect class="cT" x="40" y="20" width="10" height="20"/>
<rect class="cX" x="60" y="20" width="10" height="20"/>
<rect class="cY" x="80" y="20" width="10" height="20"/>
</svg>
style:
rect {
fill: #9bf99b;
}
我们需要在开始和结尾缩小矩形的高度,中间段放大矩形的高度,不需要变化宽度。
html:
<svg width="120" height="200" viewBox="0 0 70 200">
<rect class="cF" x="0" y="20" width="10" height="20"/>
<rect class="cS" x="20" y="20" width="10" height="20"/>
<rect class="cT" x="40" y="20" width="10" height="20"/>
<rect class="cX" x="60" y="20" width="10" height="20"/>
<rect class="cY" x="80" y="20" width="10" height="20"/>
</svg>
style:
rect {
animation: loading-rect 0.8s linear infinite;
fill: #9bf99b;
}
.cF {
animation-delay: 0.11s;
}
.cS {
animation-delay: 0.22s;
}
.cT {
animation-delay: 0.33s;
}
.cX {
animation-delay: 0.44s;
}
.cY {
animation-delay: 0.55s;
}
@keyframes loading-rect {
0%,100% {
fill: #9bf99b;
height: 10px;
}
50%{
fill: green;
height: 60px;
}
}
但是这个不是我们想要的效果,我们希望的是矩形向上和上下放大缩小,如何修改呢?是不是可以想当放大该矩形的时候,让矩形的位置往上移动一下,就是这种感觉
- y: -15px;
html:
<svg width="120" height="200" viewBox="0 0 70 200">
<rect class="cF" x="0" y="20" width="10" height="20"/>
<rect class="cS" x="20" y="20" width="10" height="20"/>
<rect class="cT" x="40" y="20" width="10" height="20"/>
<rect class="cX" x="60" y="20" width="10" height="20"/>
<rect class="cY" x="80" y="20" width="10" height="20"/>
</svg>
style:
rect {
animation: loading-rect 0.8s linear infinite;
fill: #9bf99b;
}
.cF {
animation-delay: 0.11s;
}
.cS {
animation-delay: 0.22s;
}
.cT {
animation-delay: 0.33s;
}
.cX {
animation-delay: 0.44s;
}
.cY {
animation-delay: 0.55s;
}
@keyframes loading-rect {
0%,100% {
fill: #9bf99b;
height: 10px;
}
50%{
fill: green;
height: 60px;
y: -15px;
}
}
思考
- 在实际开发的过程中,肯定会遇到客户想要的各种各样的加载效果,我们能做的就是去拆分这个动画,怎么让静态的动起来。
- 什么时候用纯css实现动画?什么时候用js实现的动画?
- 欢迎留言一起制作有趣的动画吧