最近看到一个非常有趣的动画效果:水波进度动画,想了一下实现思路,分享给大家~
效果如下
基本组件代码
先把最基础的组件代码样式写出来,其实无非就是四个部分:
-
1、圆形水缸
-
2、水波
-
2、百分比数字
-
3、进度条
我们先把圆形水缸、百分比数字、进度条
画出来,水波
待会再画
可以看到初步效果已经出来了~
水波效果
最重点的就是水波
,其实这个水波
就是个障眼法罢了,我画张图你们就懂了,其实就是一个圆角正方形
,一直在旋转和上升下降
,让用户有一种水波的视觉感~
所以我们可以画一个圆角正方形,并且让他一直旋转即可
并且我们要让这个水波效果,随着百分比的增加而上升,随着百分比的减少而下降,所以得监听百分比
现在可以发现已经有水波效果了
但是感觉水溢出来了,所以需要给水缸设置一下溢出隐藏
最终实现效果
完整代码
1<template>
2 <div class="wave-container">
3 <!-- 水缸 -->
4 <div class="main">
5 <!-- 百分比数字 -->
6 <div class="main-number">{{ percent }}</div>
7 <!-- 水波效果 -->
8 <div ref="wave" class="wave"></div>
9 </div>
10 <!-- 进度条 -->
11 <Slider v-model:value="percent" class="percent-bar" :tipFormatter="null" />
12 </div>
13</template>
14
15<script setup lang="ts">
16import { ref, watch } from 'vue';
17import { Slider } from 'ant-design-vue';
18
19const percent = ref(0);
20
21const wave = ref<HTMLDivElement | null>(null);
22
23// 监听百分比,计算 top
24watch(
25 percent,
26 v => {
27 const waveEle = wave.value;
28 if (waveEle) {
29 waveEle.style.top = `${200 * (1 - v / 100)}px`;
30 }
31 },
32 {
33 immediate: true,
34 },
35);
36</script>
37
38<style scoped lang="less">
39.wave-container {
40 display: flex;
41 flex-direction: column;
42 align-items: center;
43
44 .main {
45 position: relative;
46 width: 200px;
47 height: 200px;
48 border-radius: 50%;
49 background: #fff;
50 border: #fff solid 5px;
51 display: flex;
52 justify-content: center;
53 align-items: center;
54 // 增加样式隐藏溢出
55 overflow: hidden;
56
57 .main-number {
58 font-size: 100px;
59 z-index: 1;
60 user-select: none;
61 }
62 }
63
64 @keyframes rotateAnimation {
65 from {
66 transform: rotate(0deg);
67 }
68 to {
69 transform: rotate(360deg);
70 }
71 }
72
73 .wave {
74 position: absolute;
75 top: 200px;
76 width: 400px;
77 height: 400px;
78 background: rgb(168, 168, 231);
79 border-radius: 40%;
80 animation: rotateAnimation 2s linear infinite;
81 }
82
83 .percent-bar {
84 width: 200px;
85 background: #fff;
86 }
87}
88</style>
个人笔记记录 2021 ~ 2025