环形进度条渐变色的两种方案

背景

实现如下渐变色环形进度条
在这里插入图片描述

解决办法

一提到环形进度条渐变色,相信大家先想到的是el-progress,以及echarts。现在我们就这两种方案进行开发。

方法一:el-progress实现

指路element-plus,访问官网
在这里插入图片描述
官网中给出了环形进度条的写法,但是没有给出渐变色的配置项,这就需要我们自己手动修改,代码如下:

<template>
          <div class="progress-class">
            <el-progress :show-text="false" type="circle" :percentage="75" />
            //关键代码如下
            <svg width="100%" height="100%">
              <defs>
                //x,y即渐变色方向及范围的控制
                <linearGradient id="yellow" x1="1" y1="0" x2="0.3" y2="1">   
                  <stop
                    offset="0%"
                    style="stop-color: #eef2f9" //渐变色颜色
                    stop-opacity="0.1"   //透明度
                  ></stop>

                  <stop
                    offset="100%"
                    style="stop-color: #1a6dff"   //渐变色颜色
                    stop-opacity="1"     //透明度
                  ></stop>
                </linearGradient>
              </defs>
            </svg>
          </div>
  </template>
 <style scoped lang="scss">
  .progress-class {
      position: relative;
      :deep(svg > path:nth-child(2)) {
        stroke: url(#yellow);
      }
    }
 </style>          

在控制台中我们可以看到,实际上el-progress就是两个path组成,第一个就是底色环状,第二个就是进度条,通过修改stroke,我们看到蓝色被我们修改成了红色,所以
如上代码,我们需要手动添加一个svg代替element中的第二个svg,通过给予指定id进行替换。颜色只需要我们自己根据需要就行修改即可。
在这里插入图片描述

方法二:echarts实现

老规矩指路官网
如果要实现多个渐变色进度条的嵌套上述方法具有局限性,用echarts方法实现就方便多了,我的方案是使用echarts中的仪表盘gauge就行实现,代码如下:

<template>
  <div ref="chart" class="chart_wapper"></div>
</template>

<script setup>
import { ref, onMounted } from 'vue';
import * as echarts from 'echarts/core';
import { GaugeChart } from 'echarts/charts';
import { CanvasRenderer } from 'echarts/renderers';
// 注册必须的组件
echarts.use([GaugeChart, CanvasRenderer]);

const chart = ref();
const gaugeChart = ref();
var option;
const props = defineProps({
  gaugeData: {
    type: Array,
    default: () => []
  }
});

onMounted(() => {
  initChart(); // 初始化图标示例
});
function initChart() {
  // 等价于使用 Canvas 渲染器(默认):echarts.init(containerDom, null, { renderer: 'canvas' })
  gaugeChart.value = echarts.init(chart.value);
  option = {
    color: ['#7CFFB2'],
    series: [
      {
        type: 'gauge',
        name: '仪表盘', // 系列名称,用于tooltip的显示
        /*
          从调色盘 option.color 中取色的策略,可选 'series' | 'data'
          'series': 按照系列分配调色盘中的颜色,同一系列中的所有数据都是用相同的颜色
          'data': 按照数据项分配调色盘中的颜色,每个数据项都使用不同的颜色
        */
        zlevel: 2,
        colorBy: 'data',
        center: ['50%', '50%'], // 圆心坐标,[400, 300]: 数组的第一项是横坐标,第二项是纵坐标,支持设置成百分比,['50%', '75%']: 设置成百分比时第一项是相对于容器宽度,第二项是相对于容器高度
        radius: '100%', // 仪表盘半径,可以是相对于容器高宽中较小的一项的一半的百分比,也可以是绝对的数值。
        legendHoverLink: true, // 是否启用图例 hover 时的联动高亮
        startAngle: 270, // 仪表盘起始角度。圆心 正右手侧为0度,正上方为90度,正左手侧为180度。
        endAngle: -90, // 仪表盘结束角度。
        clockwise: true, // 仪表盘刻度是否是顺时针增长
        // min: 0, // 最小的数据值,映射到 minAngle
        // max: 100, // 最大的数据值,映射到 maxAngle
        // splitNumber: 0, // 仪表盘刻度的分割段数

        axisLine: {
          // 仪表盘轴线相关配置
          show: true, // 是否显示仪表盘轴线
          roundCap: true, // 是否在两端显示成圆形
          lineStyle: {
            // 仪表盘轴线样式
            width: 6 // 轴线宽度
            // color: [ // 仪表盘的轴线可以被分成不同颜色的多段。每段的结束位置和颜色可以通过一个数组来表示
            //   [20, '#FF6E76'],
            //   [40, '#FDDD60'],
            //   [60, '#58D9F9'],
            //   [80, '#7CFFB2'],
            //   [100, '#1677FF']
            // ],
            // shadowBlur: 10, // 图形阴影的模糊大小
            // shadowColor: 'rgba(0, 0, 0, 0.5)', // 阴影颜色
            // shadowOffsetX: 3, // 阴影水平方向上的偏移距离
            // shadowOffsetY: 3, // 阴影垂直方向上的偏移距离
            // opacity: 1 // 图形透明度。支持从 0 到 1 的数字,为 0 时不绘制该图形。
          }
        },
        progress: {
          // 展示当前进度
          show: true, // 是否显示进度条
          overlap: false, // 多组数据时进度条是否重叠
          width: 12, // 进度条宽度
          roundCap: true, // 是否在两端显示成圆形
          clip: true, // 是否裁掉超出部分
          itemStyle: {
            // 进度条样式
            color:{
  // 自定义渐变色
  type: 'linear',
  x: 1,
  y: 0,
  x2: 0.3,
  y2: 1,
  colorStops: [
    {
      offset: 0,
      color: '#1a6dff' // 0% 处的颜色
    },

    {
      offset: 1,
      color: '#ECF2FF' // 100% 处的颜色
    }
  ],
  global: false // 缺省为 false
}, // 图形的颜色
            // borderColor: '#1677FF' // 图形的描边颜色
            // borderWidth: 1, // 描边线宽。为 0 时无描边。
            // borderType: 'solid', // 描边类型,可选:'solid' 'dashed' 'dotted'
          }
        },
        splitLine: {
          // 分隔线样式
          show: false // 是否显示分隔线
        },
        axisTick: {
          // 刻度样式
          show: false // 是否显示刻度
        },
        axisLabel: {
          // 刻度标签
          show: false, // 是否显示标签
          color: '#aaa', // 文字的颜色
          fontStyle: 'normal', // 文字字体的风格,可选 'normal' 'italic' 'oblique'
          fontWeight: 'bold', // 文字字体的粗细,可选 'normal' 'bold' 'bolder' 'lighter' 100 | 200 | 300 | 400...
          fontFamily: 'sans-serif', // 文字的字体系列,还可以是 'serif' , 'monospace', 'Arial', 'Courier New', 'Microsoft YaHei', ...
          fontSize: 40 // 文字的字体大小
          // lineHeight: 28, // 行高
          /*
            可以使用颜色值,例如:'#123234', 'red', 'rgba(0,23,11,0.3)'
            也可以直接使用图片,例如:
            backgroundColor: {
              image: 'xxx/xxx.png'
              // 这里可以是图片的 URL,
              // 或者图片的 dataURI,
              // 或者 HTMLImageElement 对象,
              // 或者 HTMLCanvasElement 对象。
            }
          */
          // backgroundColor: 'transparent', // 文字块背景色
          // borderColor: 'red', // 文字块边框颜色
          // borderWidth: 3, // 文字块边框宽度
          // borderType: 'solid', // 文字块边框描边类型,可选 'solid' 'dashed' 'dotted'
          // borderRadius: 10, // 文字块的圆角
          // padding: [6, 12], // 文字块的内边距,文字块宽高不包含 padding
          // width: 60, // 文本显示宽度
          // height: 60 // 文本显示高度
        },
        pointer: {
          // 仪表盘指针
          show: true, // 是否显示指针
          showAbove: true, // 指针是否显示在标题和仪表盘详情上方
          // 可以通过 'image://url' 设置为图片,其中 URL 为图片的链接,或者 dataURI。
          icon: 'circle', // 标记类型,可选 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow', 'none'
          offsetCenter: [0, '-45%'], // 相对于仪表盘中心的偏移位置,数组第一项是水平方向的偏移,第二项是垂直方向的偏移。可以是绝对的数值,也可以是相对于仪表盘半径的百分比。
          // length: '36%', // 指针长度,可以是绝对数值,也可以是相对于半径的半分比。
          width: 12, // 指针宽度
          itemStyle: {
            // 指针样式
            // color: 'auto' // 图形颜色
            // 线性渐变,前四个参数分别是 x0, y0, x2, y2, 范围从 0 - 1,相当于在图形包围盒中的百分比,如果 globalCoord 为 `true`,则该四个值是绝对的像素位置
            color: '#157aff',
            borderColor: '#fff', // 图形的描边颜色
            borderWidth: 2, // 描边线宽。为 0 时无描边
            borderType: 'solid' // 描边类型,可选:'solid' 'dashed' 'dotted'
          }
        },
        anchor: {
          // 表盘中指针的固定点
          show: false, // 是否显示固定点
          showAbove: false, // 固定点是否显示在指针上面
          size: 120, // 固定点大小
          // 可以通过 'image://url' 设置为图片,其中 URL 为图片的链接,或者 dataURI。
          icon: 'circle', // 标记类型,可选 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow', 'none'
          offsetCenter: [0, '0%'], // 相对于仪表盘中心的偏移位置,数组第一项是水平方向的偏移,第二项是垂直方向的偏移。可以是绝对的数值,也可以是相对于仪表盘半径的百分比。
          itemStyle: {
            // 指针固定点样式
            color: 'pink', // 图形的颜色
            borderColor: 'red', // 固定点边框颜色
            borderWidth: 8, // 描边线宽。为 0 时无描边
            borderType: 'solid' // 描边类型,可选:'solid' 'dashed' 'dotted'
          }
        },
        title: {
          // 仪表盘标题
          show: false, // 是否显示标题
                  },
        detail: {
          // 仪表盘详情,用于显示数据,即表盘中心的数据展示
          show: false, // 是否显示详情
          color: '#1677FF', // 文本颜色
          fontStyle: 'normal', // 文字字体的风格,可选 'normal' 'italic' 'oblique'
          fontWeight: 'bold', // 文字字体的粗细,可选 'normal' 'bold' 'bolder' 'lighter' 100 | 200 | 300 | 400...
          fontFamily: 'Microsoft YaHei', // 文字的字体系列,还可以是 'serif' , 'monospace', 'Arial', 'Courier New', 'Microsoft YaHei', ...
          fontSize: 24, // 文字的字体大小
          backgroundColor: '#fff', // 详情背景色
          // borderColor: '#fff', // 详情边框颜色
          // borderWidth: 1, // 详情边框宽度
          width: 80,
          height: 80,

          // borderType: 'solid', // 'solid' 'dashed' 'dotted'
          borderRadius: 80, // 文字块的圆角
          // padding: [3, 6], // 文字块的内边距
          valueAnimation: true, // 是否开启标签的数字动画
          offsetCenter: [0, 0], // 相对于仪表盘中心的偏移位置,数组第一项是水平方向的偏移,第二项是垂直方向的偏移。可以是绝对的数值,也可以是相对于仪表盘半径的百分比。
          formatter: function (value) {
            // 格式化函数或者字符串
            return value + '';
          },
          itemStyle: {
            color: '#FFF', // 指针颜色,默认(auto)取数值所在的区间的颜色
            opacity: 1, // 图形透明度。支持从 0 到 1 的数字,为 0 时不绘制该图形。
            borderWidth: 0, // 描边线宽,默认 0。为 0 时无描边。
            borderType: 'solid', // 柱条的描边类型,默认为实线,支持 'solid', 'dashed', 'dotted'。
            borderColor: '#000', // 图形的描边颜色,默认 "#000"。支持的颜色格式同 color,不支持回调函数。
            // shadowBlur: 10,         // (发光效果)图形阴影的模糊大小。该属性配合 shadowColor,shadowOffsetX, shadowOffsetY 一起设置图形的阴影效果
            shadowColor: '#fff'
          }
        },

        data: [{name:'1',value:80}]
      }
    ]
  };
  option && gaugeChart.value.setOption(option);
}
</script>
<style scoped>
.chart_wapper {
  width: 200px;
  height: 200px;
}
</style>

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿乐今天敲代码没

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值