结合js利用画布制作一个时钟

首先 搭建canvas画布格式:

动态获取画布的宽和高方便变换,利用translate将圆中心坐标改为0 0;

<canvas width="800px" height="800px"></canvas>
        <script>

            var canvas=document.querySelector("canvas");
            var ctx=canvas.getContext("2d");
            var width=ctx.canvas.width;
            var height=ctx.canvas.height;
            var r=width/2
            ctx.translate(r,r)

第一步 绘制表盘:

利用save来保存当前状态  restore返回之前保存过的状态 ,保证前后不受影响

先用画圆属性arc()绘制一个圆圈

定义一个数组将时间刻度装起来,用for循环来循环添加到变盘上

首先获取到刻度之间的角度,然后利用三角函数得到刻度的位置,最后利用filltext将文本添加上去

function biao(){
            //边框
                    ctx.save();
                    ctx.beginPath()
                ctx.arc(0,0,r-5,0,2*Math.PI,false)
                ctx.lineWidth=10
                ctx.stroke()
            //时间刻度
            var unm=[3,4,5,6,7,8,9,10,11,12,1,2]
                    ctx.font = "18px Arial";
                ctx.textAlign = "center";
                ctx.textBaseline = "middle"
            for(i=0;i<unm.length;i++){
                var edg=2*Math.PI/12*i
                var x=Math.cos(edg)*(r-50)
                var y=Math.sin(edg)*(r-50)
                ctx.fillText(unm[i],x,y)
            }
            //边刻
            for(j=0;j<60;j++){
                ctx.beginPath()
                var rng=2*Math.PI/60*j
                var x=Math.cos(rng)*(r-30)
                var y=Math.sin(rng)*(r-30)
                if(j%5==0){
                    ctx.fillStyle="black"
                }else{
                    ctx.fillStyle="#ccc"
                }
                ctx.arc(x,y,2,0,2*Math.PI,false)
                ctx.fill()
            }
            ctx.restore()
            }

第二步 绘制时针:

现获取到每小时之间的弧度

时针是需要跟随分针改变的

所以需要加上分针对时针的影响得弧度才能的到时正真转动的弧度

//时针
            function hour(shi,fen){
                ctx.save();
                ctx.beginPath()
                var rad=2*Math.PI/12*shi
                //分对时的影响
                var rad1=2*Math.PI/60*fen
                ctx.rotate(rad+rad1)
                ctx.lineCap="round";
                ctx.lineWidth=6
                ctx.moveTo(0,10)
                ctx.lineTo(0,-r/2)
                ctx.stroke()
                ctx.restore()
            }

第三步 绘制分针

//分
            function minute(fen){
                ctx.save();
                ctx.beginPath()
                var rad=2*Math.PI/60*fen
                ctx.rotate(rad)
                ctx.lineCap="round";
                ctx.lineWidth=4
                ctx.moveTo(0,10)
                ctx.lineTo(0,-r+120)
                ctx.stroke()
                ctx.restore()
            }

第四步 绘制秒针

//秒
            function seccond(miao){
                ctx.save();
                ctx.beginPath()
                var rad=2*Math.PI/60*miao
                ctx.rotate(rad)
                ctx.moveTo(-2,20)
                ctx.lineTo(2,20)
                ctx.lineTo(0,-r+70)
                ctx.lineTo(-2,20)
                ctx.fillStyle="aquamarine"
                ctx.fill()
                ctx.restore()
            }

第五步  调用函数,将时间参数添加进去,利用定时器一秒触发一次

function show(){
                ctx.clearRect(-r,-r,width,height)
                var time=new Date();
                var miao=time.getSeconds();
                var fen=time.getMinutes();
                var shi=time.getHours();
                hour(shi,fen)
                minute(fen)
                seccond(miao)
                biao()
            }
            setInterval(show,1000)

