效果展示
Demo代碼
HTML
<!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">
<link rel="stylesheet" href="style.css">
<title>Document</title>
</head>
<body>
<section><span></span></section>
</body>
</html>
CSS
html, body {
margin: 0;
height: 100%;
}
body {
display: flex;
justify-content: center;
align-items: center;
background: #263238;
}
section {
width: 650px;
height: 300px;
padding: 10px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
border: 2px solid red;
}
span {
width: 20px;
height: 20px;
border-radius: 50%;
display: inline-block;
position: relative;
color: white;
left: -100px;
/* background-color: red; */
animation: loading 4s linear infinite;
}
@keyframes loading {
0% {
box-shadow: 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0);
}
12% {
box-shadow: 100px 0 rgba(255, 255, 255, 1), 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0);
}
25% {
box-shadow: 120px 0 rgba(255, 255, 255, 1), 100px 0 rgba(255, 255, 255, 1), 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0);
}
36% {
box-shadow: 140px 0 rgba(255, 255, 255, 1), 120px 0 rgba(255, 255, 255, 1), 100px 0 rgba(255, 255, 255, 1), 0px 0 rgba(255, 255, 255, 0);
}
50% {
box-shadow: 160px 0 rgba(255, 255, 255, 1), 140px 0 rgba(255, 255, 255, 1), 120px 0 rgba(255, 255, 255, 1), 100px 0 rgba(255, 255, 255, 1);
}
62% {
box-shadow: 200px 0 rgba(255, 255, 255, 0), 160px 0 rgba(255, 255, 255, 1), 140px 0 rgba(255, 255, 255, 1), 120px 0 rgba(255, 255, 255, 1);
}
75% {
box-shadow: 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0), 160px 0 rgba(255, 255, 255, 1), 140px 0 rgba(255, 255, 255, 1);
}
87% {
box-shadow: 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0), 160px 0 rgba(255, 255, 255, 1);
}
100% {
box-shadow: 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0);
}
}
原理詳解
步驟1
使用span標簽九榔,設(shè)置為
- 寬度筋现、高度均為20px
- 圓角化
- 背景色為紅色
width: 20px;
height: 20px;
border-radius: 50%;
position: relative;
background-color: red;
效果圖如下
步驟2
將小球左移100px
left: -100px;
效果圖如下
步驟3
為span添加動畫
使用box-shadow陰影充當白色小球
白色小球有四個
關(guān)鍵有9幀
第一幀
四個白色小球(也就是span的陰影)均位于span初始位置命贴,即紅色小球所處的位置
顏色均為
rgba(255, 255, 255, 0)
(白色钠绍,但是透明級別為0,視覺上看不見)
box-shadow: 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0);
效果圖如下
第二幀
- 小球1移動至紅色小球右側(cè)100px處亏掀,顏色變?yōu)?code>rgba(255, 255, 255, 1)(純白)
- 其余小球位置不變
box-shadow: 100px 0 rgba(255, 255, 255, 1), 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0);
效果圖如下
第三幀
小球1再向右移動20px(即一個小球的直徑長度)
小球2從初識位置移動至紅色小球右側(cè)100px處(即第二幀小球1所處的位置)
小球1缸榄、2顏色均為
rgba(255, 255, 255, 1)
(純白)其余小球不變
box-shadow: 120px 0 rgba(255, 255, 255, 1), 100px 0 rgba(255, 255, 255, 1), 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0);
效果圖如下
第四幀
小球1再向右移動20px(即一個小球的直徑長度)
小球2再向右移動20px
小球3從初識位置移動至紅色小球右側(cè)100px處(即第三幀小球2所處的位置)
小球1渤弛、2祝拯、3顏色均為
rgba(255, 255, 255, 1)
(純白)
box-shadow: 140px 0 rgba(255, 255, 255, 1), 120px 0 rgba(255, 255, 255, 1), 100px 0 rgba(255, 255, 255, 1), 0px 0 rgba(255, 255, 255, 0);
效果圖如下
第五幀
小球1再向右移動20px(即一個小球的直徑長度)
小球2再向右移動20px
小球3再向右移動20px
小球4從初識位置移動至紅色小球右側(cè)100px處(即第四幀小球3所處的位置)
小球1甚带、2、3佳头、4顏色均為
rgba(255, 255, 255, 1)
(純白)
box-shadow: 160px 0 rgba(255, 255, 255, 1), 140px 0 rgba(255, 255, 255, 1), 120px 0 rgba(255, 255, 255, 1), 100px 0 rgba(255, 255, 255, 1);
效果圖如下
第六幀
- 小球1再直接移動至距離紅色小球右側(cè)200px(形成對稱)
- 顏色變?yōu)?code>rgba(255, 255, 255, 0)(白色鹰贵,但是透明級別為0,視覺上就看不見了)
- 小球2康嘉、3碉输、4再向右側(cè)移動20px(一個小球的直徑)
box-shadow: 200px 0 rgba(255, 255, 255, 0), 160px 0 rgba(255, 255, 255, 1), 140px 0 rgba(255, 255, 255, 1), 120px 0 rgba(255, 255, 255, 1);
效果圖如下
第七幀
小球1停留在第六幀的位置(紅色小球右側(cè)200px處)
小球2移動至小球1的位置,顏色變?yōu)?code>rgba(255, 255, 255, 0)(
小球3亭珍、4向右移動20px
box-shadow: 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0), 160px 0 rgba(255, 255, 255, 1), 140px 0 rgba(255, 255, 255, 1);
效果圖如下
第八幀
小球1敷钾、2停留在紅色小球右側(cè)200px處
小球3移動至小球1、2的位置肄梨,顏色變?yōu)?code>rgba(255, 255, 255, 0)
小球4向右移動20px
box-shadow: 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0), 160px 0 rgba(255, 255, 255, 1);
效果圖如下
第九幀
- 小球4最后也移動至紅色小球右側(cè)200px處阻荒,顏色變?yōu)橥该?/li>
box-shadow: 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0);
效果圖如下
各幀之間使用linear速度曲線平穩(wěn)過渡
綜上,動畫代碼為
animation: loading 4s linear infinite;
/*動畫實現(xiàn)*/
@keyframes loading {
/*第一幀*/
0% {
box-shadow: 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0);
}
/*第二幀*/
12% {
box-shadow: 100px 0 rgba(255, 255, 255, 1), 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0);
}
/*第三幀*/
25% {
box-shadow: 120px 0 rgba(255, 255, 255, 1), 100px 0 rgba(255, 255, 255, 1), 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0);
}
/*第四幀*/
36% {
box-shadow: 140px 0 rgba(255, 255, 255, 1), 120px 0 rgba(255, 255, 255, 1), 100px 0 rgba(255, 255, 255, 1), 0px 0 rgba(255, 255, 255, 0);
}
/*第五幀*/
50% {
box-shadow: 160px 0 rgba(255, 255, 255, 1), 140px 0 rgba(255, 255, 255, 1), 120px 0 rgba(255, 255, 255, 1), 100px 0 rgba(255, 255, 255, 1);
}
/*第六幀*/
62% {
box-shadow: 200px 0 rgba(255, 255, 255, 0), 160px 0 rgba(255, 255, 255, 1), 140px 0 rgba(255, 255, 255, 1), 120px 0 rgba(255, 255, 255, 1);
}
/*第七幀*/
75% {
box-shadow: 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0), 160px 0 rgba(255, 255, 255, 1), 140px 0 rgba(255, 255, 255, 1);
}
/*第八幀*/
87% {
box-shadow: 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0), 160px 0 rgba(255, 255, 255, 1);
}
/*第九幀*/
100% {
box-shadow: 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0);
}
}
效果圖如下
步驟4
注釋掉span的背景色(取消紅色)
效果圖如下