好长时间没有写过canvas了,该篇文章是我借助于两位博友的代码来实现的一篇文章,当笔记供自己日后学习更方便,也希望能帮助有需要的朋友!效果图展示
<style type="text/css">
#myCanvas,#myCanvas2{
position: absolute;
left: 0;
top: 0;
z-index: 1;
}
#myCanvas{
z-index: 2;
}
</style>
<body>
<canvas id="myCanvas" width="500" height="500"></canvas>
<!-- 表盘背景图画布:canvas插入画像
[canvas插入图像不显示问题,详情参考地址:](https://www.cnblogs.com/padding1015/p/9717845.html)
-->
<canvas id="myCanvas2" width="500" height="500"></canvas>
</body>
<script type="text/javascript">
var myCanvas=document.getElementById("myCanvas");
var cxt=myCanvas.getContext('2d');
//表盘背景图
var myCanvas2=document.getElementById("myCanvas2");
var cxt2=myCanvas2.getContext('2d');
var bgImg=new Image();
bgImg.src="img/eg_flower.png";
bgImg.onload = function(){
// console.log('图片加载成功');
// console.log(this);
cxt2.drawImage(bgImg,165,200,200,150);
};
function drawClock(){
//获取时间
var now = new Date(); //定义时间
var sec = now.getSeconds(); //获取秒
var minute = now.getMinutes(); //获取分钟
var hour = now.getHours(); //获取小时
//小时必须获取浮点类型,产生偏移(小时+分钟比)
hour = hour + minute/60;
//将24小时转换为12小时
hour=hour>12?hour-12:hour;
//清除画布
cxt.clearRect(0,0,500,500);
//表盘
cxt.beginPath(); //画笔开始
cxt.lineWidth = 2; //设置画笔的线宽
cxt.strokeStyle="#999"; //设置画笔的颜色
// 表盘外圆
cxt.arc(250,250,200,0,360,false); //绘制圆形,坐标250,250 半径200,整圆(0-360度),false表示顺时针
// cxt.moveTo(194,100);
//表盘内圆
cxt.moveTo(440,250);
cxt.arc(250,250,190,0,360,false); //绘制圆形,坐标250,250 半径200,整圆(0-360度),false表示顺时针
cxt.stroke(); //填充绘图
cxt.closePath(); //结束画布
//刻度
//时针刻度
for(var i=0; i<12; i++){
cxt.save();
//设置时针的样式 宽度 颜色
cxt.lineWidth=3;
cxt.strokeStyle="#000";
//设置异次元空间圆心
cxt.translate(250,250);
//设置旋转角度
cxt.rotate(i*30*Math.PI/180);
cxt.beginPath();
cxt.moveTo(0,-175); //画线, 从圆心0,-175开始
cxt.lineTo(0,-190); //到圆心0,-190结束
cxt.stroke();
cxt.closePath();
cxt.restore();
}
//分针刻度
for(var i=0; i<60;i++){
cxt.save();
cxt.lineWidth=1;
cxt.strokeStyle="#000";
cxt.translate(250,250);
cxt.rotate(i*6*Math.PI/180);
cxt.beginPath();
cxt.moveTo(0,-180);
cxt.lineTo(0,-190);
cxt.stroke();
cxt.closePath();
cxt.restore();
}
//时针
cxt.save();
//时针样式
cxt.lineWidth = 5;
cxt.strokeStyle="#000";
cxt.translate(250,250);
cxt.rotate(hour*30*Math.PI/180);
cxt.beginPath();
cxt.moveTo(0,-140);
cxt.lineTo(0,10);
cxt.stroke();
cxt.closePath();
cxt.restore();
//分针
cxt.save();
//分针样式
cxt.lineWidth = 2;
cxt.strokeStyle="#000";
cxt.translate(250,250);
cxt.rotate(minute*6*Math.PI/180);
cxt.beginPath();
cxt.moveTo(0,-160);
cxt.lineTo(0,15);
cxt.stroke();
cxt.closePath();
cxt.restore();
//秒针
cxt.save();
cxt.lineWidth = 3;
cxt.strokeStyle="#f00";
cxt.translate(250,250);
cxt.rotate(sec*60*Math.PI/1800);
cxt.beginPath();
cxt.moveTo(0,-185);
cxt.lineTo(0,20);
cxt.stroke();
cxt.closePath();
//画出时针,分针,秒针交叉点
cxt.beginPath();
cxt.strokeStyle="#f00";
cxt.arc(0,0,5,0,360,false);
cxt.fillStyle="#fff"; //填充的颜色
cxt.fill(); //填充
cxt.stroke();
cxt.closePath();
//秒针装饰
cxt.beginPath();
cxt.strokeStyle="#f00";
cxt.arc(0,-160,5,0,360,false);
cxt.fill();
cxt.stroke();
cxt.closePath();
cxt.restore();
function hous(x,y,r,h,cxt){
//三次立方根
var gen3=Math.sqrt(3);
//半径
var rs=0.5*r;
switch(h) {
case 1:
cxt.fillText("1",x+rs,y-rs*gen3);
break;
case 2:
cxt.fillText("2",x+gen3*rs,y-rs);
break;
case 3:
cxt.fillText("3",x+2*rs,y);
break;
case 4:
cxt.fillText("4",x+gen3*rs,y+rs);
break;
case 5:
cxt.fillText("5",x+rs,y+gen3*rs);
break;
case 6:
cxt.fillText("6",x,y+2*rs);
break;
case 7:
cxt.fillText("7",x-rs,y+gen3*rs);
break;
case 8:
cxt.fillText("8",x-gen3*rs,y+rs);
break;
case 9:
cxt.fillText("9",x-2*rs,y);
break;
case 10:
cxt.fillText("10",x-gen3*rs,y-rs);
break;
case 11:
cxt.fillText("11",x-rs,y-gen3*rs);
break;
case 12:
cxt.fillText("12",x,y-2*rs);
break;
default:
alert("超出时间刻度1~12的范围啦!");
}
}
// 添加表盘上的数字
cxt.font="bold 14px Arial";
cxt.textAlign="center";
cxt.textBaseline="midden";
for(var i=1;i<13;i++){
hous(252,254,160,i,cxt);
}
}
//使用setinterval()计时器让时钟动起来
setInterval(drawClock,1000);
</script>
然后说一下清除画布,不清除画布的话,就会发生该图现象:
所以当时钟转动起来的时候,需要清除一下画布,不然就会像上图展示的那样,会留下时分秒三针的轨迹,遍布表盘。