完整代码

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <style>
            canvas{
                border: 1px solid black;
            }
        </style>
    </head>
    <body>
        <canvas width="800px" height="800px"></canvas>
        <script>

            var canvas=document.querySelector("canvas");
            var ctx=canvas.getContext("2d");
            var width=ctx.canvas.width;
            var height=ctx.canvas.height;
            var r=width/2
            ctx.translate(r,r)
            function biao(){
            //边框
                ctx.save();
                ctx.beginPath()
                ctx.arc(0,0,r-5,0,2*Math.PI,false)
                ctx.lineWidth=10
                ctx.stroke()
            //时间刻度
            var unm=[3,4,5,6,7,8,9,10,11,12,1,2]
                ctx.font = "18px Arial";
                ctx.textAlign = "center";
                ctx.textBaseline = "middle"
            for(i=0;i<unm.length;i++){
                var edg=2*Math.PI/12*i
                var x=Math.cos(edg)*(r-50)
                var y=Math.sin(edg)*(r-50)
                ctx.fillText(unm[i],x,y)
            }
            //边刻
            for(j=0;j<60;j++){
                ctx.beginPath()
                var rng=2*Math.PI/60*j
                var x=Math.cos(rng)*(r-30)
                var y=Math.sin(rng)*(r-30)
                if(j%5==0){
                    ctx.fillStyle="black"
                }else{
                    ctx.fillStyle="#ccc"
                }
                ctx.arc(x,y,2,0,2*Math.PI,false)
                ctx.fill()
            }
            ctx.restore()
            }

            //时针
            function hour(shi,fen){
                ctx.save();
                ctx.beginPath()
                var rad=2*Math.PI/12*shi
                //分对时的影响
                var rad1=2*Math.PI/60*fen
                ctx.rotate(rad+rad1)
                ctx.lineCap="round";
                ctx.lineWidth=6
                ctx.moveTo(0,10)
                ctx.lineTo(0,-r/2)
                ctx.stroke()
                ctx.restore()
            }
            //分
            function minute(fen){
                ctx.save();
                ctx.beginPath()
                var rad=2*Math.PI/60*fen
                ctx.rotate(rad)
                ctx.lineCap="round";
                ctx.lineWidth=4
                ctx.moveTo(0,10)
                ctx.lineTo(0,-r+120)
                ctx.stroke()
                ctx.restore()
            }
            //秒
            function seccond(miao){
                ctx.save();
                ctx.beginPath()
                var rad=2*Math.PI/60*miao
                ctx.rotate(rad)
                ctx.moveTo(-2,20)
                ctx.lineTo(2,20)
                ctx.lineTo(0,-r+70)
                ctx.lineTo(-2,20)
                ctx.fillStyle="aquamarine"
                ctx.fill()
                ctx.restore()
            }
            function show(){
                ctx.clearRect(-r,-r,width,height)
                var time=new Date();
                var miao=time.getSeconds();
                var fen=time.getMinutes();
                var shi=time.getHours();
                hour(shi,fen)
                minute(fen)
                seccond(miao)
                biao()
            }
            setInterval(show,1000)

效果图

原文地址:https://www.cnblogs.com/xuhanghang/p/10110536.html

时间: 2024-11-05 20:35:53

结合js利用画布制作一个时钟的相关文章

利用html5制作一个时钟动画

1 <canvas id="clock" width="500" height="500" style="background-color: yellow"></canvas> 1 var clock=document.getElementById("clock"); 2 var cxt=clock.getContext("2d"); 3 function dra

利用canvas制作一个时钟

先上张效果图. 利用canvas来画出一个时钟,想想都是一件神奇又美妙的事情.话不多说,先上代码吧. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-sca

利用javafx编写一个时钟制作程序

1.首先创建一个时钟类,用于编写时钟的各种特有属性 package javaclock; /** * * @author admin */import java.util.Calendar;import java.util.GregorianCalendar;import java.util.Scanner; import javafx.scene.layout.Pane;import javafx.scene.paint.Color;import javafx.scene.shape.Circ

html5制作一个时钟

试着用html5写一个时钟 记得开始这个随笔是几天前,一直保存在草稿里面,一直感觉有个东西搁在在那里,所以今天熬夜也要写完这篇博客!!!哈哈...不多说来上代码和思路. --------------------------------------------------------------------------------------------- 其实并不难,主要看你是否掌握了canvas下面几个属性:save(),restore();ratate();translate(),moveT

利用Python制作一个连连看小游戏,边学边玩!

导语 今天我们将制作一个连连看小游戏,让我们愉快地开始吧~ 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 先睹为快 在cmd窗口运行"Game15.py"文件即可. 效果如下: 原理简介 游戏规则: 玩家通过鼠标交换相邻的拼图,若交换后水平/竖直方向存在连续三个相同的拼图,则这些拼图消失,玩家得分,同时生成新的拼图以补充消失的部分,否则,交换失败,玩家不

利用XPT2046制作一个电位器AD转换装置

XPT2046是一款四线制电阻触摸屏控制芯片,内含12位分辨率125KHz转换速率逐步逼近型A/D转换器,支持从1.5V到5.25V的低电压I/O接口. 所谓逐步逼近型,就是输入一个模拟量,其与1000 0000 0000 对应的模拟量进行比较,大则高位取1,小则高位取0.这种思想相当于折半查询,所以可以依次从高位到低位确定所有值,以此来确定模拟量对应的数字量. 我们该如何去用这个芯片,来完成将一个模拟量转换成数字量呢? 初学者确实有很大的困难,我们需要学会怎么去看它的芯片手册. 上图是它的一个

js笔记(制作一个简单的计数器)

首先编写静态页中的按钮: <input  id="result" type="button" value="该程序已经运行了0秒!"/><br>  <input type="button" value="开始" onclick="start()"/>  <input type="button" value="停止&q

利用python制作一个有趣的微信机器人

(想看更详细的同学可以参考:https://www.cnblogs.com/liyanyinng/p/10963105.html) 利用python在微信上制作小型机器人,下面可以来看一下下面的代码 1 #-*- coding:utf-8 -*- 2 import itchat 3 import requests 4 5 def get_response(msg): 6 apiurl = 'http://i.itpk.cn/api.php' #//moli机器人的网址 7 data={ 8 "q

利用Bootstrap制作一个流行的网页

首先是html承载内容: <!DOCTYPE html> <html lang="zh_CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Bootstrap实战</title>