本文實例講述了JS+canvas繪制的動態(tài)機械表動畫效果。分享給大家供大家參考,具體如下:

先來看看運行效果:

完整實例代碼:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>www.jb51.net canvas時鐘</title>
<style>
canvas {
border: 1px solid red;
}
</style>
</head>
<body>
<canvas width="800" height="600"></canvas>
</body>
<script>
function Clock(opt) {
for (var key in opt) {
this[key] = opt[key];
}
this.init();
}
Clock.prototype = {
init: function () {
var self = this;
var ctx = this.ctx;
this.timer = setInterval(function(){
ctx.clearRect(0,0,ctx.canvas.width,ctx.canvas.height);
self.drawDial();
self.drawDegreeScale();
self.drawNumber();
self.drawPointers();
},1000);
},
drawDial: function () {
var ctx = this.ctx;
ctx.save();
ctx.beginPath();
ctx.lineWidth = this.clockDialW;
ctx.strokeStyle = this.clockDialColor;
ctx.arc(this.clockX, this.clockY, this.clockRadius, 0, 2 * Math.PI);
ctx.stroke();
ctx.restore();
},
drawDegreeScale: function () {
var ctx = this.ctx;
var clockRadius = this.clockRadius;
var clockX = this.clockX;
var clockY = this.clockY;
var bigDegreeScaleL = this.bigDegreeScaleL;
var smallDegreeScale = this.smallDegreeScale;
var startX, startY, endX, endY, radian;
ctx.save();
for (var i = 0; i < 12; i++) {
radian = i * Math.PI / 6;
endX = clockX + clockRadius * Math.cos(radian);
endY = clockY + clockRadius * Math.sin(radian);
if (radian % (Math.PI / 2) == 0) {
startX = clockX + (clockRadius - bigDegreeScaleL) * Math.cos(radian);
startY = clockY + (clockRadius - bigDegreeScaleL) * Math.sin(radian);
ctx.lineWidth = this.bigDCWidth;
} else {
startX = clockX + (clockRadius - smallDegreeScale) * Math.cos(radian);
startY = clockY + (clockRadius - smallDegreeScale) * Math.sin(radian);
ctx.lineWidth = this.smallDCWidth;
}
ctx.beginPath();
ctx.moveTo(startX, startY);
ctx.lineTo(endX, endY);
ctx.stroke();
ctx.restore();
}
},
drawNumber: function () {
var ctx = this.ctx;
var textX, textY, textRadian;
var clockX = this.clockX;
var clockY = this.clockY;
var clockRadius = this.clockRadius;
ctx.font = '20px 微軟雅黑';
ctx.fillStyle = 'red';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.save();
for (var i = 0; i < 12; i++) {
textRadian = i * Math.PI / 6 - Math.PI/3;
textX = clockX + (clockRadius - 40) * Math.cos(textRadian);
textY = clockY + (clockRadius - 40) * Math.sin(textRadian);
ctx.beginPath();
ctx.fillText(i + 1, textX, textY);
}
ctx.restore();
},
drawPointers: function () {
var date = new Date();
var h = date.getHours();
var m = date.getMinutes();
var s = date.getSeconds();
h = h % 12;
var hRadian = 2 * Math.PI / 12 * h - Math.PI / 2;
this.drawPoint(hRadian,30,'red',8);
var mRadian = 2 * Math.PI / 60 * m - Math.PI / 2;
this.drawPoint(mRadian,50,'blue',6);
var sRadian = 2 * Math.PI / 60 * s - Math.PI / 2;
this.drawPoint(sRadian,70,'green',2);
},
drawPoint: function (radian, length,color,lineWidth) {
var x = this.clockX + Math.cos(radian) * length;
var y = this.clockY + Math.sin(radian) * length;
var ctx = this.ctx;
ctx.save();
ctx.beginPath();
ctx.strokeStyle = color;
ctx.lineWidth = lineWidth;
ctx.moveTo(this.clockX,this.clockY);
ctx.lineTo(x,y);
ctx.stroke();
ctx.restore();
}
};
</script>
<script>
var canvas = document.querySelector('canvas');
var ctx = canvas.getContext('2d');
var clock = new Clock({
ctx: this.ctx,
clockRadius: 150,
clockX: 300,
clockY: 300,
clockDialW: 6,
clockDialColor: 'blue',
bigDegreeScaleL: 20,
bigDCWidth: 6,
smallDegreeScale: 10,
smallDCWidth: 4
});
</script>
</html>
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
文章名稱:JS+canvas繪制的動態(tài)機械表動畫效果-創(chuàng)新互聯(lián)
標(biāo)題鏈接:http://chinadenli.net/article4/spjoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、品牌網(wǎng)站制作、建站公司、品牌網(wǎng)站建設(shè)、軟件開發(fā)、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容