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>


目录
相关文章
|
11月前
|
小程序 前端开发 JavaScript
在线课堂+工具组件小程序uniapp移动端源码
在线课堂+工具组件小程序uniapp移动端源码
224 0
在线课堂+工具组件小程序uniapp移动端源码
|
数据挖掘
uniapp uview扩展u-picker支持日历期间 年期间 月期间 时分期间组件
uniapp uview扩展u-picker支持日历期间 年期间 月期间 时分期间组件
712 10
|
12月前
|
前端开发 JavaScript
CSS样式穿透技巧:利用scoped与deep实现前端组件样式隔离与穿透
CSS样式穿透技巧:利用scoped与deep实现前端组件样式隔离与穿透
1371 1
|
搜索推荐 JavaScript 数据可视化
uniapp/vue个性化单选、复选组件
uniapp/vue个性化单选、复选组件
413 5
|
数据可视化 前端开发 搜索推荐
FLEX组件可视化设计器CSS3代码生成器
FLEX组件可视化设计器CSS3代码生成器
163 4
|
12月前
|
数据可视化 大数据 API
低代码可视化开发-uniapp新闻跑马灯组件-代码生成器
低代码可视化开发-uniapp新闻跑马灯组件-代码生成器
448 2
|
12月前
|
存储 API 数据库
uniapp APP自动更新组件
uniapp APP自动更新组件
428 1
Uniapp矩阵评分组件
Uniapp矩阵评分组件
143 2
|
机器学习/深度学习 算法 数据可视化
UniApp手机滑块验证组件代码生成器
UniApp手机滑块验证组件代码生成器
621 1
|
12月前
|
移动开发 编解码 数据可视化
低代码可视化-uniapp SliderRange区间组件-代码生成器
SliderRange区间组件是一种用户界面元素,允许用户通过拖动滑块选择数值范围。组件支持微信小程序、H5和App,具有高度可定制性、响应式设计和多种事件处理功能。适用于价格筛选、音量调节等场景。代码实现包括滑动区域、滑块、事件处理等部分,支持可视化配置步长、颜色等属性。使用时需注意选择合适步长、提供清晰标签和考虑无障碍设计。
337 0

热门文章

最新文章

  • 1
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
  • 3
    (CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式