js基於canvas實現時鐘元件
阿新 • • 發佈:2021-02-09
canvas一直是前端開發中不可或缺的一種用來繪製圖形的標籤元素,比如壓縮上傳的圖片、比如刮刮卡、比如製作海報、圖表外掛等,很多人在面試的過程中也會被問到有沒有接觸過canvas圖形繪製。
定義
canvas元素用於圖形的繪製,通過指令碼 (通常是JavaScript)來完成。
canvas標籤只是圖形容器,您必須使用指令碼來繪製圖形。
瀏覽器支援
Internet Explorer 9、Firefox、Opera、Chrome 和 Safari 支援
那麼本篇文章就通過一個時鐘元件來熟悉使用一下關於canvas的api。
<!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');//方法返回一個用於在畫布上繪圖的環境 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,this.width,this.height); //在給定的矩形內清除指定的畫素 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,this.r - ctx.lineWidth / 2,2 * Math.PI,false); //建立弧/曲線(用於建立圓形或部分圓) ctx.stroke(); ctx.font = 16 * this.rem + "px Arial";//設定或返回文字內容的當前字型屬性 ctx.textAlign = "center"; //設定或返回文字內容的當前對齊方式 ctx.textBaseline = "middle"; //設定或返回在繪製文字時使用的當前文字基線 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); //在畫布上繪製"被填充的"文字 }); //分鐘的刻度,每分鐘轉6deg for (var i = 0; i < 60; i++){ ctx.save(); //儲存當前環境的狀態 ctx.rotate(6 * i * Math.PI / 180); //旋轉當前繪圖 ctx.beginPath(); //起始一條路徑,或重置當前路徑 ctx.moveTo(0,-82 * this.rem); //把路徑移動到畫布中的指定點,不建立線條 ctx.lineTo(0,-87 * this.rem); //新增一個新點,然後在畫布中建立從該點到最後指定點的線條 ctx.closePath(); //建立從當前點回到起始點的路徑 ctx.strokeStyle = '#000'; //設定或返回用於筆觸的顏色、漸變或模式 ctx.lineWidth = 1 * this.rem; //設定或返回當前的線條寬度 ctx.stroke(); //繪製已定義的路徑 ctx.restore(); //返回之前儲存過的路徑狀態和屬性 } //小時的刻度,每小時轉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"; //設定或返回線條的結束端點樣式 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,-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(); //填充當前繪圖(路徑) ctx.restore(); },drawDot: function(minute){ var ctx = this.ctx; ctx.beginPath(); ctx.fillStyle = "#fff"; ctx.arc(0,3 * this.rem,false); ctx.fill(); } }; win.DrawClock = DrawClock; })(window); new DrawClock({el: document.getElementById("clock")}); </script> </body> </html>
只要心中有丘壑,就能耕出二畝田!canvas時鐘用到了canvas中大部分的api,通過學習canvas時鐘的程式碼實現,很能瞭解canvas的屬性和方法,同時,實現時鐘效果時,用到了數學中的幾何模型正弦sin和餘弦cos以及弧度的計算方法,又重溫了一把當年學數學時的許多樂趣,可謂是一舉兩得。
時鐘效果圖如下:
以上就是js基於canvas實現時鐘元件的詳細內容,更多關於canvas實現時鐘元件的資料請關注我們其它相關文章!