• canvas 画布绘制时钟


    利用canvas绘制时钟的一个小demo 

     

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>时钟title>
    8. head>
    9. <body>
    10. <canvas id="canvas" width="800" height="600">canvas>
    11. <script type="text/javascript">
    12. let canvas = document.querySelector('#canvas')
    13. let cxt = canvas.getContext('2d')
    14. function renderClock () {
    15. cxt.clearRect(0, 0, 800, 600)//清除画布
    16. // 使用 save() 方法对当前画布区域进行保存,并在以后的任意时间对其进行恢复(通过 restore() 方法)。
    17. cxt.save()//保留画笔之前状态
    18. // 将坐标移动到画布的中央
    19. cxt.translate(400, 300)
    20. cxt.rotate(-2 * Math.PI / 4)//旋转90度让起始角,由原来的(弧的圆形的三点钟位置是 0 度)改为12点位置
    21. cxt.save()
    22. /**
    23. * cxt.arc参数说明
    24. * x 坐标
    25. * 圆的中心的 y 坐标。
    26. * 圆的半径。
    27. * 起始角,以弧度计(弧的圆形的三点钟位置是 0 度)
    28. * 结束角,以弧度计。
    29. * 可选。规定应该逆时针还是顺时针绘图。False = 顺时针,true = 逆时针。
    30. */
    31. // 创建圆绘制表盘
    32. cxt.beginPath()//开始路径
    33. cxt.arc(0, 0, 200, 0, 2 * Math.PI)
    34. cxt.strokeStyle = "darkgrey"
    35. cxt.lineWidth = 10//圆的边宽
    36. cxt.stroke()//实际地绘制出路径。默认颜色是黑色。
    37. cxt.closePath()//结束路径再画刻度;不然会和圆粘在一起
    38. //分钟
    39. for (let j = 0; j < 60; j++) {
    40. cxt.rotate(Math.PI / 30)// 转6度
    41. cxt.beginPath()
    42. cxt.moveTo(180, 0)//x的刻度半径是200所以可以从x为180,Y轴为0开始到200的位置画个20长的刻度
    43. cxt.lineTo(190, 0)
    44. cxt.lineWidth = '2'
    45. cxt.strokeStyle = "orangered"
    46. cxt.stroke()
    47. cxt.closePath()
    48. }
    49. cxt.restore()
    50. cxt.save()
    51. // 绘制小时刻度
    52. for (let i = 0; i < 12; i++) {
    53. cxt.rotate(Math.PI / 6)//每次旋转30度
    54. cxt.beginPath()
    55. cxt.moveTo(180, 0)//x的刻度半径是200所以可以从x为180,Y轴为0开始到200的位置画个20长的刻度
    56. cxt.lineTo(200, 0)
    57. cxt.lineWidth = 8//圆的边宽
    58. cxt.strokeStyle = "darkgrey"
    59. cxt.stroke()
    60. cxt.closePath()
    61. }
    62. // 时间
    63. let time = new Date()
    64. let H = time.getHours()
    65. let M = time.getMinutes()
    66. let S = time.getSeconds()
    67. // 如果时间大于12就直接减去12 (如:当前为17点;那就是17-13=5点)
    68. H = H > 12 ? H - 12 : H
    69. console.log('当前小时', H + ':' + M + ':' + S);
    70. cxt.beginPath()
    71. // 绘制秒针
    72. cxt.rotate(2 * Math.PI / 60 * S)//每秒旋转的刻度乘以秒
    73. cxt.moveTo(-30, 0)//x的刻度半径是200所以可以从x为180,Y轴为0开始到200的位置画个20长的刻度
    74. cxt.lineTo(170, 0)
    75. cxt.lineWidth = 2//圆的边宽
    76. cxt.strokeStyle = "red"
    77. cxt.stroke()
    78. cxt.closePath()
    79. cxt.restore()
    80. cxt.save()
    81. // 绘制分针
    82. cxt.beginPath()
    83. cxt.rotate(2 * Math.PI / 60 * M + 2 * Math.PI / 3600 * S)//每分针一圈360为一圈,一圈有60分钟所以要除以60再乘以分钟得到旋转的角度,加上3600秒为一小时
    84. cxt.moveTo(-20, 0)//x的刻度半径是200所以可以从x为180,Y轴为0开始到200的位置画个20长的刻度
    85. cxt.lineTo(140, 0)
    86. cxt.lineWidth = 4//圆的边宽
    87. cxt.strokeStyle = "darkblue"
    88. cxt.stroke()
    89. cxt.closePath()
    90. cxt.restore()
    91. cxt.save()
    92. // 绘制小时
    93. cxt.beginPath()
    94. cxt.rotate(2 * Math.PI / 12 * H + 2 * Math.PI / 60 / 12 * M + 2 * Math.PI / 12 / 60 / 60 * S)//一小时有12刻度,乘以当间小时+分钟(一圈360度/60分钟/12小时乘以当前的分钟)+秒的算法最后得到每小时走的角度
    95. cxt.moveTo(-20, 0)//x的刻度半径是200所以可以从x为180,Y轴为0开始到200的位置画个20长的刻度
    96. cxt.lineTo(100, 0)
    97. cxt.lineWidth = 6//圆的边宽
    98. cxt.strokeStyle = "darkslategray"
    99. cxt.beginPath()
    100. // 指针中心的小圆
    101. cxt.arc(0, 0, 8, 0, 2 * Math.PI)
    102. cxt.fillStyle = "deepskyblue"
    103. cxt.fill()
    104. cxt.restore()
    105. cxt.restore()//恢复到初始状态
    106. }
    107. setInterval(() => {
    108. renderClock()
    109. }, 1000);
    110. script>
    111. body>
    112. html>

  • 相关阅读:
    逆向WeChat(四)
    ICMP重定向(ICMP redirect)实验分析
    springboot中自定义拦截器用Component注解不用Configuration注解的坏处是什么
    哪些自媒体平台值得操作运营?
    视差滚动:零基础css代码实现时空穿越效果
    排序算法(1)
    浅谈关于数据仓库的理解,聊聊数据仓库到底是什么?
    二叉树,堆排序及TopK问题
    Redis五种基本数据类型-ZSet
    vue3项目,点击分页器,列表接口请求两次的问题
  • 原文地址:https://blog.csdn.net/qq_40190624/article/details/126212458