<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
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
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
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>