神奇的进度条!水缸进度动画效果怎么实现的?

最近看到一个非常有趣的动画效果:水波进度动画,想了一下实现思路,分享给大家~

效果如下

图片

图片

图片

图片

基本组件代码

先把最基础的组件代码样式写出来,其实无非就是四个部分:

1、圆形水缸

2、水波

2、百分比数字

3、进度条

我们先把圆形水缸、百分比数字、进度条画出来,水波待会再画

图片

图片

可以看到初步效果已经出来了!

图片

图片

水波效果

最重点的就是水波,其实这个水波就是个障眼法罢了,我画张图你们就懂了,其实就是一个圆角正方形,一直在旋转和上升下降,让用户有一种水波的视觉感~

图片

图片

所以我们可以画一个圆角正方形,并且让他一直旋转即可

图片

图片

图片

图片

并且我们要让这个水波效果,随着百分比的增加而上升,随着百分比的减少而下降,所以得监听百分比

图片

图片

图片

图片

现在可以发现已经有水波效果了!

图片

图片

但是感觉水溢出来了,所以需要给水缸设置一下溢出隐藏!

图片

图片

最终实现效果:

图片

完整代码

<template>
  <div class="wave-container">
    <!-- 水缸 -->
    <div class="main">
      <!-- 百分比数字 -->
      <div class="main-number">{{ percent }}</div>
      <!-- 水波效果 -->
      <div ref="wave" class="wave"></div>
    </div>
    <!-- 进度条 -->
    <Slider v-model:value="percent" class="percent-bar" :tipFormatter="null" />
  </div>
</template>

<script setup lang="ts">
import { ref, watch } from 'vue';
import { Slider } from 'ant-design-vue';

const percent = ref(0);

const wave = ref<HTMLDivElement | null>(null);

// 监听百分比,计算 top
watch(
  percent,
  v => {
    const waveEle = wave.value;
    if (waveEle) {
      waveEle.style.top = `${200 * (1 - v / 100)}px`;
    }
  },
  {
    immediate: true,
  },
);
</script>

<style scoped lang="less">
.wave-container {
  display: flex;
  flex-direction: column;
  align-items: center;

  .main {
    position: relative;
    width: 200px;
    height: 200px;
    border-radius: 50%;
    background: #fff;
    border: #fff solid 5px;
    display: flex;
    justify-content: center;
    align-items: center;
    // 增加样式隐藏溢出
    overflow: hidden;

    .main-number {
      font-size: 100px;
      z-index: 1;
      user-select: none;
    }
  }

  @keyframes rotateAnimation {
    from {
      transform: rotate(0deg);
    }
    to {
      transform: rotate(360deg);
    }
  }

  .wave {
    position: absolute;
    top: 200px;
    width: 400px;
    height: 400px;
    background: rgb(168, 168, 231);
    border-radius: 40%;
    animation: rotateAnimation 2s linear infinite;
  }

  .percent-bar {
    width: 200px;
    background: #fff;
  }
}
</style>
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 小和尚需要挑7次水才可以把水缸挑满。 以下是Python代码实现: ``` current_water = 15 # 当前水量为15升 max_water = 50 # 水缸最大容量为50升 bucket_size = 5 # 小和尚每次挑水的容量为5升 times = (max_water - current_water) // bucket_size # 计算需要挑水的次数 if (max_water - current_water) % bucket_size != : # 如果最后一次挑水不足5升 times += 1 print("小和尚需要挑", times, "次水才可以把水缸挑满。") ``` ### 回答2: 题意理解 山上有一口容纳50升水的缸,现在已经有15升水了,老和尚让小和尚挑水,每次只能挑5升。问小和尚要挑多少次水才可以将缸装满? 算法思路 我们可以利用循环结构来解决这个问题,每次循环中小和尚会挑5升水,每挑一次水,缸内的水就会增加5升,当缸内水的容量达到50升时,就不用再挑水了。 算法实现 通过Python编程语言,我们可以很方便的实现上述算法思路,具体代码如下所示: water = 15 # 已有水量 capacity = 50 # 缸的容量 pick = 5 # 每次挑水量 num = 0 # 挑水次数 while water < capacity: water += pick # 每次循环增加挑水量 num += 1 # 记录挑水次数 print("小和尚需要挑水{}次才能将缸装满。".format(num)) 代码解释 - 第1行定义已有水量water,赋初值为15; - 第2行定义缸的容量capacity,赋初值为50; - 第3行定义每次挑水量pick,赋初值为5; - 第4行定义挑水次数num,赋初值为0; - 第6行开始循环,当水量未达到缸容量时,执行循环体中的代码; - 第7行挑水,water加上pick,表示将pick升水倒入缸中; - 第8行记录挑水次数,num加1; - 循环体执行结束后,执行第10-11行的代码,输出挑水次数。 答案解析 当缸内水的容量达到50升时,循环自动停止,此时挑水次数即为小和尚需要挑水的次数。通过上面给出的代码,我们可以运行得出小和尚需要挑水3次才可以将缸装满。 总结 在实际生活中,编程思维可以帮助我们解决很多问题,让我们更有效地分析问题、解决问题。这个问题就是一个非常简单的例子,通过编程实现,可以更加深入地理解这个问题,并且可以将这种思维运用到更加实际的问题中。 ### 回答3: 这道数学题目可以通过编写一个简单的程序进行求解。我们可以先使用一个变量来记录当前缸内的水量,每次循环中让小和尚挑水,直到水缸满为止。程序可如下所示: ``` # 初始化当前水量为15升 current_water = 15 # 循环直到水缸满 while current_water < 50: # 小和尚挑5升水 current_water += 5 # 输出挑水次数 print("小和尚需要挑", (current_water - 15) / 5, "次水才可以把水缸挑满") ``` 程序中首先将当前水量设为15升,然后进入一个while循环,循环条件为当前水量小于50升,即水缸未满。在循环中,每次让小和尚挑5升水,同时将当前水量加上5。当水缸满时,循环结束。最后,程序输出小和尚需要挑水的次数,即当前水量与初始水量之差除以5。在本例中,小和尚需要挑7次水才可以将水缸挑满。 综上所述,通过编写一个简单的while循环以及一些基本的数学运算,我们就能轻松地解决这道数学问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诗者才子酒中仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值