uniapp纯CSS实现圆形进度条组件

简介: uniapp纯CSS实现圆形进度条组件

uniapp纯CSS实现圆形进度条组件。圆形进度条组件组合做一个步骤进度组件是非常常见。

纯 CSS 实现圆形进度条组件有以下几个好处:

轻量级:由于纯 CSS 实现,无需额外的 JavaScript 或图像资源,所以组件的文件大小相对较小,加载速度快,对页面性能的影响较小。


兼容性好:CSS 是 Web 标准的一部分,几乎所有现代浏览器都支持 CSS。因此,纯 CSS 实现的圆形进度条组件在各种设备和浏览器上都能正常显示和运行。


可定制性强:CSS 提供了丰富的样式属性和选择器,可以灵活地自定义圆形进度条的样式、颜色、大小、动画效果等,以满足不同项目和设计需求。


简单易用:纯 CSS 实现的圆形进度条组件通常使用简单,只需要在 HTML 中添加相应的 CSS 类或样式即可,无需复杂的配置或调用 JavaScript 函数。


性能优化:由于纯 CSS 实现的圆形进度条不涉及 JavaScript 的计算和操作,可以减轻客户端的计算负担,提高页面的响应速度和性能。

<template>
  <view class="flex align-center diygw-col-24 justify-center">
    <view class="progress-circle " :class="'progress-'+innerPercent" :style="{
      '--not-progress-color':notProgressColor,
      '--bg-color':bgColor,
      '--color':color,
      '--progress-color':progressColor,
      '--width':$u.addUnit(width),
      '--font-size':$u.addUnit(fontSize),
      '--border-width':$u.addUnit(borderWidth)
    }">
      <view class="inner">
         <view class="progress-number">{{innerPercent}}%</view>
      </view>
    </view>
  </view>
</template>
 
<script>
  export default {
    props: {
      width: {
        type: Number,
        default: 100
      },
      borderWidth: {
        type: Number,
        default: 20
      },
      bgColor: {
        type: String,
        default: '#fff'
      },
      notProgressColor: {
        type: String,
        default: '#ddd'
      },
      progressColor: {
        type: String,
        default: '#07c160'
      },
      color:{
        type: String,
        default: '#07c160'
      },
      fontSize:{
        type: Number,
        default: 24
      },
      /**
       * 进度(0-100)
       */
      percent: {
        type: Number,
        default: 0
      },
      /**
       * 是否动画
       */
      animate: {
        type: Boolean,
        default: true
      },
      /**
       * 动画速率
       */
      rate: {
        type: Number,
        default: 5
      }
    },
    computed: {
      /**
       * @private
       */
      complete() {
        return this.innerPercent == 100
      }
    },
    watch: {
      percent(percent) {
        this.setPercent()
      }
    },
    data() {
      return {
        innerPercent: 0,
        timeout: null
      }
    },
    mounted() {
      this.setPercent()
    },
    methods: {
      setPercent() {
        if (this.animate) {
          this.stepTo(true)
        } else {
          this.innerPercent = this.percent
        }
      },
      clearTimeout() {
        clearTimeout(this.timeout)
        Object.assign(this, {
          timeout: null
        })
      },
      stepTo(topFrame = false) {
        if (topFrame) {
          this.clearTimeout()
        }
        if (this.percent > this.innerPercent && !this.complete) {
          this.innerPercent=this.innerPercent+1
        }
        if (this.percent < this.innerPercent && this.innerPercent > 0) {
          this.innerPercent--
        }
        if (this.innerPercent !== this.percent) {
          this.timeout = setTimeout(() => {
            this.stepTo()
          }, this.rate)
        }
      }
    }
  }
</script>
 
