HTML5之前,为了达到页面绚丽多彩的效果,我们很多情况下都是借助“图片”来实现。不过使用图片这种方式,都是以“ ”低性能为代价的。由于图片体积大、下载速度慢等原因,因此为了应对日渐复杂的Web应用开发,W3C在HTML5标准中引入了Canvas这一门技术。
Canvas又称为“画布”,是HTML5的核心技术之一。我们常说的Canvas技术,指的就是使用Canvas元素结合JavaScript来绘制各种图形的技术。
Canvas是基于“位图”的,适用于像素处理和动态渲染,图形放大会影响质量。SVG是基于“矢量”的,不适于像素处理和静态描述,图形放大不会影响智力。也就是说,使用Canvas绘制出来的是一个“位图”,而使用SVG绘制出来的是一个“矢量图。
绘制动态时钟
首先是画布
<body>
<canvas id="canvas" width="600" height="600"></canvas>
</body>
<script>
var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
</script>
绘制表盘
context.beginPath();
context.lineWidth = 10;
context.arc(300, 300, 200, 0, 2 * Math.PI, false);
context.strokeStyle = "aquamarine";
context.stroke();
context.closePath();
绘制刻度
//刻度
//时
for(var i = 0; i < 12; i++) {
//用到异次元画法
context.save();
context.beginPath();
//重新设置0,0点
context.translate(300, 300);
//旋转角度
context.rotate(i * 30 * Math.PI / 180);
context.moveTo(0, -200);
context.lineTo(0, -180);
context.stroke();
context.closePath();
//异次元的东西 塞回来
context.restore();
}
//分刻度
for(var i = 0; i < 60; i++) {
//用到异次元画法
context.save();
context.beginPath();
//重新设置0,0点
context.translate(300, 300);
//旋转角度
context.rotate(i * 6 * Math.PI / 180);
context.moveTo(0, -200);
context.lineTo(0, -185);
context.lineWidth = 8;
context.stroke();
context.closePath();
//异次元的东西 塞回来
context.restore();
}
//时针
context.beginPath();
context.save();
//重新设置0,0点
context.translate(300, 300);
//旋转角度
context.rotate(hour * 30 * Math.PI / 180);
context.moveTo(0, 0);
context.lineTo(0, -100);
context.lineWidth = 8;
context.stroke();
context.closePath();
//异次元的东西 塞回来
context.restore();
//分针
context.beginPath();
context.save();
//重新设置0,0点
context.translate(300, 300);
//旋转角度
context.rotate(min * 6 * Math.PI / 180);
context.moveTo(0, 10);
context.lineTo(0, -130);
context.lineWidth = 5;
context.stroke();
context.closePath();
//异次元的东西 塞回来
context.restore();
//秒钟
context.beginPath();
context.save();
//重新设置0,0点
context.translate(300, 300);
//旋转角度
context.rotate(sec * 6 * Math.PI / 180);
context.moveTo(0, 15);
context.lineTo(0, -150);
context.lineWidth = 3;
context.stroke();
context.closePath();
//异次元的东西 塞回来
context.restore();
绘制表心
context.beginPath();
context.lineWidth = 10;
context.arc(300, 300, 10, 0, 2 * Math.PI, false);
context.fillStyle = "white";
context.fill();
context.closePath();
对当前的时间进行获取
context.clearRect(0,0,600,600);
//在画所有的东西之前都要去取到当前的时间
var now = new Date();
var hour = now.getHours();
var min = now.getMinutes();
var sec = now.getSeconds();
hour = hour+min/60
if(hour >12){
hour = hour -12;
}
计时器的运用
var timer = setInterval(show,1000)
源码为
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
#canvas {
/*border: 1px solid red;*/
display: block;
margin: 0 auto;
}
</style>
</head>
<body bgcolor="black">
<canvas id="canvas" width="600" height="600"></canvas>
</body>
<script type="text/javascript">
var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
function show() {
context.clearRect(0,0,600,600);
//在画所有的东西之前都要去取到当前的时间
var now = new Date();
var hour = now.getHours();
var min = now.getMinutes();
var sec = now.getSeconds();
hour = hour+min/60
if(hour >12){
hour = hour -12;
}
//表盘
context.beginPath();
context.lineWidth = 10;
context.arc(300, 300, 200, 0, 2 * Math.PI, false);
context.strokeStyle = "aquamarine";
context.stroke();
context.closePath();
//刻度
//时
for(var i = 0; i < 12; i++) {
//用到异次元画法
context.save();
context.beginPath();
//重新设置0,0点
context.translate(300, 300);
//旋转角度
context.rotate(i * 30 * Math.PI / 180);
context.moveTo(0, -200);
context.lineTo(0, -180);
context.stroke();
context.closePath();
//异次元的东西 塞回来
context.restore();
}
//分刻度
for(var i = 0; i < 60; i++) {
//用到异次元画法
context.save();
context.beginPath();
//重新设置0,0点
context.translate(300, 300);
//旋转角度
context.rotate(i * 6 * Math.PI / 180);
context.moveTo(0, -200);
context.lineTo(0, -185);
context.lineWidth = 8;
context.stroke();
context.closePath();
//异次元的东西 塞回来
context.restore();
}
//时针
context.beginPath();
context.save();
//重新设置0,0点
context.translate(300, 300);
//旋转角度
context.rotate(hour * 30 * Math.PI / 180);
context.moveTo(0, 0);
context.lineTo(0, -100);
context.lineWidth = 8;
context.stroke();
context.closePath();
//异次元的东西 塞回来
context.restore();
//分针
context.beginPath();
context.save();
//重新设置0,0点
context.translate(300, 300);
//旋转角度
context.rotate(min * 6 * Math.PI / 180);
context.moveTo(0, 10);
context.lineTo(0, -130);
context.lineWidth = 5;
context.stroke();
context.closePath();
//异次元的东西 塞回来
context.restore();
//秒钟
context.beginPath();
context.save();
//重新设置0,0点
context.translate(300, 300);
//旋转角度
context.rotate(sec * 6 * Math.PI / 180);
context.moveTo(0, 15);
context.lineTo(0, -150);
context.lineWidth = 3;
context.stroke();
context.closePath();
//异次元的东西 塞回来
context.restore();
//表心
context.beginPath();
context.lineWidth = 10;
context.arc(300, 300, 10, 0, 2 * Math.PI, false);
context.fillStyle = "white";
context.fill();
context.closePath();
}
var timer = setInterval(show,1000)
</script>
</html>
如有不足,请多指导