css动画水球图

由于echarts水球图动画会导致ios卡顿,所以纯css模拟

展示效果

组件

javascript 复制代码
<template>
  <div class="water-box">
    <div class="water">
      <div class="progress" :style="{ '--newProgress': newProgress + '%' }"></div>
      <div class="num">{
  
  { parseFloat(text).toFixed(2) + '%' }}</div>
    </div>
  </div>
</template>
<script>
export default {
  name: 'Water',
  props: {
    progress: {
      type: Number,
      default: 0
    },
    text: {
      type: Number,
      default: 0
    }
  },
  data() {
    return {
      newProgress: 0
    }
  },
  mounted() {
    this.newProgress = this.progress > 100 ? 100 : this.progress
  },
  watch: {
    progress(val) {
      this.newProgress = val > 100 ? 100 : val
    }
  }
}
</script>

<style scoped lang="scss">
.water-box {
  width: 100px;
  height: 100px;
  border-radius: 50%;
  border: 1px solid #4c5259;
  background: linear-gradient(180deg, #171c25 0%, #313741 49.79%, #171c25 100%);
  box-shadow: 0 2px 10px 0 rgba(255, 255, 255, 0.25);
  display: flex;
  align-items: center;
  justify-content: center;
  .water {
    position: relative;
    display: flex;
    justify-content: center;
    align-items: center;
    width: 87.5px;
    height: 87.5px;
    border-radius: 50%;
    &::after {
      content: '';
      position: absolute;
      left: 0;
      right: 0;
      bottom: 0;
      border: 1px solid #313741;
      background: linear-gradient(135deg, #04bdf8 30.52%, #01e7af 100%, #01e4b4 100%);
      border-radius: 50%;
      top: 0;
    }
    .progress {
      width: 100%;
      height: 100%;
      text-align: center;
      color: #fff;
      line-height: 125px;
      position: absolute;
      left: 0;
      top: 0;
      border-radius: 50%;
      z-index: 1;
      overflow: hidden;
      &::before,
      &::after {
        content: '';
        position: absolute;
        left: -50%;
        width: 200px;
        height: 200px;
      }
      &::before {
        background-color: #313741;
        opacity: 0.8;
        border-radius: 40% 30%;
        animation: rotate1 10s linear infinite;
      }
      &::after {
        background-color: #313741;
        opacity: 0.7;
        border-radius: 42% 40%;
        animation: rotate2 10s linear infinite;
      }
    }
    @keyframes rotate1 {
      0% {
        transform: rotate(0deg);
        bottom: var(--newProgress); /*控制进度*/
      }
      100% {
        transform: rotate(360deg);
        bottom: var(--newProgress);
      }
    }
    @keyframes rotate2 {
      0% {
        transform: rotate(45deg);
        bottom: var(--newProgress);
      }
      100% {
        transform: rotate(360deg);
        bottom: var(--newProgress);
      }
    }
    .num {
      z-index: 2;
      color: #fff;
      font-size: 18px;
      font-weight: 500;
    }
  }
}
</style>

引用

javascript 复制代码
<water
    :progress="66"
    :text="66"
/>
相关推荐
IT_陈寒2 分钟前
Redis性能翻倍的7个冷门技巧:从P5到P8都在偷偷用的优化策略!
前端·人工智能·后端
Moonbit14 分钟前
MoonBit Meetup 丨 手把手带你走进 AI 编程新世代
前端·后端·程序员
携欢15 分钟前
PortSwigger靶场之 CSRF where token is not tied to user session通关秘籍
前端·csrf
HHHHHY1 小时前
使用阿里lowcode,手搓一个Carousel 走马灯容器组件
前端·react.js
用户352120195601 小时前
React-router v7
前端
Mintopia1 小时前
⚡ AI 时代,全栈 Next.js 开发的激情在哪里?
前端·aigc·全栈
Hello123网站1 小时前
300多个Html5小游戏列表和下载地址
前端·html·html5
Stringzhua1 小时前
ElementUi【饿了么ui】
前端·ui·elementui
HHHHHY1 小时前
http接口响应头类型不对,导致svg图片无法预览,前端解决方案
前端·javascript
Komorebi゛2 小时前
【React】配置别名路径
前端·react.js·前端框架