canvasクロック効果を実現
5109 ワード
HTML 5のcanvasの実用的な入門の小さな例は、一歩一歩来ています.学習の最良の方法は実践であり、HTML 5 Canvas参考マニュアルを参考にし、自分の試みと実践を加えることで、すぐにcanvas時計を手に入れることができます.オンラインデモ
シャドウ付き文字盤現在のcanvasの幅 を取得する.半径rを宣言するときに、いくつかの影と線幅の幅 を残す.シャドウ: グラデーション: 円: 円周率、PI大文字: 再マッピングセンタ めもり影を落とす は再び(0,0)から始まります.そうでないと、円上3の位置から に始まります.目盛りは1本の線で、 で目盛り均一分布文字盤、角度を計算する必要があり、正弦余弦を使用する必要がある 正弦sin=対辺/斜辺 コサインcos=隣接/斜辺 である.
の整点の位置は5の倍数であり、 と判断する.
ししんポインタは線で、 でポインタは回転し、 でポインタキャップは丸い、 では、先頭 に変化する.の開始角は目盛り3の位置、 である.時計回りの位置も分針の影響を受け、 .先に回転してから線を引く 秒針は比較的細く、4点の線と を充填する.理論的には3つのポインタ関数が統合されるべきだが、3つはそれぞれ異なるので、私は統合しない. ポインタ固定の一端は長さを少し残して、円固定 を追加しなければならない.
時計を動かして現在時刻 を取得する.タイマーを設定し、毎秒新しい時間 を取得する.しかしひっきりなしに重なり合って描くことができて、毎秒1回の矩形をクリアします: 修飾が完璧である. どこがsaveで、どこがrestoreで、どのように区別しますか? は、キャンバスサイズを変化させる変数
完全なコード
シャドウ付き文字盤
var width=ctx.canvas.width;
var r=width/2-8;
shadowBlur, shadowColor, shadowOffsetX, ctx.shadowOffsetY
createRadialGradient, addColorStop
arc
Math.PI
translate
ctx.beginPath();
lineTo, stroke
Math.sin()
およびMath.cos()
の角度は円弧であり、円弧=円弧長/半径i%5==0
でししん
lineTo, stroke
rotate
ctx.lineCap="round";
ctx.save();
、末尾ctx.restore();
が必要である、そうでなければ開始位置がctx.rotate(2*Math.PI/60*(min-15));
ctx.rotate(2*Math.PI/12*(hour-3)+2*Math.PI/12/60*min);
時計を動かして
new Date(); getHours(); getMinutes(); getSeconds()
setInterval()
ctx.clearRect(0,0,width,height);
setInterval
は1秒間隔で実行されるので、一度実行しないと1秒停止して時計が表示されます.rem=width/300
を宣言し、クロックは正常に表示され、半径rがwidthに関連付けられていることに注意し、このパラメータremを繰り返す必要はありません.完全なコード
var canvas=document.getElementById("myCanvas");
var ctx=canvas.getContext("2d");
var width=ctx.canvas.width; // canvas
var height=ctx.canvas.height;
var rem=width/300; // ,
var r=width/2-8*rem; // ; r width , r *rem
//
function drawBg(){
ctx.save();
ctx.translate(width/2,width/2); // canvas ,
ctx.lineWidth=4*rem;
ctx.shadowBlur=3*rem;
ctx.shadowColor="#222"; //
ctx.shadowOffsetX=3*rem;
ctx.shadowOffsetY=3*rem;
ctx.strokeStyle="#666"; //
var grd=ctx.createRadialGradient(0,0,10*rem,0,0,r); // 10 r
grd.addColorStop(0,"#fefefe");
grd.addColorStop(1,"#dedede");
ctx.fillStyle=grd; // ,
ctx.arc(0,0,r,0,2*Math.PI); // , 。
ctx.stroke();
ctx.fill();
//ctx.restore();
}
//
function drawScale(){
//ctx.save();
ctx.shadowBlur = 0;
ctx.shadowColor = "";
ctx.shadowOffsetX = 0;
ctx.shadowOffsetY = 0;
for(var i=0;i<60;i++){
ctx.beginPath();
if(i%5==0){
ctx.strokeStyle="#222";
ctx.lineWidth=4;
ctx.lineTo((r-8*rem)*Math.cos(2*Math.PI/60*i),(r-8*rem)*Math.sin(2*Math.PI/60*i));
}else{
ctx.strokeStyle="#666";
ctx.lineWidth=2;
ctx.lineTo((r-4*rem)*Math.cos(2*Math.PI/60*i),(r-4*rem)*Math.sin(2*Math.PI/60*i));
}
ctx.lineTo(r*Math.cos(2*Math.PI/60*i),r*Math.sin(2*Math.PI/60*i));
ctx.stroke();
}
//ctx.restore();
}
//
function drawHour(hour,min){
ctx.save(); // , 。
ctx.beginPath();
ctx.lineWidth=6*rem;
ctx.lineCap="round";
ctx.strokeStyle="#222";
ctx.rotate(2*Math.PI/12*(hour-3)+2*Math.PI/12/60*min); // 3
ctx.moveTo(-15*rem,0);
ctx.lineTo(r/2,0);
ctx.stroke();
ctx.restore();
}
//
function drawMin(min){
ctx.save();
ctx.beginPath();
ctx.lineWidth=3*rem;
ctx.lineCap="round";
ctx.strokeStyle="#222";
ctx.rotate(2*Math.PI/60*(min-15)); // 3
ctx.moveTo(-15*rem,0);
ctx.lineTo(r/2+30*rem,0);
ctx.stroke();
ctx.restore();
}
//
function drawSec(sec){
ctx.save();
ctx.beginPath();
ctx.fillStyle="#c14543";
ctx.rotate(2*Math.PI/60*(sec-15)); // 3
ctx.moveTo(-15*rem,2*rem);
ctx.lineTo(-15*rem,-2*rem);
ctx.lineTo(r-8*rem,-1*rem);
ctx.lineTo(r-8*rem,1*rem);
ctx.fill();
ctx.restore();
}
//
function drawDot(){
ctx.beginPath();
ctx.fillStyle="#fff";
ctx.arc(0,0,6*rem,0,2*Math.PI);
ctx.fill();
}
//
function draw(){
ctx.clearRect(0,0,width,height); //
var date=new Date();
var h=date.getHours();
var m=date.getMinutes();
var s=date.getSeconds();
drawBg();
drawScale();
drawHour(h,m);
drawMin(m);
drawSec(s);
drawDot();
ctx.restore();
}
//
var timer=setInterval(draw, 1000);
draw(); // , 。