<style lang="scss" scoped>
  .progress-circle {
    --progress-color:#63B8FF;
    --not-progress-color:#ddd;
    --bg-color:#fff;
    --width: 240rpx;
    --border-width: 10rpx;
    --color:#777;
    --font-size:1.5rem;
    
    $diythemeColor:var(--progress-color) ;
    $diybackColor: var(--not-progress-color) ;
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
    width: var(--width);
    height: var(--width);
    border-radius: 50%;
    transition: transform 1s;
    background-color: $diybackColor;
    padding:var(--border-width);
    
    .inner{
      width:100%;
      height: 100%;
      display: flex;
      align-items: center;
      justify-content: center;
      border-radius: 50%;
      z-index:1;
      background-color: var(--bg-color);
    }
 
    &:before {
      content: '';
      left:0;
      top:0;
      position: absolute;
      width: 100%;
      height: 100%;
      border-radius: 50%;
      background-color: $diythemeColor;
    }
    
    $step: 1;
    $loops: 99;
    $increment: 3.6;
    $half: 50;
    
    @for $i from 0 through $loops {
      &.progress-#{$i * $step}:before {
        @if $i < $half {
          $nextDeg: 90deg+($increment * $i);
          background-image: linear-gradient(90deg, $diybackColor 50%, transparent 50%, transparent), linear-gradient($nextDeg, $diythemeColor 50%, $diybackColor 50%, $diybackColor);
        }
        @else {
          $nextDeg: -90deg+($increment * ($i - $half));
          background-image: linear-gradient($nextDeg, $diythemeColor 50%, transparent 50%, transparent), linear-gradient(270deg, $diythemeColor 50%, $diybackColor 50%, $diybackColor);
        }
      }
    }
    
    .progress-number {
      width: 100%;
      line-height: 1;
      text-align: center;
      font-size: var(--font-size);
      color: var(--color);
    }
  }
 
</style>


目录
相关文章
|
2天前
Uniapp矩阵评分组件
Uniapp矩阵评分组件
12 1
|
2天前
|
机器学习/深度学习 算法 数据可视化
UniApp手机滑块验证组件代码生成器
UniApp手机滑块验证组件代码生成器
9 0
|
26天前
|
前端开发 JavaScript
uniapp动态修改css样式(通过js来修改css样式)
uniapp动态修改css样式(通过js来修改css样式)
|
2月前
|
前端开发 JavaScript
|
3月前
|
编解码 前端开发 容器
CSS Flex布局实战案例:构建响应式卡片组件
【7月更文挑战第17天】通过上述步骤,我们成功地使用CSS Flex布局构建了一个响应式的卡片组件。Flexbox不仅简化了布局代码,还让我们能够轻松实现复杂的布局效果,如响应式设计。在实战中,掌握Flexbox将大大提高前端开发的效率和网页布局的质量。希望这个案例能够帮助你更好地理解和应用Flexbox布局。
|
3月前
|
移动开发 前端开发 小程序
uniapp内置组件uni.navigateTo跳转后页面空白问题解决
【7月更文挑战第1天】uniapp内置组件uni.navigateTo跳转后页面空白问题解决
82 4
|
3月前
|
开发框架 前端开发 JavaScript
循序渐进BootstrapVue,开发公司门户网站(2)--- 使用wow.js动画组件以及自定义的CSS样式处理动态效果
循序渐进BootstrapVue,开发公司门户网站(2)--- 使用wow.js动画组件以及自定义的CSS样式处理动态效果
|
3月前
uniapp实战 —— 轮播图【数字下标】(含组件封装,点击图片放大全屏预览)
uniapp实战 —— 轮播图【数字下标】(含组件封装,点击图片放大全屏预览)
63 1
|
3月前
uniapp【组件封装】时间戳格式化为星期
uniapp【组件封装】时间戳格式化为星期
67 0
|
3月前
|
数据库
uniapp 【专题详解 -- 时间】云数据库时间类型设计,时间生成、时间格式化渲染(uni-dateformat 组件的使用)
uniapp 【专题详解 -- 时间】云数据库时间类型设计,时间生成、时间格式化渲染(uni-dateformat 组件的使用)
146 0