欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JS在Canvas元素內繪制鐘表

 更新時間:2022年01月19日 11:03:57   作者:老馬-Max  
這篇文章介紹了JS在Canvas元素內繪制鐘表的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

首先,canvas語法基礎薄弱的小伙伴請點這里,剩下的小伙伴們可以接著往下看了。

一個表,需要畫什么出來呢:3條線(時分秒針),1個圓(表盤),以及60條短線/點(刻度)。

嗯,沒毛病。

那接下來讓我們考慮點細節(jié):一個圓,自然是360°,分成60個刻度,兩個刻度之間相隔6°,然后分針和秒針刻度偏移是相同的,時針的刻度偏移應該是它們的5倍(只有12個小時刻度)=30°,然而你見過時分秒針一樣長的表么?(我反正沒有)所以我們還需要控制它們的長度是不一樣的才對。

咳,有了上面的思考作為基礎了,開搞。

先定個點畫個圓:

var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
ctx.beginPath();
ctx.arc(X坐標, Y坐標, 半徑, 0, 2 * Math.PI, false);
ctx.strokeStyle = 隨便填顏色;
ctx.stroke();
ctx.closePath();

接下來我們要打上時間刻度,可是問題來了:你是可以畫出來一個圓,也知道每個刻度6°角,可如何在畫出來的圓上找到對應的坐標呢?

don't worry(數(shù)學知識過關的小伙伴們表示毫無壓力)~我們只需要去算出正余弦就拿到了對應的XY坐標啦(是的,腳本內正余弦算法不是算角度),具體做法如下:

//計算圓上每個點的坐標
///[a]角度[i]刻度[ox]圓心X坐標[oy]圓心Y坐標[or]圓半徑
function angle(a, i, ox, oy, or) {
    var hudu = (2 * Math.PI / 360) * a * i;//求出弧度
    var x = ox + Math.sin(hudu) * or;//計算出x軸坐標for正弦
    var y = oy - Math.cos(hudu) * or;//計算出y軸坐標for余弦
    return x + '_' + y;
}

到了這里,我們就可以愉快的畫刻度了:

//打上文字(僅小時)
for (var i = 0; i < 12; i++) {
    var textXY = angle(30, i + 1, ox, oy, or - 10);//小時刻度坐標
    ctx.fillText(i + 1, textXY.split('_')[0], textXY.split('_')[1]);
    ctx.textAlign = 'center';//水平居中
    ctx.textBaseline = 'middle';//垂直居中
}
 
//打上分秒鐘刻度
for (var i = 0; i < 60; i++) {
    var oXY = angle(6, i + 1, ox, oy, or);//分、秒刻度坐標
    ctx.beginPath();
    ctx.arc(oXY.split('_')[0], oXY.split('_')[1], (i + 1) % 5 == 0 ? 2 : 1, 0, 2 * Math.PI);
    ctx.fillStyle = 'blue';
    ctx.fill();
    ctx.closePath();
}

為了逼真,我還加入了秒針影響分針,分針影響秒針的計算。(見最后代碼)

然后就是考慮三根針不一樣長的問題,這個問題試過很多遍,最后我發(fā)現(xiàn)最簡單的解決辦法就是多畫3個圓,因為偏移的角度計算方式是一樣的。

最后的結果是這樣的:

因為不支持上傳html文件,所以我就把所有代碼貼在這里了:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>小馬的canvas練手作品-時鐘</title>
    <meta charset="utf-8" />
