js基于canvas實現(xiàn)時鐘組件
canvas一直是前端開發(fā)中不可或缺的一種用來繪制圖形的標簽元素,比如壓縮上傳的圖片、比如刮刮卡、比如制作海報、圖表插件等,很多人在面試的過程中也會被問到有沒有接觸過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');//方法返回一個用于在畫布上繪圖的環(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); //在給定的矩形內清除指定的像素
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";//設置或返回文本內容的當前字體屬性
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(); //保存當前環(huán)境的狀態(tài)
ctx.rotate(6 * i * Math.PI / 180); //旋轉當前繪圖
ctx.beginPath(); //起始一條路徑,或重置當前路徑
ctx.moveTo(0, -82 * this.rem); //把路徑移動到畫布中的指定點,不創(chuàng)建線條
ctx.lineTo(0, -87 * this.rem); //添加一個新點,然后在畫布中創(chuàng)建從該點到最后指定點的線條
ctx.closePath(); //創(chuàng)建從當前點回到起始點的路徑
ctx.strokeStyle = '#000'; //設置或返回用于筆觸的顏色、漸變或模式
ctx.lineWidth = 1 * this.rem; //設置或返回當前的線條寬度
ctx.stroke(); //繪制已定義的路徑
ctx.restore(); //返回之前保存過的路徑狀態(tài)和屬性
}
//小時的刻度,每小時轉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, 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(); //填充當前繪圖(路徑)
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,通過學習canvas時鐘的代碼實現(xiàn),很能了解canvas的屬性和方法,同時,實現(xiàn)時鐘效果時,用到了數(shù)學中的幾何模型正弦sin和余弦cos以及弧度的計算方法,又重溫了一把當年學數(shù)學時的許多樂趣,可謂是一舉兩得。
時鐘效果圖如下:

以上就是js基于canvas實現(xiàn)時鐘組件的詳細內容,更多關于canvas實現(xiàn)時鐘組件的資料請關注腳本之家其它相關文章!
相關文章
JavaScript中String和StringBuffer的速度之爭
很多Javascript書籍中都是類比于Java說String在頻繁的和大量的字符串連接方面的效率是不如StringBuffer的。2010-04-04
JavaScript使用DeviceOne開發(fā)實戰(zhàn)(三)仿微信應用
這篇文章主要介紹了JavaScript使用DeviceOne開發(fā)實戰(zhàn)(三)仿微信應用的相關資料,需要的朋友可以參考下2015-12-12
8個開發(fā)者必須知道的JavaScript深層概念(推薦)
JavaScript有一個名為“調用堆?!保–all Stack)的簡單列表,它逐一管理任務(堆棧算法),但是當異步任務被傳遞時,JavaScript會把它彈出到web API,瀏覽器就會處理它,這篇文章主要介紹了8個開發(fā)者必須知道的JavaScript深層概念,需要的朋友可以參考下2022-10-10

