原生javascript制作时钟

用JavaScript来制作实时的时钟

效果图如下:

接下来,我会一步一步向大家介绍如何制作,并将里面的一些值得注意的事项提出来。

首先是把框架搭构起来,

<div>
            <canvas id="canvas" width="500px" height="500px"></canvas>
</div>
<!--
        在外面套一个div主要的作用是将画布居中,这样看起来好看一些    
-->

然后给出div和canvas的样式:

div{
    text-align: center;
    margin-top: 150px;
}
/*canvas{
    border: 1px solid #000;
}*/
/*给画布一个边框,主要用于调整画布的位置*/

获取画布的宽度与高度,这样我们以后更改的时候后面的内容就可以自动改变了,把代码写活,

var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
//获取画布宽和高
var width = canvas.width;
var height = canvas.height;
//获取圆的半径
var r = width / 2;

而且将整个画布的原点(0,0)的位置改变,这样有利于后面位置的计算。

translate(x,y);将x与y点的坐标重新定义为画布的原点。

context.translate(r,r);

原点已经确定好之后就可以画圆了

context.arc(0,0,r - 6,0,Math.PI * 2);
context.arc(x,y,r,sAngle,eAngle,counterclockwise);
参数描述
x圆的中心的 x 坐标。
y圆的中心的 y 坐标。
r圆的半径。
sAngle起始角,以弧度计。(弧的圆形的三点钟位置是 0 度)。
eAngle结束角,以弧度计。
counterclockwise可选。规定应该逆时针还是顺时针绘图。False = 顺时针,true = 逆时针。

然后选择绘制方式,绘制方式有两种:

  1 context.stroke()-----描边

  2 context.fill()-----填充

//描边
context.arc(100,100,50,0,2* Math.PI);
context.strokeStyle = "#00FFFF";
context.stroke();
//填充
context.beginPath();
context.arc(300,300,50,0,2* Math.PI);
context.closePath();
context.fillStyle = "#FF00FF";
context.fill();

效果图:

值得注意的是,在开始第二个绘制路径的时候,必须加上

context.beginPath();    和   

context.closePath();   

不然的话,就会对后面样式的绘制产生影响。

接下来就是将12个数字放到圆的相应的位置,这样一来,我们就要计算每一个位置的x坐标与y坐标。

这就要用到Math.sin()和Math.cos()函数。

                //获取x,y坐标,并将12个数字写到相应的位置
                var hournum = [3,4,5,6,7,8,9,10,11,12,1,2];
                for(var i = 0; i< hournum.length; i++){
                    //时针旋转的角度(弧度制)
                    var rad = 2 * Math.PI / 12 * i;   
                    var x = (r - 30) * Math.cos(rad);  //获取x坐标
                    var y = (r - 30) * Math.sin(rad);  //获取y坐标
                    context.fillText(hournum[i],x,y);
                }
                //画60个点
                for(var j = 0; j< 60; j++){
                    //分针旋转的角度(弧度制)
                    var rad = 2 * Math.PI / 60 * j;
                    var x = (r - 18) * Math.cos(rad);   //获取x坐标
                    var y = (r - 18) * Math.sin(rad);   //获取y坐标
                    context.beginPath();
                    if(j % 5 === 0){      //在3 6 9 12位置,将小圆点的颜色设置为深一些的颜色,可以和其他位置的颜色进行区分
                        context.fillStyle = "#0f0f0f";
                    }else{
                        context.fillStyle = "#f0883a";
                    }
                    context.arc(x,y,3,0,Math.PI * 2);
                    context.closePath();
                    context.fill();
                }

后面就是时针,分针,秒针的绘制,三者基本上是大同小异,我这就给出时针的具体的绘制方法:

//画时针
function drawHour(hour,minu){
        context.save();    //保存当前环境
        context.beginPath();
    var rad_h = 2 * Math.PI / 12 * hour;       
    var rad_m = 2 * Math.PI / 12 / 60 * minu;     //时针的旋转受分针的影响
    context.rotate(rad_h + rad_m);
        context.lineWidth = 6;     //时针的宽度
    context.moveTo(0,7);        //时针的起始点
    context.lineTo(0,-r / 2);    //时针的结束点 
    context.lineCap = "round";    //设置端点形状     如果设置了线帽,就不能有闭合路径
    context.strokeStyle = "#000";
    context.stroke();
    context.restore();    //返回之前所保存的环境
}

至于钉子的绘制方法就是画一个圆,上面已经有了绘制圆的方法,这里就不给出详细的介绍了。

接着是获取系统时间和,对上面函数的调用。

//获取实时时间
function timer(){
    context.clearRect(0,0,width,height);     //清空之前所画的图形
    var now_time = new Date();    //获取当前系统时间
    var hour = now_time.getHours();   //获取当前时
    var minu = now_time.getMinutes();    //获取当前分
    var sec = now_time.getSeconds();    //获取当前秒
    fun();
    drawHour(hour,minu);
    drawMinu(minu,sec);
    drawSec(sec);
    draw();
    context.restore();      //返回之前所保存的环境
}

最后就是设置一个定时器,时间间隔设为1000ms调用一次,这样时钟就实现了。

setInterval(timer,1000);

这里给大家说一下值得注意的地方:

  1. 两个函数的运用:

    save()   ----    保存当前环境状态

    restore()   -----   返回之间保存过得环境状态

  2. 在计算坐标的时候,两个函数的"()"里面是弧度制,也就是π的形式。

 

转载于:https://www.cnblogs.com/mercy-up/p/10110700.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值