一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務(wù)器之家 - 編程語言 - JavaScript - js教程 - js基于canvas實現(xiàn)時鐘組件

js基于canvas實現(xiàn)時鐘組件

2022-01-19 15:12豫見陳公子 js教程

這篇文章主要介紹了js基于canvas實現(xiàn)時鐘組件的方法,幫助大家更好的理解和使用JavaScript,感興趣的朋友可以了解下

canvas一直是前端開發(fā)中不可或缺的一種用來繪制圖形的標簽元素,比如壓縮上傳的圖片、比如刮刮卡、比如制作海報、圖表插件等,很多人在面試的過程中也會被問到有沒有接觸過canvas圖形繪制。

定義

canvas元素用于圖形的繪制,通過腳本 (通常是JavaScript)來完成。
canvas標簽只是圖形容器,您必須使用腳本來繪制圖形。

瀏覽器支持

Internet Explorer 9、Firefox、Opera、Chrome 和 Safari 支持

那么本篇文章就通過一個時鐘組件來熟悉使用一下關(guān)于canvas的api。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>canvas時鐘</title>
<style>
*{margin:0;padding:0;}
body{text-align:center;padding-top:100px;}
</style>
</head>
<body>
<canvas id="clock" width="200px" height="200px"></canvas>
<script>
(function(win){
    function DrawClock(options){
        this.canvas = options.el;
        this.ctx  = this.canvas.getContext('2d');//方法返回一個用于在畫布上繪圖的環(huán)境
        this.width = this.ctx.canvas.width;
        this.height = this.ctx.canvas.height;
        this.r   = this.width / 2;
        this.rem  = this.width / 200;
        this.digits = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2];
 
      var self  = this;
      self.init();
      setInterval(function(){
        self.init();
      }, 1000);
    }
 
    DrawClock.prototype = {
        init: function(){
            var ctx = this.ctx;
            ctx.clearRect(0, 0, this.width, this.height);  //在給定的矩形內(nèi)清除指定的像素
            var now = new Date();
            var hours = now.getHours();
            var minutes = now.getMinutes();
            var seconds = now.getSeconds();
 
            var hour = hours >= 12 ? hours - 12 : hours;
            var minute = minutes + seconds / 60;
 
            this.drawBackground();
            this.drawHour(hour, minute);
            this.drawMinute(minute);
            this.drawSecond(seconds);
            this.drawDot();
            ctx.restore();
        },
        drawBackground: function(){
            var ctx = this.ctx;
            var self = this;
            ctx.save();
            ctx.translate(this.r, this.r);     //重新映射畫布上的 (0,0) 位置
            ctx.beginPath();
            ctx.lineWidth = 8 * this.rem;
            ctx.arc(0, 0, this.r - ctx.lineWidth / 2, 0, 2 * Math.PI, false);  //創(chuàng)建弧/曲線(用于創(chuàng)建圓形或部分圓)
            ctx.stroke();
            ctx.font = 16 * this.rem + "px Arial";//設(shè)置或返回文本內(nèi)容的當(dāng)前字體屬性
            ctx.textAlign = "center";       //設(shè)置或返回文本內(nèi)容的當(dāng)前對齊方式
            ctx.textBaseline = "middle";      //設(shè)置或返回在繪制文本時使用的當(dāng)前文本基線
            this.digits.forEach(function(number, i){
                var rad = 2 * Math.PI / 12 * i;
                var x = Math.cos(rad) * (self.r - 33 * self.rem);
                var y = Math.sin(rad) * (self.r - 33 * self.rem);
                ctx.fillText(number, x, y);    //在畫布上繪制"被填充的"文本
            });
 
            //分鐘的刻度,每分鐘轉(zhuǎn)6deg
            for (var i = 0; i < 60; i++){
                ctx.save();            //保存當(dāng)前環(huán)境的狀態(tài)
                ctx.rotate(6 * i * Math.PI / 180); //旋轉(zhuǎn)當(dāng)前繪圖
                ctx.beginPath();          //起始一條路徑,或重置當(dāng)前路徑
                ctx.moveTo(0, -82 * this.rem);   //把路徑移動到畫布中的指定點,不創(chuàng)建線條
                ctx.lineTo(0, -87 * this.rem);   //添加一個新點,然后在畫布中創(chuàng)建從該點到最后指定點的線條
                ctx.closePath();          //創(chuàng)建從當(dāng)前點回到起始點的路徑
                ctx.strokeStyle = '#000';     //設(shè)置或返回用于筆觸的顏色、漸變或模式
                ctx.lineWidth = 1 * this.rem;   //設(shè)置或返回當(dāng)前的線條寬度
                ctx.stroke();           //繪制已定義的路徑
                ctx.restore();           //返回之前保存過的路徑狀態(tài)和屬性
            }
            //小時的刻度,每小時轉(zhuǎn)30deg
            for (var i = 0; i < 12; i++){
                ctx.save();
                ctx.rotate(30 * i * Math.PI / 180);
                ctx.beginPath();
                ctx.moveTo(0, -79 * this.rem);
                ctx.lineTo(0, -87 * this.rem);
                ctx.closePath();
                ctx.strokeStyle = '#000';
                ctx.lineWidth = 2 * this.rem;
                ctx.stroke();
                ctx.restore();
            }
        },
        drawHour: function(hour, minute){
            var ctx = this.ctx;
            ctx.save();
            ctx.beginPath();
            var hRad = 2 * Math.PI / 12 * hour;
            var mRad = 2 * Math.PI / 12 / 60 * minute;
            ctx.rotate(hRad + mRad);
            ctx.lineWidth = 6 * this.rem;
            ctx.lineCap = "round";         //設(shè)置或返回線條的結(jié)束端點樣式
            ctx.moveTo(0, 10 * this.rem);
            ctx.lineTo(0, -this.r / 2);
            ctx.stroke();
            ctx.restore();
        },
        drawMinute: function(minute){
            var ctx = this.ctx;
            ctx.save();
            ctx.beginPath();
            var rad = 2 * Math.PI / 60 * minute;
            ctx.rotate(rad);
            ctx.lineWidth = 3 * this.rem;
            ctx.lineCap = "round";
            ctx.moveTo(0, 10 * this.rem);
            ctx.lineTo(0, -this.r + 26 * this.rem);
            ctx.stroke();
            ctx.restore();
        },
        drawSecond: function(second){
            var ctx = this.ctx;
            ctx.save();
            ctx.beginPath();
            ctx.fillStyle = "#c14543";
            var rad = 2 * Math.PI / 60 * second;
            ctx.rotate(rad);
            ctx.moveTo(-3 * this.rem, 20 * this.rem);
            ctx.lineTo(3 * this.rem, 20 * this.rem);
            ctx.lineTo(1, -this.r + 26 * this.rem);
            ctx.lineTo(-1, -this.r + 26 * this.rem);
            ctx.fill();  //填充當(dāng)前繪圖(路徑)
            ctx.restore();
        },
        drawDot: function(minute){
            var ctx = this.ctx;
            ctx.beginPath();
            ctx.fillStyle = "#fff";
            ctx.arc(0, 0, 3 * this.rem, 0, 2 * Math.PI, false);
            ctx.fill();
        }
    };
 
    win.DrawClock = DrawClock;
})(window);
 
