canvas写了一个时钟,没用rotate,完全线条绘制,方法比较原始。 演示:http://runjs.cn/detail/lxiolary 1. [代码] [JavaScript]代码 !DOCTYPE htmlhtml head meta charset="utf-8" title canvas clock/title /head body can
演示:http://runjs.cn/detail/lxiolary
1. [代码][JavaScript]代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title> canvas clock</title>
</head>
<body>
<canvas id="canvas-clock" style="display:block; margin: 30px auto;border:1px solid #CCC;"></canvas>
<script type="text/javascript">
function drawClock(width, pad) {
'use strict';
var size = width || 300;
var padding = pad || 40;
var canvas = document.getElementById('canvas-clock');
var ctx = canvas.getContext('2d');
canvas.width = canvas.height = size;
var x = size/2, y = size/2;
var r = (size - 2*padding) / 2;
var drawTime = function () {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.save();
ctx.beginPath(); // 绘制辅助线
ctx.strokeStyle = '#F2F2F2';
ctx.moveTo(0, y+0.5);
ctx.lineTo(size, y+0.5);
ctx.moveTo(x+0.5, 0);
ctx.lineTo(x+0.5, size);
ctx.stroke(); // 绘制结束
ctx.restore();
ctx.beginPath();
ctx.strokeStyle = 'blue'; // 蓝色线条
ctx.moveTo(x+r, y);
ctx.arc(x, y, r, 0, 2*Math.PI, true); // 中心点、半径,角度 2PI,顺时针
ctx.stroke(); // 绘制结束
var fontSize = size/15;
ctx.font = fontSize + "px Arial";
ctx.textAlign = "center";
ctx.fillStyle = "blue";
var idg = 2*Math.PI/12; // 360度分成12份
var txr = r - fontSize * 0.8; // 在圆弧内测的小圆写文字
for(var i=1; i<=12; i++){
var rot = i*idg;
ctx.fillText(i, x+txr*Math.sin(rot), y-txr*Math.cos(rot)+fontSize/2);
}
ctx.restore();
ctx.save();
var hr = r * 0.55;
var mr = r * 0.65;
var sr = r * 0.75; // 时分秒的半径长度,时针hour最短,秒针second最长。
var cr = r * 0.68; // 秒针的圆点
var rr = 4; // 圆点半径
var sr1= r * 0.2; // 秒针尾巴长度
var p2 = 2 * Math.PI;
var now = new Date();
var seconds = now.getSeconds() + now.getMilliseconds()/1000, minutes = now.getMinutes() + seconds/60, hour = now.getHours() + minutes/60;
var hx = x + hr * Math.sin(hour/12 * p2), hy = y - hr * Math.cos(hour/12*p2), // 时针x,y
mx = x + mr * Math.sin(minutes/60 * p2), my = y - mr * Math.cos(minutes/60*p2), // 分针x,y
sx = x + sr * Math.sin(seconds/60 * p2), sy = y - sr * Math.cos(seconds/60*p2), // 秒针最大到达的x,y
cx = x + (cr - rr) * Math.sin(seconds/60 * p2), cy = y - (cr - rr) * Math.cos(seconds/60*p2), // 秒针的圆x,y
tx = x + cr * Math.sin(seconds/60 * p2), ty = y - cr * Math.cos(seconds/60*p2), // 秒针开始绘制圆的x,y
sx0 = x + (cr - 2*rr) * Math.sin(seconds/60 * p2), sy0 = y - (cr - 2*rr) * Math.cos(seconds/60*p2), // 秒针到圆圈的长度
sx1= x - sr1 * Math.sin(seconds/60 * p2), sy1= y + sr1 * Math.cos(seconds/60*p2); // 秒针反向绘制的x,y
ctx.beginPath(); // 时针
ctx.lineCap = 'round';
ctx.lineWidth = 5;
ctx.strokeStyle = 'blue';
ctx.moveTo(x,y);
ctx.lineTo(hx,hy);
ctx.stroke();
ctx.restore();
ctx.save();
ctx.beginPath(); // 分针
ctx.lineWidth = 3;
ctx.lineCap = 'round';
ctx.strokeStyle = 'green';
ctx.moveTo(x,y);
ctx.lineTo(mx,my);
ctx.stroke();
ctx.restore();
ctx.save();
ctx.beginPath(); // 绘制中心小圆
ctx.moveTo(x+3, y);
ctx.fillStyle = 'blue';
ctx.arc(x, y, 6, 0, 2*Math.PI, true); // 中心小圆
ctx.fill();
ctx.restore();
ctx.save();
ctx.beginPath(); // 秒针
ctx.strokeStyle = 'red';
ctx.moveTo(tx, ty);
var lr = seconds < 15 ? (seconds + 45)/60 * p2 : (seconds - 15)/60 * p2;
ctx.arc(cx, cy, rr, lr, lr+Math.PI, true); // 绘制下圆弧
ctx.moveTo(tx, ty);
ctx.arc(cx, cy, rr, lr, lr+Math.PI, false); // 绘制上半圆弧
ctx.moveTo(x,y);
ctx.lineTo(sx0, sy0);
ctx.moveTo(tx,ty);
ctx.lineTo(sx, sy);
ctx.moveTo(x,y);
ctx.lineTo(sx1,sy1);
ctx.stroke();
ctx.restore();
ctx.save();
};
drawTime();
setInterval(function(){
drawTime();
}, 100);
}
window.onload = function(){
drawClock();
};
</script>
</body>
</html>
