1. 程式人生 > >原生javascript製作時鐘

原生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. 在計算座標的時候,兩個函式的"()"裡面是弧度制,也就是π的形式。