您好,登錄后才能下訂單哦!
使用到的知識(shí):
1. 獲取系統(tǒng)時(shí)間
2. 畫圖形,空心圖形,實(shí)心圖形,以及一些屬性
3. for循環(huán)
準(zhǔn)備工作:添加一塊畫布1000*1000(隨意),引用canvas.js
<!doctype html> <html> <head> <meta charset="UTF-8"> <meta name="Generator" content="EditPlus?"> <meta name="Author" content="華慕熊"> <meta name="Keywords" content=""> <meta name="Description" content=""> <title>動(dòng)態(tài)時(shí)鐘</title> <script src = "canvas.js"></script> <style> body,h2,h3,h4,h5,h6,h7,*{margin:0px;} </style> </head> <body> <canvas id="myCanvas" width="1000" height="1000"></canvas> </body> </html>
canvas.js
window.onload = function(){ //html5加載完成后才加載這個(gè)文件 var myCanv = document.getElementById("myCanvas");//通過(guò)id獲取到canvas畫布(演員) var oCanv = myCanv.getContext("2d"); //2d環(huán)境(舞臺(tái)) }
開始畫圖:canvas.js
靜態(tài)效果
圖中有圓,刻度線,時(shí)分秒針,點(diǎn)數(shù)。另外的是系統(tǒng)時(shí)間。
我們?cè)趫A心為(200,200)的位置畫一個(gè)半徑為150的圓
oCanv.beginPath();// 起始一條路徑,或重置當(dāng)前路徑 oCanv.arc(200,200,150,0,360*Math.PI/180,false); //這里是弧度 oCanv.stroke();//畫
解釋:arc(x,y,r,sAangle,eAangle,conterclockwise);
此時(shí)的效果圖:
下邊畫分針刻度線:
此時(shí)我們需要思考并要明白的幾件事:
刻度線怎么畫出來(lái)的?
畫圓的起始點(diǎn)在哪?
應(yīng)該在哪?
解決思考的問(wèn)題:
先看一段代碼與效果:
oCanv.beginPath(); oCanv.moveTo(200,200); oCanv.arc(200,200,150,0,6*Math.PI/180,false); oCanv.closePath(); oCanv.stroke();
這段代碼是從0度順時(shí)針畫了一個(gè)6度的扇形
一、畫分針刻度線
一周有60個(gè)刻度線,此時(shí)可以說(shuō)是兩個(gè)刻度線畫出來(lái)了,只要使用一下循環(huán)即可了:
oCanv.beginPath(); for( var i=0; i<60; i++){ oCanv.moveTo(200,200); oCanv.arc(200,200,150,6*i*Math.PI/180,6*(i+1)*Math.PI/180,false); } oCanv.closePath(); oCanv.stroke();
此時(shí)的效果圖是:
其實(shí)這里我們應(yīng)該能想到該怎么做了吧?
畫一個(gè)比這個(gè)稍微小點(diǎn)的白色實(shí)心圓即可(圓心要一致)!
oCanv.beginPath(); oCanv.fillStyle = "#fff"; oCanv.arc(200,200,150*19/20,0,360*Math.PI/180,false); oCanv.fill(); oCanv.stroke();
此時(shí)的效果:
好像差不多,只是我們不想要內(nèi)圓的邊,其實(shí)寫到fill()就可以了,既然寫到那就可以了,我為什么還要寫呢?我只是在乎你疑惑我為什么不寫呢。
為了實(shí)現(xiàn)我們想要的效果,去掉stroke()即可。圖不粘了。
二、畫時(shí)針刻度線
方法類似畫分針刻度線,不同的是時(shí)針應(yīng)該有12條線,之間是30度,線條比較粗
oCanv.beginPath(); oCanv.lineWidth=3;//線條的粗細(xì),默認(rèn)是1,3就加粗了 for(var i=0;i<12;i++){ oCanv.moveTo(200,200); oCanv.arc(200,200,150,30*i*Math.PI/180,30*(i+1)*Math.PI/180,false); } oCanv.closePath(); oCanv.stroke(); //畫實(shí)心圓 oCanv.beginPath(); oCanv.fillStyle = "#fff"; oCanv.arc(200,200,150*18/20,0,360*Math.PI/180,false); oCanv.fill();
效果圖:
三、獲取系統(tǒng)的時(shí)間(電腦時(shí)間)
Date()對(duì)象
Hours()方法/時(shí)
Minutes()方法/分
Seconds()方法/秒
var oDate = new Date(); var oHours = oDate.getHours(); var oMin = oDate.getMinutes(); var oSec = oDate.getSeconds(); document.write(oHours+"時(shí)"+oMin+"分"+oSec+"秒");
打印一下時(shí)間:
我們要知道,雖然說(shuō)時(shí)間是一秒一秒走的,但在這里可就不是這么說(shuō)的了,應(yīng)該說(shuō)是多少弧度的走,所以把時(shí)間用弧度算出來(lái),那么問(wèn)題來(lái)了,我們時(shí)鐘的0在12的位置,而我們現(xiàn)在0的位置在鐘表的3的位置,那么0-3之間的角度是90度,即90*π/180
如果我們只畫一個(gè)圓,那么起點(diǎn)是鐘表的3的位置,但我們的畫鐘表的0點(diǎn)0時(shí)0分都是在12的位置,那么怎么才能使其都為鐘表上0的位置呢?
先看代碼:
var oHoursValues = (-90+oHours*30)*Math.PI/180; var oMinValues = (-90+oMin*6)*Math.PI/180; var oSecValues = (-90+oSec*6)*Math.PI/180;
首先-90使起點(diǎn)到鐘表上12的位置,+oHours*30是現(xiàn)在時(shí)刻的度數(shù),比如現(xiàn)在是晚上21:30,oHours=21,21x30°=630°(=9x30=270°),應(yīng)該在鐘表的9的位置,我們可以看看:
//畫時(shí)針 oCanv.beginPath(); oCanv.lineWidth=5; oCanv.moveTo(200,200); oCanv.arc(200,200,150*8/20,oHoursValues,oHoursValues,false); //用畫圓的方法畫的時(shí)針, 讓起點(diǎn)與終點(diǎn)一個(gè)位置即可,感興趣的試試畫直線 oCanv.closePath(); oCanv.fill(); oCanv.stroke();
分針與秒針類似時(shí)針。
現(xiàn)在我們讓它動(dòng)起來(lái):
新知識(shí):setInterval()方法,間隔多長(zhǎng)時(shí)間刷新頁(yè)面,我們需要1秒,它的單位是毫秒,那么就是1000毫秒
在這之前可以先清除一下畫布:clearRect(0, 0, 200, 200);//清空畫布
最后我們加上小時(shí)數(shù)(點(diǎn)數(shù))
var deg = 2 * Math.PI / 12;//弧度=角度*Math.PI/180; ogc.save(); ogc.beginPath(); ogc.translate(200, 200); for (var i = 1; i < 13; i++) { var x1 = Math.sin(i * deg);//正弦 var y1 = -Math.cos(i * deg);//余弦 ogc.fillStyle = "black";//字體顏色 ogc.font = "noraml 30px Calibri";//字體 ogc.textAlign = 'center'; ogc.textBaseline = 'middle'; ogc.fillText(i, x1 * 125, y1 * 125);//填充 125這個(gè)值越大 越顯示在圓外面 } ogc.closePath(); ogc.restore();
此時(shí)就是最開始的圖片的樣子了。
修改后的完整的代碼:canvas.js
window.onload = function(){ //html5加載完成后才加載這個(gè)文件 setInterval(myCanvas,1000); } function myCanvas(){ var myCanv = document.getElementById("myCanvas");//通過(guò)id獲取到canvas畫布(演員) var oCanv = myCanv.getContext("2d"); //2d環(huán)境(舞臺(tái)) // ogc.clearRect(0, 0, circleX, circleY);//清空畫布 //畫分針刻度線 oCanv.beginPath(); for( var i=0; i<60; i++){ oCanv.moveTo(200,200); oCanv.arc(200,200,150,6*i*Math.PI/180,6*(i+1)*Math.PI/180,false); } oCanv.closePath(); oCanv.stroke(); //畫實(shí)心圓 oCanv.beginPath(); oCanv.fillStyle = "#fff"; oCanv.arc(200,200,150*19/20,0,360*Math.PI/180,false); oCanv.fill(); /*畫時(shí)針刻度線*/ oCanv.beginPath(); oCanv.lineWidth=3;//線條的粗細(xì),默認(rèn)是1,3就加粗了 for(var i=0;i<12;i++){ oCanv.moveTo(200,200); oCanv.arc(200,200,150,30*i*Math.PI/180,30*(i+1)*Math.PI/180,false); } oCanv.closePath(); oCanv.stroke(); //畫實(shí)心圓 oCanv.beginPath(); oCanv.fillStyle = "#fff"; oCanv.arc(200,200,150*18/20,0,360*Math.PI/180,false); oCanv.fill(); //獲取本地時(shí)間 var oDate = new Date(); var oHours = oDate.getHours(); var oMin = oDate.getMinutes(); var oSec = oDate.getSeconds(); //轉(zhuǎn)換成弧度 var oHoursValues = (-90+oHours*30)*Math.PI/180; var oMinValues = (-90+oMin*6)*Math.PI/180; var oSecValues = (-90+oSec*6)*Math.PI/180; //畫時(shí)針 oCanv.beginPath(); oCanv.lineWidth=5; oCanv.moveTo(200,200); oCanv.arc(200,200,150*8/20,oHoursValues,oHoursValues,false); oCanv.closePath(); oCanv.fill(); oCanv.stroke(); //畫分針 oCanv.beginPath(); oCanv.lineWidth=3; oCanv.moveTo(200,200); oCanv.arc(200,200,150*12/20,oMinValues,oMinValues,false); oCanv.closePath(); oCanv.fill(); oCanv.stroke(); //畫秒針 oCanv.beginPath(); oCanv.lineWidth=1; oCanv.moveTo(200,200); oCanv.arc(200,200,150*15/20,oSecValues,oSecValues,false); oCanv.closePath(); oCanv.fill(); oCanv.stroke(); //畫數(shù)字 var deg = 2 * Math.PI / 12;//弧度=角度*Math.PI/180; oCanv.save(); oCanv.beginPath(); oCanv.translate(200, 200); for (var i = 1; i < 13; i++) { var x1 = Math.sin(i * deg);//正弦 var y1 = -Math.cos(i * deg);//余弦 oCanv.fillStyle = "black";//字體顏色 oCanv.font = "noraml 30px Calibri";//字體 oCanv.textAlign = 'center'; oCanv.textBaseline = 'middle'; oCanv.fillText(i, x1 * 125, y1 * 125);//填充 125這個(gè)值越大 越顯示在圓外面 } oCanv.closePath(); oCanv.restore(); }
但由于里邊的圓心,半徑,點(diǎn)數(shù)都是固定好的,如果要修改圓心位置、半徑大小會(huì)比較麻煩,我們可以封裝一下,下邊是我之前寫的一個(gè)封裝好的代碼:
window.onload = function(){ setInterval(oCan, 1000);//毫秒 } function oCan(){ var circleX = 200; var circleY = 200; var circleR = 150; var oPI = Math.PI/180; var oc = document.getElementById("myCanvas"); var ogc = oc.getContext("2d"); ogc.clearRect(0, 0, circleX, circleY);//清空畫布 ogc.beginPath(); /*畫分針刻度*/ for(var i=0; i<60; i++){ ogc.moveTo(circleX,circleY); ogc.arc(circleX,circleY,circleR,6*oPI*i,6*oPI*(i+1),false); } ogc.closePath(); ogc.stroke(); //畫一個(gè)白色實(shí)心圓蓋住其他的線,使其出來(lái)分針刻度線 ogc.beginPath(); ogc.fillStyle = "#fff"; ogc.arc(circleX,circleY,circleR * 19 / 20,0,360*oPI,false); ogc.closePath(); ogc.fill(); //ogc.stroke();//為什么注釋,會(huì)出現(xiàn)黑框 /*畫時(shí)針刻度*/ ogc.beginPath(); ogc.lineWidth = 3; for(var i=0; i<12; i++){ ogc.moveTo(circleX,circleY); ogc.arc(circleX,circleY,circleR,30*oPI*i,30*oPI*(i+1),false); } ogc.closePath(); ogc.stroke(); //畫一個(gè)白色實(shí)心圓蓋住其他的線,使其出來(lái)時(shí)針刻度線 ogc.beginPath(); ogc.fillStyle = "#fff"; ogc.arc(circleX,circleY,circleR*18/20,0,360*oPI,false); ogc.closePath(); ogc.fill(); /*求當(dāng)前時(shí)間*/ var oDate = new Date(); var oHours = oDate.getHours(); var oMin = oDate.getMinutes(); var oSec = oDate.getSeconds(); /*把時(shí)間轉(zhuǎn)換成弧度*/ var oHoursValues = (-90 + oHours * 30)*oPI; var oMinValues = (-90 + oMin * 6)*oPI; var oSecValues = (-90 + oSec * 6)*oPI; /*畫時(shí)針*/ ogc.beginPath(); ogc.lineWidth=5; ogc.moveTo(circleX,circleY); ogc.arc(circleX,circleY,circleR*8/20,oHoursValues,oHoursValues,false); ogc.closePath(); ogc.fill(); ogc.stroke(); /*畫分針*/ ogc.beginPath(); ogc.lineWidth = 3; ogc.moveTo(circleX,circleY); ogc.arc(circleX,circleY,circleR*12/20,oMinValues,oMinValues,false); ogc.closePath(); ogc.fill(); ogc.stroke(); /*畫秒針*/ ogc.beginPath(); ogc.lineWidth = 1; ogc.moveTo(circleX,circleY); ogc.arc(circleX,circleY,circleR*15/20,oSecValues,oSecValues,false); ogc.closePath(); ogc.fill(); ogc.stroke(); //畫數(shù)字 var deg = 2 * Math.PI / 12;//弧度=角度*Math.PI/180; ogc.save(); ogc.beginPath(); ogc.translate(circleX, circleY); for (var i = 1; i < 13; i++) { var x1 = Math.sin(i * deg);//正弦 var y1 = -Math.cos(i * deg);//余弦 ogc.fillStyle = "black";//字體顏色 ogc.font = "noraml 30px Calibri";//字體 ogc.textAlign = 'center'; ogc.textBaseline = 'middle'; ogc.fillText(i, x1 * (circleR*3/4), y1 * (circleR*3/4));//填充 125這個(gè)值越大 越顯示在圓外面 } ogc.closePath(); ogc.restore(); }
有什么錯(cuò)誤或?qū)懙牟缓玫牡胤?,還請(qǐng)不吝賜教,謝謝!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。