为什么我的是酱紫的
代码:
var dom=document.getElementById('clock');
var ctx=dom.getContext('2d');
var width=ctx.canvas.width;
var height=ctx.canvas.height;
var r=width/2;
function drawBackground(){
ctx.save();
ctx.translate(r,r);
ctx.beginPath();
ctx.lineWidth=10;
ctx.arc(0,0,r-5,0,2*Math.PI,false);
ctx.stroke();
var hourNumbers=[3,4,5,6,7,8,9,10,11,12,1,2];
hourNumbers.forEach(function(number,i){
ctx.font='18px Arial'
ctx.textAlign='center';
ctx.textBaseline='middle';
var rad=2*Math.PI/12*i;
var x=Math.cos(rad)*(r-30);
var y=Math.sin(rad)*(r-30);
ctx.fillText(number,x,y);
});
for(var i=0;i<60;i++){
var rad=2*Math.PI/60*i;
var x=(r-20)*Math.cos(rad);
var y=(r-20)*Math.sin(rad);
ctx.beginPath();
if(i%5==0){
ctx.arc(x,y,2,0,2*Math.PI,false);
ctx.fillStyle='#000';
}
else{
ctx.arc(x,y,2,0,2*Math.PI,false);
ctx.fillStyle='#ccc';
}
ctx.fill();
}
}
function drawHour(hour,minu){
ctx.save();
ctx.beginPath();
var rad=2*Math.PI/12*hour;
var mrad=2*Math.PI/12/60*minu;
ctx.lineWidth=5;
ctx.linecap='round';
ctx.rotate(rad+mrad);
ctx.moveTo(0,10);
ctx.lineTo(0,-r/3);
ctx.stroke();
ctx.restore();
}
function drawMinute(minu){
ctx.save();
ctx.beginPath();
var rad=2*Math.PI/60*minu;
ctx.lineWidth=3;
ctx.linecap='round';
ctx.rotate(rad);
ctx.moveTo(0,10);
ctx.lineTo(0,-r/2);
ctx.stroke();
ctx.restore();
}
function drawSecond(second){
ctx.save();
ctx.beginPath();
var rad=2*Math.PI/60*second;
ctx.lineWidth=1;
ctx.linecap='round';
ctx.strokeStyle='#0000ff';
ctx.rotate(rad);
ctx.moveTo(0,10);
ctx.lineTo(0,-r/2-10);
ctx.stroke();
ctx.restore();
}
function drawDot(){
ctx.beginPath();
ctx.fillStyle='#fff';
ctx.arc(0,0,3,0,2*Math.PI,false);
ctx.fill();
}
drawBackground();
drawDot();
function draw(){
ctx.clearRect(0,0,width,height);
var now =new Date();
var hour=now.getHours();
var minu=now.getMinutes();
var second=now.getSeconds();
drawHour(hour,minu);
drawMinute(minu);
drawSecond(second);
drawBackground();
drawDot();
ctx.restore();
}
draw();
setInterval(draw,1000);
还有。。怎么用火狐调试~~
你把drawBackground和drawDot函数放在draw()函数外面没有意义,因为每次执行draw函数都会直接清除画布,还是会被清除掉.
尝试下这样:
setInterval(function(){
ctx.clearRect(0,0,w,h);
draw();
},1000); 个人感觉画布在restore和save上要多加小心,很容易出错了,我是调试时没有在draw()函数忘了写上ctx.restore()出现跟你一样的情况,加上之后发现虽然不错位了,但是没有清除的效果,所以就改成了上面的在定时器里清除画布全部代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<style type="text/css">
div{
text-align: center;
margin-top: 250px;
}
#click{
border: 1px solid #CCC;
}
</style>
</head>
<body>
<div>
<canvas id="click" width="200px" height="200px"></canvas>
</div>
<script>
var canvas=document.getElementById('click');
var ctx=canvas.getContext('2d');
var w=ctx.canvas.width;
var h=ctx.canvas.height;
var r=w/2;
function drawCircle(){
ctx.save();
ctx.translate(r,r);
ctx.beginPath();
ctx.lineWidth=10;
ctx.arc(0,0,r-5,0,2*Math.PI,false);
ctx.stroke();
var hoursNum=[3,4,5,6,7,8,9,10,11,12,1,2];
hoursNum.forEach(function(number,i){
ctx.font='18px 微软雅黑';
ctx.textAlign='center';
ctx.textBaseline='middle';
var rad=2*Math.PI/12*i;
var y=(r-30)*Math.sin(rad);
var x=(r-30)*Math.cos(rad);
ctx.fillText(number,x,y);
})
}
function drawDots(){
for(j=0;j<60;j++){
ctx.beginPath();
var rad=2*Math.PI/60*j;
var y=(r-15)*Math.sin(rad);
var x=(r-15)*Math.cos(rad);
ctx.beginPath();
if(j%5===0){
ctx.fillStyle='#000'
ctx.arc(x,y,3,0,2*Math.PI,false);
}else{
ctx.fillStyle='#CCC';
ctx.arc(x,y,2,0,2*Math.PI,false);
}
ctx.fill();
}
ctx.beginPath();
ctx.fillStyle='white';
ctx.arc(0,0,2.5,0,2*Math.PI,false);
ctx.fill();
}
function drawHour(h,min){
ctx.save();
ctx.beginPath();
ctx.lineWidth=6;
ctx.lineCap='round';
var rad=2*Math.PI/12*h;
var minRad=2*Math.PI/720*min;
ctx.rotate(rad+minRad);
ctx.moveTo(0,10);
ctx.lineTo(0,-(r-50));
ctx.stroke();
ctx.restore();
}
function drawMinute(min,sec){
ctx.save();
ctx.beginPath();
ctx.lineWidth=4.5;
ctx.lineCap='round';
var rad=2*Math.PI/60*min;
var secRad=2*Math.PI/3600*sec;
ctx.rotate(rad+secRad);
ctx.moveTo(0,10);
ctx.lineTo(0,-(r-40));
ctx.stroke();
ctx.restore();
}
function drawSecond(sec){
ctx.save();
ctx.beginPath();
ctx.fillStyle='crimson';
ctx.rotate(2*Math.PI/60*sec);
ctx.moveTo(-2,20);
ctx.lineTo(2,20);
ctx.lineTo(1,-r+18);
ctx.lineTo(-1,-r+18);
ctx.fill();
ctx.restore();
}
function draw(){
ctx.clearRect(0,0,w,h)
drawCircle();
var now=new Date();
var h=now.getHours();
var min=now.getMinutes();
var sec=now.getSeconds();
drawHour(h,min);
drawMinute(min,sec);
drawSecond(sec);
drawDots();
}
draw();
setInterval(draw,1000);
</script>
</body>
</html>function draw(){
var now=new Date();
var h=now.getHours();
var min=now.getMinutes();
var sec=now.getSeconds();
drawCircle();
drawHour(h,min);
drawMinute(min,sec);
drawSecond(sec);
drawDots();
ctx.restore();
}
draw();
setInterval(function(){
ctx.clearRect(0,0,w,h);
draw();
},1000);抱歉我上面代码最后部分贴错了,这是我写的正确的.
lineWidth变大了,他是在原来的基础上宽度向两边扩大,所以减去的是lineWidth的一半