</head>
<body>
    <canvas id="myCanvas" width="1000" height="1000">您的瀏覽器不支持此標簽</canvas>
    <script type="text/javascript">
 
        setInterval('drawClock(150, 150, 100, 50, 70, 90,"pink","black","red","green")', 1000);
 
        //畫鐘表
        //[ox]圓心X坐標[oy]圓心Y坐標[or]鐘表半徑[hr]時針半徑[mr]分針半徑[sr]秒針半徑[oc]鐘表外環(huán)顏色[hc]時針顏色[mc]分針顏色[sc]秒針顏色
        function drawClock(ox, oy, or, hr, mr, sr, oc, hc, mc, sc) {
 
            //時鐘底盤
            var canvas = document.getElementById('myCanvas');
            var ctx = canvas.getContext('2d');
            ctx.clearRect(ox - or, oy - or, or * 2, or * 2);//清空上一次繪制
            ctx.beginPath();
            ctx.arc(ox, oy, or, 0, 2 * Math.PI, false);
            ctx.strokeStyle = oc;
            ctx.stroke();
            ctx.closePath();
 
            //獲取當前時間
            var NowTime = new Date();
            var h = NowTime.getHours();
            var m = NowTime.getMinutes();
            var s = NowTime.getSeconds();
            var y = NowTime.getFullYear();
            var mo = NowTime.getMonth() + 1;
            var d = NowTime.getDate();
            ctx.fillText(mo + '月' + d + '日', ox, oy - or / 2, 50);//顯示月日
 
            //打上時間刻度
            for (var i = 0; i < 12; i++) {
                var textXY = angle(30, i + 1, ox, oy, or - 10);//小時刻度坐標
                ctx.fillText(i + 1, textXY.split('_')[0], textXY.split('_')[1]);
                ctx.textAlign = 'center';//水平居中
                ctx.textBaseline = 'middle';//垂直居中
            }
 
            //打上分鐘刻度
            for (var i = 0; i < 60; i++) {
                var oXY = angle(6, i + 1, ox, oy, or);//分、秒刻度坐標
                ctx.beginPath();
                ctx.arc(oXY.split('_')[0], oXY.split('_')[1], (i + 1) % 5 == 0 ? 2 : 1, 0, 2 * Math.PI);
                ctx.fillStyle = 'blue';
                ctx.fill();
                ctx.closePath();
            }
 
            h = h + m / 60;//分鐘影響時針偏移
 
            var hoursXY = angle(30, h > 12 ? h - 12 : h, ox, oy, hr);//時針終點XY坐標
            drawLine(ctx, hc, ox, oy, hoursXY.split('_')[0], hoursXY.split('_')[1]);
 
            m = m + s / 60;//秒鐘影響分針偏移
 
            var minuteXY = angle(6, m, ox, oy, mr);//分針終點XY坐標
            drawLine(ctx, mc, ox, oy, minuteXY.split('_')[0], minuteXY.split('_')[1]);
 
            var secondXY = angle(6, s, ox, oy, sr);//秒針終點XY坐標
            drawLine(ctx, sc, ox, oy, secondXY.split('_')[0], secondXY.split('_')[1]);
 
        }
 
        //計算圓上每個點的坐標
        ///[a]角度[i]刻度[ox]圓心X坐標[oy]圓心Y坐標[or]圓半徑
        function angle(a, i, ox, oy, or) {
            var hudu = (2 * Math.PI / 360) * a * i;//求出弧度
            var x = ox + Math.sin(hudu) * or;//計算出x軸坐標for正弦
            var y = oy - Math.cos(hudu) * or;//計算出y軸坐標for余弦
            return x + '_' + y;
        }
 
        //畫線方法
        ///[ob]繪畫對象[ox]圓心X坐標[oy]圓心Y坐標[px]目標X坐標[py]目標Y坐標
        function drawLine(ob, color, ox, oy, px, py) {
            ob.beginPath();
            ob.strokeStyle = color;
            ob.moveTo(ox, oy);
            ob.lineTo(px, py);
            ob.stroke();
            ob.closePath();
        }<br data-filtered="filtered">
    </script>
</body>
</html>

到此這篇關于JS在Canvas元素內繪制鐘表的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • layui實現(xiàn)登陸界面驗證碼

    layui實現(xiàn)登陸界面驗證碼

    這篇文章主要為大家詳細介紹了layui實現(xiàn)登陸界面驗證碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 完美實現(xiàn)bootstrap分頁查詢

    完美實現(xiàn)bootstrap分頁查詢

    這篇文章主要介紹了一個完美的bootstrap分頁查詢,如何利用bootstrap實現(xiàn)分頁查詢,本文將為大家進行揭曉
    2015-12-12
  • js基于myFocus實現(xiàn)輪播圖效果

    js基于myFocus實現(xiàn)輪播圖效果

    這篇文章主要為大家詳細介紹了js基于myFocus實現(xiàn)輪播圖效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • 用js判斷輸入是否為中文的函數(shù)

    用js判斷輸入是否為中文的函數(shù)

    本篇文章主要是對js判斷輸入是否為中文的函數(shù)進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-03-03
  • js判斷變量是否空值的代碼

    js判斷變量是否空值的代碼

    判斷變量是否空值undefined, null, '', false, 0, [], {} 均返回true,否則返回false
    2008-10-10
  • 詳解ES6 CLASS在微信小程序中的應用實例

    詳解ES6 CLASS在微信小程序中的應用實例

    這篇文章主要介紹了詳解ES6 CLASS在微信小程序中的應用實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • JavaScript獲取短信驗證碼(周期性)

    JavaScript獲取短信驗證碼(周期性)

    這篇文章主要為大家詳細介紹了JavaScript周期性獲取短信驗證碼的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 觸屏中的JavaScript事件分析

    觸屏中的JavaScript事件分析

    這篇文章主要介紹了觸屏中的JavaScript事件,實例分析了觸屏事件的種類、原理與相關使用技巧,需要的朋友可以參考下
    2015-02-02
  • JS中循環(huán)遍歷數(shù)組的四種方式總結

    JS中循環(huán)遍歷數(shù)組的四種方式總結

    這篇文章主要給大家總結介紹了關于JS中循環(huán)遍歷數(shù)組的四種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • 談談IntersectionObserver懶加載的具體使用

    談談IntersectionObserver懶加載的具體使用

    這篇文章主要介紹了談談IntersectionObserver懶加載的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10

最新評論