zoukankan      html  css  js  c++  java
  • html5 canvas半圆环百分比进度条动画特效

    <!DOCTYPE html>
    <html>
      <head>
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
        <meta http-equiv="content-type" content="text/html;charset=utf-8" />
        <title>动态画一半圆环</title>
      </head>
      <body>
        <div class="ring" style="text-align: center;">
          <canvas id="tutorial" width="125" height="125"></canvas>
          <div class="fraction"><span class="numberOne">95</span></div>
          <span class="title">半圆环</span>
        </div>
        <script>
          let radius = 60; //外环半径
          let thickness = 10; //圆环厚度
          let innerRadius = radius - thickness; //内环半径
          let startAngle = -90; //开始角度
          let endAngle = 180; //结束角度
          let x = 0; //圆心x坐标
          let y = 0; //圆心y坐标
          let canvas = document.getElementById("tutorial");
          canvas.width = 125;
          canvas.height = 125;
    
          let ctx = canvas.getContext("2d");
          ctx.translate(canvas.width / 2, canvas.height / 2); //将绘图原点移到画布中央
          ctx.rotate(angle2Radian(225)); //将画布旋转225度
          ctx.fillStyle = "#eee"; //初始填充颜色
          renderRing(startAngle, endAngle);
    
          //渲染函数
          function renderRing(startAngle, endAngle) {
            ctx.beginPath();
    
            //绘制外环
            ctx.arc(x, y, radius, angle2Radian(startAngle), angle2Radian(endAngle));
    
            //计算外环与内环第一个连接处的中心坐标
            let oneCtrlPoint = calcRingPoint(
              x,
              y,
              innerRadius + thickness / 2,
              endAngle
            );
    
            //绘制外环与内环第一个连接处的圆环
            ctx.arc(
              oneCtrlPoint.x,
              oneCtrlPoint.y,
              thickness / 2,
              angle2Radian(-90),
              angle2Radian(270)
            );
    
            // //绘制内环
            ctx.arc(
              x,
              y,
              innerRadius,
              angle2Radian(endAngle),
              angle2Radian(startAngle),
              true
            );
    
            //计算外环与内环第二个连接处的中心坐标
            let twoCtrlPoint = calcRingPoint(
              x,
              y,
              innerRadius + thickness / 2,
              startAngle
            );
    
            //绘制外环与内环第二个连接处的圆环
            ctx.arc(
              twoCtrlPoint.x,
              twoCtrlPoint.y,
              thickness / 2,
              angle2Radian(-90),
              angle2Radian(270)
            );
    
            ctx.fill();
            // ctx.stroke()
          }
    
          //计算圆环上点的坐标
          function calcRingPoint(x, y, radius, angle) {
            let res = {};
            res.x = x + radius * Math.cos((angle * Math.PI) / 180);
            res.y = y + radius * Math.sin((angle * Math.PI) / 180);
            return res;
          }
    
          //弧度转角度
          function radian2Angle(radian) {
            return (180 * radian) / Math.PI;
          }
    
          //角度转弧度
          function angle2Radian(angle) {
            return (angle * Math.PI) / 180;
          }
    
          //进度条颜色
          var lingrad = ctx.createLinearGradient(0, 0, 150, 0);
          lingrad.addColorStop(0, "#00ABEB");
          lingrad.addColorStop(1, "#fff");
          ctx.fillStyle = lingrad;
    
          //开始绘画
          let tempAngle = startAngle;
          let total = 1000; //总分
          let now = 950; //当前分数
          let percent = now / total; //百分比
          let twoEndAngle = percent * 270 + startAngle;
          let step = (twoEndAngle - startAngle) / 80;
          let numberSpan = document.querySelector(".numberOne");
          let inter = setInterval(() => {
            if (tempAngle > twoEndAngle) {
              clearInterval(inter);
            } else {
              numberSpan.innerText = percent * 100;
              tempAngle += step;
            }
            renderRing(startAngle, tempAngle);
          }, 20);
        </script>
      </body>
    </html>

    vue中使用圆环可以直接使用element-ui组件库    elementui地址 :https://element.eleme.cn/#/zh-CN/component/progress

  • 相关阅读:
    OSI及TCP/IP的概念和区别
    http协议介绍
    Http协议之Content-Length
    粒子群优化算法
    十分钟理解Actor模式
    tomcat原理解析(二):整体架构
    tomcat原理解析(一):一个简单的实现
    【linux】CentOS安装mysql*.rpm提示conflicts with file from package的解决办法
    [分布式] 保证分布式系统数据一致性的6种方案
    【svn】 SVN错误:Attempted to lock an already-locked dir
  • 原文地址:https://www.cnblogs.com/m1754171640/p/14169152.html
Copyright © 2011-2022 走看看