进度条

港控/mmm° 2022-12-25 15:57 375阅读 0赞
  1. <!DOCTYPE html>
  2. <html lang="cn">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>html5 canvas半圆环百分比进度条动画特效</title>
  8. <style>
  9. .ring {
  10. width: 200px;
  11. height: 200px;
  12. display: flex;
  13. align-items: center;
  14. justify-content: center;
  15. flex-direction: column;
  16. position: relative;
  17. }
  18. .fraction {
  19. position: absolute;
  20. font-size: 30px;
  21. font-weight: bold;
  22. color: #4FBF8D;
  23. }
  24. .small {
  25. font-size: 12px;
  26. font-weight: lighter;
  27. }
  28. .title {
  29. font-size: 20px;
  30. color: #4FBF8D;
  31. bottom: 40px;
  32. position: absolute;
  33. }
  34. </style>
  35. </head>
  36. <body>
  37. <div class="ring">
  38. <canvas id="tutorial"></canvas>
  39. <span class="fraction"><span class="number">0</span> <span class="small">%</span> </span>
  40. </div>
  41. <script>
  42. let radius = 60//外环半径
  43. let thickness = 15 //圆环厚度
  44. let innerRadius = radius - thickness //内环半径
  45. let startAngle = 0 //开始角度
  46. let endAngle = 360 //结束角度
  47. let x = 0 //圆心x坐标
  48. let y = 0 //圆心y坐标
  49. let canvas = document.getElementById('tutorial');
  50. canvas.width = 200;
  51. canvas.height = 200;
  52. let ctx = canvas.getContext('2d');
  53. ctx.translate(canvas.width / 2, canvas.height / 2); //将绘图原点移到画布中央
  54. ctx.rotate(angle2Radian(225)) //将画布旋转225度
  55. ctx.fillStyle = "#eee"; //初始填充颜色
  56. renderRing(startAngle, endAngle)
  57. //渲染函数
  58. function renderRing(startAngle, endAngle) {
  59. ctx.beginPath();
  60. //绘制外环
  61. ctx.arc(x, y, radius, angle2Radian(startAngle), angle2Radian(endAngle))
  62. //计算外环与内环第一个连接处的中心坐标
  63. let oneCtrlPoint = calcRingPoint(x, y, innerRadius + thickness / 2, endAngle)
  64. //绘制外环与内环第一个连接处的圆环
  65. ctx.arc(oneCtrlPoint.x, oneCtrlPoint.y, thickness / 2, angle2Radian(-90), angle2Radian(270))
  66. // //绘制内环
  67. ctx.arc(x, y, innerRadius, angle2Radian(endAngle), angle2Radian(startAngle), true)
  68. //计算外环与内环第二个连接处的中心坐标
  69. let twoCtrlPoint = calcRingPoint(x, y, innerRadius + thickness / 2, startAngle)
  70. //绘制外环与内环第二个连接处的圆环
  71. ctx.arc(twoCtrlPoint.x, twoCtrlPoint.y, thickness / 2, angle2Radian(-90), angle2Radian(270))
  72. ctx.fill()
  73. // ctx.stroke()
  74. }
  75. //计算圆环上点的坐标
  76. function calcRingPoint(x, y, radius, angle) {
  77. let res = { }
  78. res.x = x + radius * Math.cos(angle * Math.PI / 180)
  79. res.y = y + radius * Math.sin(angle * Math.PI / 180)
  80. return res
  81. }
  82. //弧度转角度
  83. function radian2Angle(radian) {
  84. return 180 * radian / Math.PI
  85. }
  86. //角度转弧度
  87. function angle2Radian(angle) {
  88. return angle * Math.PI / 180
  89. }
  90. //进度条颜色
  91. var lingrad = ctx.createLinearGradient(0, 0, 150, 0);
  92. lingrad.addColorStop(0, '#4FBF8D');
  93. lingrad.addColorStop(1, '#4FBF8D');
  94. ctx.fillStyle = lingrad
  95. //开始绘画
  96. let tempAngle = startAngle
  97. let total = 1000 //总分
  98. let now = 900 //当前分数
  99. let percent = now / total //百分比
  100. let twoEndAngle = percent * 360 + startAngle
  101. let step = (twoEndAngle - startAngle) / 80
  102. let numberSpan = document.querySelector('.number')
  103. let inter = setInterval(() => {
  104. if (tempAngle > twoEndAngle) {
  105. clearInterval(inter)
  106. } else {
  107. numberSpan.innerText = percent * 100
  108. tempAngle += step
  109. }
  110. renderRing(startAngle, tempAngle)
  111. }, 20)
  112. </script>
  113. </body>
  114. </html>

发表评论

表情:
评论列表 (有 0 条评论,375人围观)

还没有评论,来说两句吧...

相关阅读