vue3 使用canvas实现环形进度条

1、效果 

 2、代码

<template>
    <div>
      <canvas ref="progressCanvas" ></canvas>
    </div>
</template>
   
<script setup>
import { reactive, onMounted, watch ,getCurrentInstance} from "vue";
const props = defineProps({ 
    size:{
        type: Number,
        default: 100 
    },
    progress: {
        type: Number||String,
        default: 0,
        validator: value => value >= 0 && value <= 100
    },
 })

    onMounted(() => {
      drawProgressCircle1(props.progress);
    })
    const { proxy } = getCurrentInstance()
    function drawProgressCircle1(progress) {
        const rootFontSize = 1;

        // 设备像素比
        const dpr = window.devicePixelRatio || 1;
        
        const canvas = proxy.$refs.progressCanvas

        // 设置canvas的样式大小
        canvas.style.width = `${props.size}px`;
        canvas.style.height = `${props.size}px`;

        // 设置canvas的属性大小
        canvas.width = props.size * rootFontSize * dpr;
        canvas.height = props.size * rootFontSize * dpr;

        const ctx = canvas.getContext('2d');
        const radius = ( props.size * rootFontSize * dpr - 20) / 2;
        const x =  props.size * rootFontSize * dpr / 2;
        const y =  props.size * rootFontSize * dpr / 2;
   
        // 灰色背景圈
        ctx.beginPath();
        ctx.arc(x, y, radius-8* dpr, 0, 2 * Math.PI);
        const gradient = ctx.createLinearGradient(0, 0, x, y)
        gradient.addColorStop(0, 'rgb(220, 222, 247)');
        gradient.addColorStop(1, 'rgb(223, 241, 254)');
        ctx.fillStyle = gradient
        ctx.fill();

        ctx.beginPath();
        ctx.arc(x, y, radius-2* dpr, -0.5 * Math.PI, (-0.5 * Math.PI) + (2 * Math.PI ));
        ctx.strokeStyle = 'rgb(229, 239, 255)'
        ctx.lineWidth = 5* dpr;
        ctx.stroke();
   
        // 彩色进度圈
        ctx.beginPath();
        ctx.arc(x, y, radius, -0.5 * Math.PI, (-0.5 * Math.PI) + (2 * Math.PI * (progress / 100)));
        const gradientCircel = ctx.createLinearGradient(0, 0, x, y)
        gradientCircel.addColorStop(0, '#60C1FF');
        gradientCircel.addColorStop(1, 'rgb(87, 125, 229)');
        ctx.strokeStyle = gradientCircel;
        ctx.lineWidth = 5* dpr;
        ctx.lineCap = "round";
        ctx.stroke();

        ctx.font =  8*dpr + "px Microsoft YaHei";
        const insertContent = progress+'%';
        const measureText = ctx.measureText(insertContent);
        ctx.fillStyle = '#000'
        ctx.fillText(insertContent, (x - ((measureText.width)/2)), y+4* dpr);
        // ctx.fillText(insertContent, 300, 300);

      }
    const progressWatch = watch(() => props.progress,(newVal,oldVal) => {
        drawProgressCircle1(newVal)
    })
  </script>
   
  <style scoped>
  canvas {
    display: block;
  }
  </style>

Vue3使用Echarts环形进度条,可以按照以下步骤进行操作: 1. 首先,确保你已经安装了ECharts库,可以通过npm或yarn进行安装。 2.Vue项目中引入ECharts库。你可以在main.js文件中全局引入ECharts,或者在需要使用环形进度条的组件中引入。 3. 在组件中创建一个canvas元素作为容器来显示环形进度条。可以使用Vue的指令v-if来判断是否显示环形进度条。 4. 定义环形进度条的配置对象,可以在data选项中定义一个progressOptions对象,其中包含了环形进度条的设置。可以引用上述的引用和引用中提到的设置。 5. 在mounted钩子函数中使用ECharts的init方法来初始化环形进度条,并传入之前创建的canvas容器和配置对象。 6.Vue的computed属性中定义一个函数,利用该函数来更新环形进度条的数据。可以在函数中修改progressOptions对象的data属性来更新进度条的数值。 7. 在模板中使用canvas元素来展示环形进度条。 下面是一个示例代码: ```vue <template> <div> <canvas v-if="showProgress" ref="progressChart"></canvas> </div> </template> <script> import * as echarts from &#39;echarts&#39;; export default { data() { return { showProgress: true, progressOptions: { series: [{ type: &#39;pie&#39;, radius: [&#39;60%&#39;, &#39;70%&#39;], center: [&#39;50%&#39;, &#39;50%&#39;], label: { show: false, }, data: [ { value: 50, name: &#39;完成&#39; }, { value: 50, name: &#39;剩余&#39; }, ], itemStyle: { normal: { color: &#39;#f5f5f5&#39;, borderWidth: 10, borderColor: &#39;#f5f5f5&#39;, borderType: &#39;solid&#39;, }, emphasis: { color: &#39;#f5f5f5&#39;, }, }, }], }, }; }, mounted() { const chart = echarts.init(this.$refs.progressChart); chart.setOption(this.progressOptions); }, }; </script> ``` 这是一个基本的示例,你可以根据你的需求来修改配置对象和模板代码。通过上述步骤,你就可以在Vue3使用ECharts来创建一个环形进度条了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Echarts 环形进度条 环形图嵌套](https://blog.csdn.net/Windyluna/article/details/120026774)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值