Vue环形进度条

  • 环形进度条可设置背景颜色,遮罩层,文字,百分值默认保存两位小数
  • sizeOut:底圈半径 Number 默认值:100
  • sizeIn里圈半径 Number 默认值:80
  • size进度条大小 Number 默认值:10 注意:需要满足sizeOut>sizeIn+size
  • colorBg背景色 String 默认值:#fff 支持rgb\rgba\十六进制(3位或者6位)\hsl\hsla
  • colorTop进度条颜色 String 默认值:#0f0 支持rgb\rgba\十六进制(3位或者6位)\hsl\hsla
  • colorBottom进度条打底色 String 默认值:#ccc 支持rgb\rgba\十六进制(3位或者6位)\hsl\hsla
  • target进度的百分比 Number默认值:0
  • total:总数 Number默认值100
  • index:当前完成的个数 默认值0 注意:如果选择target会优先使用target,如果没有传入target可以采用total配合index的方式,由本组建进行计算
  • text:显示文本 String 默认值:进行中
  • textSize文本大小 Number 默认值:20
  • textcolor文本颜色 String 默认值:#f50 支持rgb\rgba\十六进制(3位或者6位)\hsl\hsla
  • percentageSize:百分比文字颜色 String默认值#ff6321 支持rgb\rgba\十六进制(3位或者6位)\hsl\hsla
  • percentageSize:百分数文字大小 Number 默认值 30
  • encumbrances:百分值保留多少位小数 Number 默认值 2
  • hasMask:是否有遮罩层 Boolean 默认值false
<template>
    <div :class="hasMask?'hasmask':''">
        <svg ref="svg" :class="['yh-progress-box',hasMask?'hasmask':'']" :style="{height:sizeOut*2+'px',width:sizeOut*2+'px',backgroundColor:colorBg}">
            <circle cx="75" cy="75" :r="sizeIn" fill="transparent" :stroke="colorBottom" :stroke-width="size" :stroke-dasharray="2*sizeIn*3.14"
                stroke-dashoffset="0" class="yh-progress-bottom" :style="{transformOrigin:`${sizeOut}px 75px`,width:sizeIn*2+'px',height:sizeIn*2+'px'}"></circle>
            <circle cx="75" cy="75" :r="sizeIn" fill="transparent" :stroke="colorTop" :stroke-width="size" :stroke-dasharray="2*sizeIn*3.14"
                :stroke-dashoffset="show" class="yh-progress-top" :style="{transformOrigin:`${sizeOut}px 75px`,width:sizeIn*2+'px',height:sizeIn*2+'px'}" >
            </circle>
            <text :x="sizeOut" :y="sizeOut" text-anchor="middle" :fill="percentageColor" :font-size="percentageSize" font-weight="600">
                {{percentage}}%
            </text>
            <text :x="sizeOut" :y="sizeOut+percentageSize" text-anchor="middle" :font-size="textSize" :fill="textcolor">
                {{text}}
            </text>
        </svg>
    </div>
</template>

