web页面实现时钟canvas

167 阅读12分钟
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style type="text/css">
	#drawing{
		display: block;
		margin:10px auto; 
        /* 配置左右自动外间距-上下10px外间距-则居中 */
	}
</style>
</head>
<body>
<canvas id="drawing" ></canvas>
<script>
    //  下面来实现静态的时钟背景,包括外层钟框、内层圆点及数字、以及中心点的固定按扣,以时钟尺寸为200*200为基准,则半径为100,通过translate()将圆心点调整为(0,0)点
    // 
var drawing = document.getElementById('drawing');
if(drawing.getContext){
    // 由于外面经常要用到R和cxt.lineWidth,所以将其保存为变量
    var cxt = drawing.getContext('2d');
    var W = drawing.width = 200;
    var H = drawing.height = 200;
    var R = W / 2;
    var cw = cxt.lineWidth = 0.1*R;
    function drawStatics(){
        cxt.save();
//         【外层钟框】

//   为了将外层钟框不超出canvas区域,则其半径设置为R-cw/2,线条宽度与半径成比例
        cxt.translate(R,R);
        cxt.beginPath();
        cxt.lineWidth = 0.1*R;
        cxt.arc(0,0,R-cw/2,0,2*Math.PI,false);
        cxt.strokeStyle = '#409EFF'
        cxt.stroke(); 
                      
//         【内层数字】

//   在距离圆心点0.8R-cw/2处,绘制12个数字,表示当前的分钟数,数字的字体大小与半径成比例
        cxt.beginPath();   
        cxt.font = 0.2 * R + 'px 宋体';
        cxt.textAlign = 'center';
        cxt.textBaseline = 'middle';  
        var r1 = 0.8*R  - cw/2;   
        for(var i = 12; i > 0; i--){
            var radius = 2*Math.PI/12 * i + 1.5*Math.PI;
            var x = Math.cos(radius) * r1;
            var y = Math.sin(radius) * r1;
            cxt.fillText(i,x,y);
        }
//         【内层原点】

//   在距离圆心点0.9R-cw/2处,绘制60个圆点,表示当前的秒数,当前秒数与分钟数处于同一角度时,表示为大圆点(半径为cx/5),否则为小圆点(半径为cx/8)
        cxt.beginPath();
        var r2 = 0.9*R - cw/2;
        for(var i = 0; i < 60; i++){
            var radius = 2*Math.PI/60*i + 1.5*Math.PI;
            var x = Math.cos(radius) * r2;
            var y = Math.sin(radius) * r2;
            cxt.beginPath();
            if(i%5 === 0){
              cxt.arc(x,y,cw/5,0,2*Math.PI,false);
            }else{
              cxt.arc(x,y,cw/8,0,2*Math.PI,false);
            }
            cxt.fill();
        }
        cxt.restore();
    }
    function drawDot(){
        cxt.save();
        cxt.translate(R,R);    
        // 【绘制中心点的固定按扣】    
        cxt.beginPath();
        cxt.arc(0,0,cw/3,0,2*Math.PI,false);
        cxt.fillStyle = '#fff';
        cxt.fill();
        cxt.restore();
    }
//     【秒针】

//   开启一个每秒变化1次定时器,秒针与当前的时间的秒数保持一致  
    function drawSecond(second){
        cxt.save();
        cxt.translate(R,R);
        cxt.beginPath();
        var radius = 2*Math.PI/60 * second;
        cxt.rotate(radius);
        cxt.lineWidth = 2;
        cxt.moveTo(0,cw*2);
        cxt.lineTo(0,-0.8*R);
        cxt.strokeStyle = 'orange';
        cxt.stroke();
        cxt.restore();
    }
//     【分针】

//   分针的变化与当前的秒数和分钟数都有关
    function drawMinute(minute,second){
        cxt.save();
        cxt.translate(R,R);
        cxt.beginPath();
        var radius = 2*Math.PI/60 * minute;
        var sRaiuds = 2*Math.PI/60/60 * second;
        cxt.rotate(radius + sRaiuds);
        cxt.lineWidth = 4;
        cxt.lineCap = 'round';
        cxt.moveTo(0,cw);
        cxt.lineTo(0,-(0.8*R - cw/2));
        cxt.strokeStyle = 'pink'
        cxt.stroke();
        cxt.restore();
    }
//     【时针】

//   时针的变化与当前的分钟数和小时数都有关
    function drawHour(hour,minute){
        cxt.save();
        cxt.translate(R,R);
        cxt.beginPath();
        var radius = 2*Math.PI/12 * hour;
        var mRaiuds = 2*Math.PI/12/60 * minute;
        cxt.rotate(radius + mRaiuds);
        cxt.lineWidth = 6;
        cxt.lineCap = 'round';
        cxt.moveTo(0,cw/2);
        cxt.lineTo(0,-(0.8*R - cw*2));
        cxt.strokeStyle = 'blue'
        cxt.stroke();
        cxt.restore();
    }    
    function draw(){
        cxt.clearRect(0,0,W,H);
        drawStatics();
        var now = new Date();
        drawHour(now.getHours(),now.getMinutes());
        drawMinute(now.getMinutes(),now.getSeconds());   
        drawSecond(now.getSeconds());
        drawDot();    
    }
    draw();
    setInterval(draw,500);
}
</script>  
</body>
</html>