每日鸡汤:每个你想要学习的瞬间都是未来的你向自己求救
需求,实现水波纹动画效果,要求中心一个圆点,然后有3个圈,一圈一圈的向里面缩小。
说实话我第一个想到了给3个圈设置不同的宽高,然后设置动画0-100%,一次缩小宽高!
但是,我转念一想,我是不是也可以用padding设置,就是给每个圈设定一个padding, 逐渐缩小padding, 貌似也能达到相同的效果。 确实可以,但是无论用哪种方法,要想让动画变得顺滑**,就需要给最外圈设置0-1的透明度的变化,要不然总是会有卡顿的感觉,你可以自己尝试一下加与不加的区别**
1. 使用 padding 实现
动画实现:大圈padding缩到中圈的初始padding(同时不透明度从0-1)、中圈的padding缩到小圈的初始padding,小圈padding缩到0
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" />
<title>Document</title>
<script src="./dist/bundle.js"></script>
<style>
.flex-c {
display: inline-flex;
align-items: center;
justify-content: center;
}
.wrapper {
border: 1px solid red;
width: 800px;
height: 800px;
}
.center {
width: 100px;
height: 100px;
background: red;
border-radius: 50%;
}
.circle {
border: 1px solid;
border-radius: 50%;
}
.circle-1 {
padding: 200px;
/*最外圈要加一个透明度的变化*/
border-color: rgba(0, 0, 0, 0);
animation: animate1 2.5s linear infinite;
}
.circle-2 {
padding: 100px;
animation: animate2 2.5s linear infinite;
}
.circle-3 {
padding: 50px;
animation: animate3 2.5s linear infinite;
}
@keyframes animate1 {
0% {
padding: 200px;
/*最外圈要加一个透明度的变化*/
border-color: rgba(0, 0, 0, 0);
}
100% {
padding: 100px;
/*最外圈要加一个透明度的变化*/
border-color: rgba(0, 0, 0, 1);
}
}
@keyframes animate2 {
0% {
padding: 100px;
}
100% {
padding: 50px;
}
}
@keyframes animate3 {
0% {
padding: 50px;
}
100% {
padding: 0px;
}
}
</style>
</head>
<body>
<div class="wrapper flex-c">
<div class="flex-c circle circle-1">
<div class="flex-c circle circle-2">
<div class="flex-c circle circle-3">
<div class="center flex-c">中心</div>
</div>
</div>
</div>
</div>
</body>
</html>
2. 使用宽高实现
动画实现:大圈宽高缩到中圈的初始尺寸(同时不透明度从0-100)、中圈宽高缩到小圈的初始尺寸,小圈缩到中心的尺寸
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" />
<title>Document</title>
<script src="./dist/bundle.js"></script>
<style>
.flex-c {
display: inline-flex;
align-items: center;
justify-content: center;
}
.wrapper {
border: 1px solid rgba(0, 0, 0, 0.5);
width: 1500px;
height: 1500px;
background: #000;
}
.center {
width: 248px;
height: 248px;
background: rgba(255, 255, 255, 0.5);
border-radius: 50%;
opacity: 0.4;
color: #fff;
}
.circle {
border: 1px solid rgba(255, 255, 255, 0.5);
border-radius: 50%;
}
.circle-1 {
width: 1297px;
height: 1297px;
animation: animate1 2.5s linear infinite;
}
.circle-2 {
width: 833px;
height: 833px;
animation: animate2 2.5s linear infinite;
}
.circle-3 {
width: 503px;
height: 503px;
animation: animate3 2.5s linear infinite;
}
@keyframes animate1 {
0% {
width: 1297px;
height: 1297px;
/*最外圈要加一个透明度的变化*/
border-color: rgba(255, 255, 255, 0);
}
100% {
width: 833px;
height: 833px;
/*最外圈要加一个透明度的变化*/
border-color: rgba(255, 255, 255, 0.6);
}
}
@keyframes animate2 {
0% {
width: 833px;
height: 833px;
}
100% {
width: 503px;
height: 503px;
}
}
@keyframes animate3 {
0% {
width: 503px;
height: 503px;
}
100% {
width: 248px;
height: 248px;
}
}
</style>
</head>
<body>
<div class="wrapper flex-c">
<div class="flex-c circle circle-1">
<div class="flex-c circle circle-2">
<div class="flex-c circle circle-3">
<div class="center flex-c">中心</div>
</div>
</div>
</div>
</div>
</body>
</html>