canvas繪制時鐘

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        div{
            text-align: center;
            margin-top:250px;
        }
        #clock{
            border:1px solid #ccc;
        }
    </style>
</head>
<body>
    <div>
        <canvas id="clock" height="200px" width="200px"> </canvas>
    </div>
    <script>        
        var canvas=document.getElementById('clock');
        var ctx=canvas.getContext("2d");
        var r=(canvas.width)/2;  //半徑
        // 比例 為了放大縮小的美觀
        var rem=canvas.width/200          
        function drawBackground(){
            ctx.save()
            // 默寫原點是左上角,可以重新定義,定義到正方形的中心
            ctx.translate(r,r);
            ctx.beginPath();
            ctx.lineWidth=10*rem;
            ctx.arc(0,0,r-ctx.lineWidth/2,0,2*Math.PI,false)  //默認false為順時針
            ctx.stroke();
         // 定義小時數(shù)放到數(shù)組里
            var hourNumber=[3,4,5,6,7,8,9,10,11,12,1,2];
            ctx.font=18*rem+"px Arial";
            ctx.textAlign="center";
            ctx.textBaseline="middle";
            // hourNumber.forEach(function(number,i){
            //       // 定義弧度的
            //       var rad=2*Math.PI /12 * i;
            //       //cos 領邊/斜邊
            //       var x=Math.cos(rad) * (r-30);
            //       var y=Math.sin(rad) * (r-30);
            //       ctx.fillText(number,x,y)
            // })
            for(var i=0;i<hourNumber.length;i++){
                  var rad=2*Math.PI /12 * i;
                  //cos 領邊/斜邊
                  var x=Math.cos(rad) * (r-30*rem);
                  var y=Math.sin(rad) * (r-30*rem);
                  ctx.fillText(hourNumber[i],x,y)
            }        
            for (var j=0;j<60;j++){
               var rad=2*Math.PI /60 * j;
               var x=Math.cos(rad) * (r-17*rem);
               var y=Math.sin(rad) * (r-17*rem);
               ctx.beginPath();
               if(j%5==0){
                   ctx.fillStyle="#000"
                   ctx.arc(x,y,2*rem,0,2*Math.PI,false);
               }else{
                   ctx.fillStyle="#ccc"
                   ctx.arc(x,y,2*rem,0,2*Math.PI,false);
               }
               ctx.fill()
            }
        }       
        //畫時針
        function drawHour(hour,minute){
             ctx.save()    
             ctx.beginPath();
             var rad=2*Math.PI /12 * hour;
             // 分鐘所引起的弧度
             var  mrad=2*Math.PI /12/60*minute;
             ctx.rotate(rad+mrad);
             ctx.lineWidth=6*rem;
             //設置線的兩端是圓的
             ctx.lineCap="round";
             ctx.moveTo(0,10*rem);
             ctx.lineTo(0,-r/2);
             ctx.stroke();

             ctx.restore();

        }
    //畫分針
        function drawMinute(minute){
             ctx.save()
             ctx.beginPath();
             var rad=2*Math.PI /60 * minute;
             ctx.rotate(rad);
             ctx.lineWidth=3*rem;
             //設置線的兩端是圓的
             ctx.lineCap="round";
             ctx.moveTo(0,10*rem);
             ctx.lineTo(0,-r+30*rem);
             ctx.stroke();
             ctx.restore()

        }
        //畫秒針
        function drawSecond(second){
             ctx.save()
             ctx.beginPath();
             var rad=2*Math.PI /60 * second;
             ctx.rotate(rad);
            
             ctx.fillStyle='red';
             ctx.moveTo(-2*rem,20*rem);
             ctx.lineTo(2*rem,20*rem);
             ctx.lineTo(1,-r+18*rem);
             ctx.lineTo(-1,-r+18*rem);
             ctx.fill()
             ctx.restore()
        }

        //畫連接時分秒的一個小圓點
        function drawDot(){
           ctx.beginPath();
           ctx.fillStyle="#fff";
           ctx.arc(0,0,3*rem,0,2*Math.PI);
           ctx.fill();
        }        
        function draw(){
           ctx.clearRect(0,0,canvas.width,canvas.height)
           var date=new Date();
           var hour=date.getHours();
           var minute=date.getMinutes();
           var second=date.getSeconds();
           drawBackground()
           drawHour(hour,minute)
           drawMinute(minute)
           drawSecond(second)
           drawDot()
           ctx.restore()
        }
        draw()
        setInterval(draw,1000);
    </script>
</body>
</html>

效果如下

canvas時鐘特效.png
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末撞反,一起剝皮案震驚了整個濱河市仍源,隨后出現(xiàn)的幾起案子庆亡,更是在濱河造成了極大的恐慌绸狐,老刑警劉巖灸蟆,帶你破解...
    沈念sama閱讀 212,332評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炎疆,死亡現(xiàn)場離奇詭異泌射,居然都是意外死亡,警方通過查閱死者的電腦和手機鞠苟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評論 3 385
  • 文/潘曉璐 我一進店門乞榨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人当娱,你說我怎么就攤上這事吃既。” “怎么了跨细?”我有些...
    開封第一講書人閱讀 157,812評論 0 348
  • 文/不壞的土叔 我叫張陵鹦倚,是天一觀的道長。 經(jīng)常有香客問我冀惭,道長震叙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,607評論 1 284
  • 正文 為了忘掉前任散休,我火速辦了婚禮媒楼,結果婚禮上,老公的妹妹穿的比我還像新娘溃槐。我一直安慰自己匣砖,他們只是感情好,可當我...
    茶點故事閱讀 65,728評論 6 386
  • 文/花漫 我一把揭開白布昏滴。 她就那樣靜靜地躺著猴鲫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谣殊。 梳的紋絲不亂的頭發(fā)上拂共,一...
    開封第一講書人閱讀 49,919評論 1 290
  • 那天,我揣著相機與錄音姻几,去河邊找鬼宜狐。 笑死势告,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的抚恒。 我是一名探鬼主播咱台,決...
    沈念sama閱讀 39,071評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼俭驮!你這毒婦竟也來了回溺?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,802評論 0 268
  • 序言:老撾萬榮一對情侶失蹤混萝,失蹤者是張志新(化名)和其女友劉穎遗遵,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逸嘀,經(jīng)...
    沈念sama閱讀 44,256評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡车要,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,576評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了崭倘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翼岁。...
    茶點故事閱讀 38,712評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绳姨,靈堂內(nèi)的尸體忽然破棺而出登澜,到底是詐尸還是另有隱情阔挠,我是刑警寧澤飘庄,帶...
    沈念sama閱讀 34,389評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站购撼,受9級特大地震影響跪削,放射性物質發(fā)生泄漏。R本人自食惡果不足惜迂求,卻給世界環(huán)境...
    茶點故事閱讀 40,032評論 3 316
  • 文/蒙蒙 一碾盐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧揩局,春花似錦毫玖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至驰怎,卻和暖如春阐滩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背县忌。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評論 1 266
  • 我被黑心中介騙來泰國打工掂榔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留继效,地道東北人。 一個月前我還...
    沈念sama閱讀 46,473評論 2 360
  • 正文 我出身青樓装获,卻偏偏與公主長得像瑞信,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子穴豫,可洞房花燭夜當晚...
    茶點故事閱讀 43,606評論 2 350

推薦閱讀更多精彩內(nèi)容