• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    Canvas三种动态画圆实现方法说明(小结)

    发布者: 网神之王 | 发布时间: 2025-6-16 12:25| 查看数: 56| 评论数: 0|帖子模式

    前言

    canvas是HTML5出来的绘图API容器,对于图形的处理非常强大,下面使用canvas配合JavaScript来做一下动态画圆效果。可以用它来做圆形进度条来使用。
    这里我个人总结了3种实现方法,大家可以参考一下。
    方法一:arc()实现画圆

    代码:
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4.     <meta charset="UTF-8">
    5.     <style type="text/css">
    6.     #myCanvas{
    7.         margin: 0 auto;
    8.         display: block;
    9.     }
    10.     </style>
    11. </head>
    12. <body>
    13.   <canvas id="myCanvas">当前浏览器不支持canvas组件请升级!</canvas>

    14.   <script type="text/javascript">
    15.   //方法一:arc 动态画圆
    16.   var c = document.getElementById('myCanvas');
    17.   var ctx = c.getContext('2d');

    18.   var mW = c.width = 300;
    19.   var mH = c.height = 300;
    20.   var lineWidth = 5;
    21.   var r = mW / 2; //中间位置
    22.   var cR = r - 4 * lineWidth; //圆半径
    23.   var startAngle = -(1 / 2 * Math.PI); //开始角度
    24.   var endAngle = startAngle + 2 * Math.PI; //结束角度
    25.   var xAngle = 1 * (Math.PI / 180); //偏移角度量
    26.   var fontSize = 35; //字号大小
    27.   var tmpAngle = startAngle; //临时角度变量

    28.   //渲染函数
    29.   var rander = function(){
    30.     if(tmpAngle >= endAngle){
    31.       return;
    32.     }else if(tmpAngle + xAngle > endAngle){
    33.       tmpAngle = endAngle;
    34.     }else{
    35.       tmpAngle += xAngle;
    36.     }
    37.     ctx.clearRect(0, 0, mW, mH);

    38.     //画圈
    39.     ctx.beginPath();
    40.     ctx.lineWidth = lineWidth;
    41.     ctx.strokeStyle = '#1c86d1';
    42.     ctx.arc(r, r, cR, startAngle, tmpAngle);
    43.     ctx.stroke();
    44.     ctx.closePath();

    45.     //写字
    46.     ctx.fillStyle = '#1d89d5';
    47.     ctx.font= fontSize + 'px Microsoft Yahei';
    48.     ctx.textAlign='center';
    49.     ctx.fillText( Math.round((tmpAngle -  startAngle) / (endAngle - startAngle) * 100) + '%', r, r + fontSize / 2);

    50.     requestAnimationFrame(rander);
    51.   };

    52.   rander();
    53.   </script>
    54. </body>
    55. </html>
    复制代码
    思路:
    通过设置的开始角度和结束角度来做限定,然后通过累加临时的角度变量实现动画效果。
    相关函数:
    1. context.arc(x,y,r,sAngle,eAngle,counterclockwise);
    复制代码

    方法二:rotate() 动态画圆

    代码:
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4.     <meta charset="UTF-8">
    5.     <style type="text/css">
    6.     #myCanvas{
    7.         margin: 0 auto;
    8.         display: block;
    9.     }
    10.     </style>
    11. </head>
    12. <body>
    13.   <canvas id="myCanvas">当前浏览器不支持canvas组件请升级!</canvas>

    14.   <script type="text/javascript">
    15.   //方法二:rotate() 动态画圆
    16.   var c = document.getElementById('myCanvas');
    17.   var ctx = c.getContext('2d');

    18.   var mW = c.width = 300;
    19.   var mH = c.height = 300;
    20.   var lineWidth = 5;
    21.   var r = mW / 2; //中间位置
    22.   var cR = r - 4 * lineWidth; //圆半径
    23.   var startAngle = -(1 / 2 * Math.PI); //开始角度
    24.   var endAngle = startAngle + 2 * Math.PI; //结束角度
    25.   var xAngle = 1 * (Math.PI / 180); //偏移角度量
    26.   var fontSize = 35; //字号大小
    27.   var tmpAngle = startAngle; //临时角度变量

    28.   //渲染函数
    29.   var rander = function(){
    30.     if(tmpAngle >= endAngle){
    31.       return;
    32.     }else if(tmpAngle + xAngle > endAngle){
    33.       tmpAngle = endAngle;
    34.     }else{
    35.       tmpAngle += xAngle;
    36.     }
    37.     ctx.clearRect(0, 0, mW, mH);

    38.     //画圈
    39.     ctx.save();
    40.     ctx.beginPath();
    41.     ctx.lineWidth = lineWidth;
    42.     ctx.strokeStyle = '#1c86d1';
    43.     ctx.translate(r, r); //重定义圆点
    44.     ctx.rotate(-Math.PI); //最上方为起点
    45.     for(var i = 0; i <= tmpAngle - startAngle; i += xAngle){ //绘图
    46.       ctx.moveTo(0, cR - lineWidth);
    47.       ctx.lineTo(0, cR);
    48.       ctx.rotate(xAngle); //通过旋转角度和画点的方式绘制圆
    49.     }
    50.     ctx.stroke();
    51.     ctx.closePath();
    52.     ctx.restore();

    53.     //写字
    54.     ctx.fillStyle = '#1d89d5';
    55.     ctx.font= fontSize + 'px Microsoft Yahei';
    56.     ctx.textAlign='center';
    57.     ctx.fillText( Math.round((tmpAngle -  startAngle) / (endAngle - startAngle) * 100) + '%', r, r + fontSize / 2);

    58.     requestAnimationFrame(rander);
    59.   };

    60.   rander();
    61.   </script>
    62. </body>
    63. </html>
    复制代码
    思路:
    通过重新定义圆点坐标为(0,0),然后通过在规定范围内旋转图形,进行单点绘制。
    相关函数:
    1. context.translate(x,y);
    复制代码
    1. context.rotate(angle);
    复制代码

    方法三:获取圆坐标方式 动态画圆

    代码:
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4.     <meta charset="UTF-8">
    5.     <style type="text/css">
    6.     #myCanvas{
    7.         margin: 0 auto;
    8.         display: block;
    9.     }
    10.     </style>
    11. </head>
    12. <body>
    13.   <canvas id="myCanvas">当前浏览器不支持canvas组件请升级!</canvas>

    14.   <script type="text/javascript">
    15.   //方法三:获取圆坐标方式 动态画圆
    16.   var c = document.getElementById('myCanvas');
    17.   var ctx = c.getContext('2d');

    18.   var mW = c.width = 300;
    19.   var mH = c.height = 300;
    20.   var lineWidth = 5;
    21.   var r = mW / 2; //中间位置
    22.   var cR = r - 4 * lineWidth; //圆半径
    23.   var startAngle = -(1 / 2 * Math.PI); //开始角度
    24.   var endAngle = startAngle + 2 * Math.PI; //结束角度
    25.   var xAngle = 2 * (Math.PI / 180); //偏移角度量
    26.   var cArr = []; //圆坐标数组

    27.   //初始化圆坐标数组
    28.   for(var i = startAngle; i <= endAngle; i += xAngle){
    29.     //通过sin()和cos()获取每个角度对应的坐标
    30.     var x = r + cR * Math.cos(i);
    31.     var y = r + cR * Math.sin(i);

    32.     cArr.push([x, y]);
    33.   }

    34.   //移动到开始点
    35.   var startPoint = cArr.shift();
    36.   ctx.beginPath();
    37.   ctx.moveTo(startPoint[0], startPoint[1]);

    38.   //渲染函数
    39.   var rander = function(){
    40.     //画圈
    41.     if(cArr.length){
    42.       ctx.lineWidth = lineWidth;
    43.       ctx.strokeStyle = '#1c86d1';   

    44.       var tmpPoint = cArr.shift();
    45.       ctx.lineTo(tmpPoint[0], tmpPoint[1]);

    46.       ctx.stroke();      
    47.     }else{
    48.       cArr = null;
    49.       return;
    50.     }

    51.     requestAnimationFrame(rander);
    52.   };

    53.   rander();
    54.   </script>
    55. </body>
    56. </html>
    复制代码
    思路:
    通过
    1. sin()
    复制代码
    1. cos()
    复制代码
    按一定的角度偏移量,将开始角度和结束角度之间的坐标位置存于数组中,然后按照数组中的坐标点进行绘制。
    关于坐标点的计算,设计到了一些数学知识,这里我做了一张说明图:

    效果

    后记

    通过上面的绘画方法,大家可以稍加修改制作成进度条插件。
    到此这篇关于Canvas三种动态画圆实现方法说明(小结)的文章就介绍到这了,更多相关Canvas动态画圆内容请搜索脚本之家以前的文章或继续浏览下面的相关文章,希望大家以后多多支持脚本之家!

    来源:https://www.jb51.net/html5/771759.html
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表