一提到环形进度条渐变色,相信大家先想到的是el-progress,以及echarts。现在我们就这两种方案进行开发。
指路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中的仪表盘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>