new DrawClock({el: document.getElementById("clock")});
</script>
</body>
</html>

只要心中有丘壑,就能耕出二畝田!canvas時鐘用到了canvas中大部分的api,通過學(xué)習(xí)canvas時鐘的代碼實現(xiàn),很能了解canvas的屬性和方法,同時,實現(xiàn)時鐘效果時,用到了數(shù)學(xué)中的幾何模型正弦sin和余弦cos以及弧度的計算方法,又重溫了一把當(dāng)年學(xué)數(shù)學(xué)時的許多樂趣,可謂是一舉兩得。

時鐘效果圖如下:

js基于canvas實現(xiàn)時鐘組件

以上就是js基于canvas實現(xiàn)時鐘組件的詳細內(nèi)容,更多關(guān)于canvas實現(xiàn)時鐘組件的資料請關(guān)注服務(wù)器之家其它相關(guān)文章!

原文鏈接:https://www.cnblogs.com/tnnyang/p/8951804.html

延伸 · 閱讀

精彩推薦
  • js教程js實現(xiàn)移動端輪播圖滑動切換

    js實現(xiàn)移動端輪播圖滑動切換

    這篇文章主要為大家詳細介紹了js實現(xiàn)移動端輪播圖滑動切換,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    浪漫前端11462021-12-15
  • js教程js仿淘寶放大鏡效果

    js仿淘寶放大鏡效果

    這篇文章主要為大家詳細介紹了js仿淘寶放大鏡效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    屈小康11132021-12-21
  • js教程JS代碼實現(xiàn)頁面切換效果

    JS代碼實現(xiàn)頁面切換效果

    這篇文章主要為大家詳細介紹了JS代碼實現(xiàn)頁面切換效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    _Adoph9322021-12-29
  • js教程JavaScript this關(guān)鍵字的深入詳解

    JavaScript this關(guān)鍵字的深入詳解

    這篇文章主要給大家介紹了關(guān)于JavaScript this關(guān)鍵字的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要...

    JAVA_樸先生9062021-12-31
  • js教程微信小程序canvas實現(xiàn)簽名功能

    微信小程序canvas實現(xiàn)簽名功能

    這篇文章主要為大家詳細介紹了微信小程序canvas實現(xiàn)簽名功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    weixin_4543937910672022-01-04
  • js教程js定時器出現(xiàn)第一次延遲的原因及解決方法

    js定時器出現(xiàn)第一次延遲的原因及解決方法

    在本篇文章里小編給大家整理的是一篇關(guān)于js定時器出現(xiàn)第一次延遲的原因及解決方法,對此有需要的朋友們可以學(xué)習(xí)下。...

    宋宋大人4972021-12-24
  • js教程詳解ES6 中的Object.assign()的用法實例代碼

    詳解ES6 中的Object.assign()的用法實例代碼

    這篇文章主要介紹了ES6 Object.assign()的用法及用途,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下...

    半夏遮流年シ11442021-12-30
  • js教程使用 JavaScript 進行數(shù)據(jù)分組最優(yōu)雅的方式

    使用 JavaScript 進行數(shù)據(jù)分組最優(yōu)雅的方式

    對數(shù)據(jù)進行分組,是我們在開發(fā)中經(jīng)常會遇到的需求,使用 JavaScript 進行數(shù)據(jù)分組的方式也有很多種,但是由于沒有原生方法的支持,我們自己實現(xiàn)的數(shù)據(jù)...

    code秘密花園4442021-12-27
