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>