【前端html/js】使用canvas實現(xiàn)實時時鐘

【前端html/js】使用canvas實現(xiàn)實時時鐘

實現(xiàn)效果
  • 代碼如下

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>飛宇時鐘</title>
</head>
<body>
    <canvas id="canvas" width="800" height="600"></canvas>

    <script type="text/javascript">
        "use strict ";
        function getDatetime(){
            let da = new Date();
            let hours = da.getHours();
            hours=hours>12?hours-12:hours;
            let minute = da.getMinutes();
            let second = da.getSeconds();
            return [hours,minute,second];
        }
    </script>
    <script type="text/javascript">
        let canvas = document.getElementById('canvas');
        let ctx = canvas.getContext('2d');
        
        // 繪制刻度函數(shù)
        function scaleRender(deg,start,end,bw,color){
            ctx.beginPath();
            ctx.rotate(deg);        // 旋轉(zhuǎn)
            ctx.moveTo(start,0);
            ctx.lineTo(end,0);
            ctx.lineWidth=bw;
            ctx.strokeStyle=color;
            ctx.stroke();
            ctx.closePath();
            ctx.restore();
            ctx.save();
        }
        function initClockBasicInfo(){
            // 圓的中心的 x 坐標,圓的中心的 y 坐標,圓的半徑,起始角,以弧度計,結(jié)束角咏雌,以弧度計默勾∑⊙剩可選志鞍。規(guī)定應(yīng)該逆時針還是順時針繪圖。False = 順時針优幸,true = 逆時針
            // ctx.arc(400,300,200,0,2*Math.PI)
            ctx.beginPath();
            ctx.arc(0,0,200,0,2*Math.PI)
            ctx.strokeStyle="darkgrey";
            ctx.lineWidth=10;
            ctx.stroke();
            ctx.closePath();
            
            ctx.restore();
            ctx.save();
            
            // 繪制分鐘刻度
            for(let j=0;j<60;j++){
                ctx.rotate(Math.PI/30)
                ctx.beginPath();
                ctx.moveTo(180,0);
                ctx.lineTo(190,0);
                ctx.lineWidth = 2;
                ctx.strokeStyle="orangered"
                ctx.stroke()
                ctx.closePath();
            }
            
            ctx.restore();
            ctx.save();
    
            // 繪制時鐘刻度
            for(let i=0;i<12;i++){
                ctx.rotate(Math.PI/6)
                ctx.beginPath();
                ctx.moveTo(180,0);
                ctx.lineTo(200,0);
                ctx.lineWidth = 10;
                ctx.strokeStyle="darkgray"
                ctx.stroke()
                ctx.closePath();
            }
            
            ctx.restore();
            ctx.save();
            
            // 繪制時鐘刻度數(shù)字
            for(let i=1;i<=12;i++){
                ctx.rotate((Math.PI/6));
                ctx.save();
                ctx.beginPath();
                ctx.translate(165,-4);
                ctx.rotate(Math.PI/2-(Math.PI/6)*i);
                ctx.strokeStyle="skyblue"
                // ctx.strokeText((i,150,0)
                ctx.fillText(i, 0, 0);
                // ctx.stroke(); 
                ctx.closePath();
                
                ctx.restore();
            }
            ctx.restore();
            ctx.save();
        }
        
        // 初始化時鐘
        function initClock(){
            ctx.clearRect(0,0,800,600);
            ctx.save();
            // 將畫布移動畫布中央
            ctx.translate(400,300);
            ctx.rotate(-Math.PI/2)
            ctx.save();
            
            initClockBasicInfo();
            
            let time = getDatetime();
            
            // 繪制秒針
            scaleRender(Math.PI/30*time[2],-30,170,2,"coral");
            // 繪制分針
            scaleRender(Math.PI/30*time[1]+2*Math.PI/3600*time[2],-20,150,3,"darkblue");// 根據(jù)分針的時間進行旋轉(zhuǎn)
            // 繪制時針
            scaleRender(Math.PI/6*time[0]+2*Math.PI/(12*60)*time[1] + 2*Math.PI/(12*3600)*time[2],
            -10,140,3,"darkslategray");// 根據(jù)時針的時間進行旋轉(zhuǎn)
            
            // 
            ctx.beginPath();
            ctx.arc(0,0,2,0,Math.PI*2);
            ctx.strokeStyle="red";
            ctx.fill();
            ctx.stroke();
            ctx.closePath();
            
            ctx.restore();
            ctx.rotate(Math.PI/2)
            ctx.font="20px 微軟雅黑";
            ctx.fillText(`${time[0]}:${time[1]}:${time[2]}`,-40,260);
            ctx.restore();
            
        }
        
        initClock();
        
        setInterval(function(){
            initClock();
        },1000);
        
    </script>

</body>
</html>

演示地址

https://www.0fy0.com/clock.html

演示效果

本人github

寫于:2022年1月8日
作者QQ:420318184
郵箱:fy@0fy0.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寂纪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子夭织,更是在濱河造成了極大的恐慌吭露,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尊惰,死亡現(xiàn)場離奇詭異讲竿,居然都是意外死亡,警方通過查閱死者的電腦和手機弄屡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門题禀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人膀捷,你說我怎么就攤上這事迈嘹。” “怎么了全庸?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵秀仲,是天一觀的道長。 經(jīng)常有香客問我壶笼,道長神僵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任覆劈,我火速辦了婚禮保礼,結(jié)果婚禮上沛励,老公的妹妹穿的比我還像新娘。我一直安慰自己炮障,他們只是感情好目派,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胁赢,像睡著了一般址貌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上徘键,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天练对,我揣著相機與錄音,去河邊找鬼吹害。 笑死螟凭,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的它呀。 我是一名探鬼主播螺男,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼纵穿!你這毒婦竟也來了下隧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤谓媒,失蹤者是張志新(化名)和其女友劉穎淆院,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體句惯,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡土辩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了抢野。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拷淘。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖指孤,靈堂內(nèi)的尸體忽然破棺而出启涯,到底是詐尸還是另有隱情,我是刑警寧澤恃轩,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布结洼,位于F島的核電站,受9級特大地震影響详恼,放射性物質(zhì)發(fā)生泄漏补君。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一昧互、第九天 我趴在偏房一處隱蔽的房頂上張望挽铁。 院中可真熱鬧,春花似錦敞掘、人聲如沸叽掘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽更扁。三九已至,卻和暖如春赫冬,著一層夾襖步出監(jiān)牢的瞬間浓镜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工劲厌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留膛薛,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓补鼻,卻偏偏與公主長得像哄啄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子风范,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

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