<script>

 function CheckIsColor(bgVal) {
      let type='';
      if(/^rgb\(/.test(bgVal)){
          //如果是rgb开头,200-249,250-255,0-199
         type = "^[rR][gG][Bb][\(]([\\s]*(2[0-4][0-9]|25[0-5]|[01]?[0-9][0-9]?)[\\s]*,){2}[\\s]*(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)[\\s]*[\)]{1}$";
      }else if(/^rgba\(/.test(bgVal)){
          //如果是rgba开头,判断0-255:200-249,250-255,0-199 判断0-1:0 1 1.0 0.0-0.9
         type = "^[rR][gG][Bb][Aa][\(]([\\s]*(2[0-4][0-9]|25[0-5]|[01]?[0-9][0-9]?)[\\s]*,){3}[\\s]*(1|1.0|0|0.[0-9])[\\s]*[\)]{1}$";
      }else if(/^#/.test(bgVal)){
          //六位或者三位
         type = "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$"
      }else if(/^hsl\(/.test(bgVal)){
          //判断0-360 判断0-100%(0可以没有百分号)
         type = "^[hH][Ss][Ll][\(]([\\s]*(2[0-9][0-9]|360|3[0-5][0-9]|[01]?[0-9][0-9]?)[\\s]*,)([\\s]*((100|[0-9][0-9]?)%|0)[\\s]*,)([\\s]*((100|[0-9][0-9]?)%|0)[\\s]*)[\)]$";
      }else if(/^hsla\(/.test(bgVal)){
          type = "^[hH][Ss][Ll][Aa][\(]([\\s]*(2[0-9][0-9]|360|3[0-5][0-9]|[01]?[0-9][0-9]?)[\\s]*,)([\\s]*((100|[0-9][0-9]?)%|0)[\\s]*,){2}([\\s]*(1|1.0|0|0.[0-9])[\\s]*)[\)]$";
      }
      let re = new RegExp(type);
      if (bgVal.match(re) == null){
         return false
      }else{
         return true
     }
    }
export default {
    name:'progressBar',
    props:{
        sizeOut:{
            type:Number,
            default:100
        },
        sizeIn:{
            type:Number,
            default:80,
        },
        size:{
            type:Number,
            default:10
        },
        colorBg:{
            type:String,
            default:'#fff',
            validator:function(value){
                CheckIsColor(value)
            }
        },
        colorTop:{
            type:String,
            default:'#0f0',
            validator:function(value){
                CheckIsColor(value)
            }
        },
        colorBottom:{
            type:String,
            default:'#ccc',
             validator:function(value){
                CheckIsColor(value)
            }
        },
        target:{
            type:Number,
            default:0
        },
        total:{
            type:Number,
            default:100
        },
        index:{
            type:Number,
            default:0
        },
        text:{
            type:String,
            default:'进行中'
        },
        textSize:{
            type:Number,
            default:20
        },
        textcolor:{
            type:String,
            default:'#f50',
            validator:function(value){
                CheckIsColor(value)
            }
        },
        percentageSize:{
            type:Number,
            default:30,
        },
        percentageColor:{
            type:String,
            default:'#ff6321',
            validator:function(value){
                CheckIsColor(value)
            }
        },
        hasMask:{
            type:Boolean,
            default:false
        },
        encumbrances:{
            type:Number,
            default:2
        }
    },
    computed:{
        show: function(){
            if(this.target){
                return ((100-this.target)*2*this.sizeIn*3.14/100).toFixed(this.encumbrances)
            }else{
                return ((1-this.index/this.total)*2*this.sizeIn*3.14).toFixed(this.encumbrances)
            }
        },
        percentage: function(){
            if(this.target){
                return this.target.toFixed(this.encumbrances)
            }else{
               return ((this.index/this.total)*100).toFixed(this.encumbrances)
            }
        }
    },
}
</script>


<style lang="less">
.yh-progress-box{
    position: relative;
    border-radius: 50%;
    .yh-progress-bottom,.yh-progress-top{
        position: absolute;
        z-index: inherit;
        transform: rotate(-90deg);
    }
}
.hasmask{
    width: 100%;
    height: 100%;
    background-color:rgba(0, 0, 0, 0.3);
    position: fixed;
    top: 0;
    left: 0;
    .yh-progress-box{
        top: 50%;
        left:50%;
        transform: translate(-50%,-50%);
    }
}
</style>

测试用例

<template>
    <progress-bar :sizeOut="100" :index="20" :total="100" />
</template>
<script>
import progressBar from '@/components/progress-bar'
export default {
  components:{
    progressBar
  }
}
</script>

在这里插入图片描述

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用是一个小程序的wxml代码,其中包含了两个圆环进度条的实例。每个圆环进度条组件被包裹在一个view标签中,并设置了相应的属性,如canvasWidth、value、valueColor和lineWidth等。引用是该小程序的目录结构图,其中包含了使用到的组件circle的路径。引用是该小程序的js代码,其中使用setInterval函数每隔1秒更新了两个圆环进度条的值per和per1。 根据提供的信息,我了解到你想实现一个vue环形进度条滑动的效果。在Vue中,你可以使用第三方库或者自定义组件来实现这个效果。一个常见的库是vue-circle-progress,它提供了一个圆环进度条组件可以实现滑动效果。你可以按照该库的文档来安装和使用该组件。 另外,你也可以自定义一个组件来实现环形进度条的滑动效果。你可以使用Vue的transition和animation属性来实现动画效果,并通过改变数据的值来实现进度条的滑动。 希望这些信息对你有帮助,如果你需要更详细的代码实现或者其他信息,请提供更多的上下文。123 #### 引用[.reference_title] - *1* *2* *3* [微信小程序环形进度条模块](https://blog.csdn.net/weixin_46043195/article/details/126305486)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值