主站蜘蛛池模板: 男人的天堂在线观看免费 | 男人j进女屁股视频在线观看 | 91私密保健女子养生spa | 99av麻豆| 秋霞啪啪片 | 亚洲欧美一 | 国产尤物精品视频 | 和肥岳在厨房激情 | 亚洲精品国产SUV | 99精品国产自在现线观看 | 九九九九视频 | 色先锋av资源中文字幕 | melody中文字幕 | 欧美成人禁片在线观看俄罗斯 | 爱色成人网| 日本九九热 | 国产成人黄网在线免 | 狠狠综合久久综合网站 | 国产成人盗摄精品 | 深夜激情网站 | 暴露狂婷婷医院暴露tx | 91视频破解 | 久久爽狠狠添AV激情五月 | 亚洲AV久久无码精品九号 | 午夜视频一区二区 | 亚洲 欧美 日韩 综合 | 粉嫩极品国产在线观看免费 | 鬼吹灯天星术在线高清观看 | 久久综合给会久久狠狠狠 | 999久久免费高清热精品 | 91桃花视频 | 美国艳星lisann成人作品 | 欧美一区二区三区久久久 | 91久久偷偷做嫩草影院免费看 | 色婷婷在线播放 | 欧美色图日韩 | 91视频破解版 | futa巨大好爽好长 | 99精品国产在现线免费 | 亚洲精品老司机福利在线播放 | 日韩精品久久不卡中文字幕 |