HTML5+CSS3的读书笔记(two)--了解canvas元素

140 阅读6分钟

第五章:HTML5的图像及动画

1.一个简单的canvas画图实例

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/
TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<script>
function drawRectangle()
{
	var canvas = document.getElementById("myCanvas");
	var context = canvas.getContext("2d");
	context.strokeStyle="#66";
	context.strokeRect(50,50,100,80);
}
</script>
<fieldset>
<legend>绘制矩形</legend>
<canvas id="myCanvas" width="200px" height="200px"> 
</canvas>
<br>
<button onclick="drawRectangle()">绘图</button>
</fieldset>
</body>
</html>

2.理解canvas的坐标系

canvas元素构建的画布是一个基于二维(x,y)的网络。
坐标原点(00)位于canvas的左上角。
从原点沿x轴从左往右,取值依次增加。
从原点沿y轴从上往下,取值依次增加。

3.使用moveTo/lineTo画线

moveTo(x,y)
将光标移动至指定坐标
该坐标作为绘制图形的起点坐标
其中参数x代表起点的横坐标
其中参数y代表起点的纵坐标
lineTo(x,y)
指定一个坐标作为绘制图形的终点坐标
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/
TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<script>
function drawLine()
{
	var canvas = document.getElementById("myCanvas");
	var context = canvas.getContext("2d");
	context.moveTo(10,10);
	context.lineTo(10,100);
	context.lineTo(125,125);
	context.lineTo(150,175);
	context.stroke();
}
</script>
<fieldset>
<legend>使用moveTo、lineTo绘制直线</legend>
<canvas id="myCanvas" width="200px" height="200px"> 
</canvas>
<br>
<button onclick="drawLine()">绘图</button>
</fieldset>
</body>
</html>

4.使用arc画弧线

arc(x,y,startangle,endangle,anticlockwise)

--x表示绘制弧形曲线圆心的横坐标
--y表示绘制弧形曲线圆心的纵坐标
--startangle表示绘制弧形曲线的起始弧度
--endangle表示绘制弧形曲线的结束弧度
--anticlockwise表示绘制弧形曲线的结束弧度
startangle和endangle都是以x轴为作为参照的,这两个参数用到的单位是弧度不是度。度和弧度直接转换的关系为:弧度=(Math.PI/180)*度
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/
TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<script>
function drawArc()
{
	var canvas = document.getElementById("myCanvas");
	var context = canvas.getContext("2d");
	context.arc(100,100,80,0,(Math.PI/180)*90,false);
	context.stroke();
}
</script>
<!--
function drawLine()
{
	var canvas = document.getElementById("myCanvas");
	var context = canvas.getContext("2d");
	context.arc(100,100,80,0,(Math.PI*2,true);
	context.stroke();
}
-->
<fieldset>
<legend>绘制弧形</legend>
<canvas id="myCanvas" width="200px" height="200px"> 
</canvas>
<br>
<button onclick="drawArc()">绘图</button>
</fieldset>
</body>
</html>

5.绘制贝塞尔曲线

使用bezierCurveTo可以绘制三次贝塞尔曲线

使用quadraticCurveTo方法绘制二次贝塞尔曲线
bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y)

--cp1x第一个控制点的横坐标
--cp1y第一个控制点的纵坐标
--cp2x第二个控制点的横坐标
--cp2y第二个控制点的纵坐标
--x贝塞尔曲线终点的横坐标
--y贝塞尔曲线终点的纵坐标
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/
TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<script>
function draw()
{
	var canvas = document.getElementById("myCanvas");
	var context = canvas.getContext("2d");            
	for (var i = 100; i < 105; i++) {
		var x = Math.sin(i)*50;        
		var y = Math.cos(i)*100;           
		context.bezierCurveTo(i/100,i/100,x*x,y*y,x+y,x+y);        
	}
	context.stroke();
}
</script>
<fieldset>
<legend>使用bezierCurveTo绘制弧形</legend>
<canvas id="myCanvas" width="500px" height="500px"> 
</canvas>
<br>
<button onclick="draw()">绘图</button>
</fieldset>
</body>
</html>

6.图形样式设置

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/
TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<script>
function draw()
{
	var canvas = document.getElementById("myCanvas");
	var context = canvas.getContext("2d");
	context.fillStyle = "yellow";
	context.strokeStyle= "red";
	context.fillRect(60,60,130,110); //绘制矩形并在中间区域填充黄色
	context.strokeRect(50,50,150,130); //绘制矩形并在边缘填充红色
	context.clearRect(70,70,110,90); //清除指定区域像素
}
</script>
<fieldset>
<legend>绘制带样式的矩形</legend>
<canvas id="myCanvas" width="200px" height="200px"> 
</canvas>
<br>
<button onclick="draw()">绘图</button>
</fieldset>
</body>
</html>

1.fillStyl属性:
为当前画布上下文设置图形样式,默认是黑色

2.fillRect(x,y,width,height)方法:
绘制一个矩形,并使用当前的fillStyle样式

3.strokeRect(x,y,width,height)方法:
绘制一个矩形,使用当前的strokeStyle样式绘制矩形的边缘,中间区域不予处理

4.strokeStyle属性

7.线性渐变

creatLinearGradient(xstart,ystart,xend,yend)
--xstart渐变起始点的横坐标
--ystart渐变起始点的纵坐标
--xend渐变起始点的横坐标
--yend渐变终止点的纵坐标
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/
TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<script>
function draw()
{
	var canvas=document.getElementById("myCanvas");
	var context=canvas.getContext("2d");
	//为矩形添加渐变效果
	//调用reateLinearGradient方法时,
	//将创建一个使用起点坐标及终点坐标的LinearGradient对象,
	//为该对象设置渐变颜色及渐变度的方法应用格式
	//addColorStop(offset,color)
	//--offset表示颜色从离开渐变起始点开始变化的偏移量
	//--color渐变使用的颜色
	var mylinear=context.createLinearGradient(0,0, 150,50);// 创建一个线性渐变对象
	mylinear.addColorStop(0,"red"); //设置第一阶段颜色
	mylinear.addColorStop(0.8,"yellow"); //设置第二阶段颜色
	mylinear.addColorStop(1,"green"); //设置第三阶段颜色
	context.fillStyle=mylinear;
	context.fillRect(0,0,250,150);//绘制矩形
	
	//为文字添加渐变效果
	var linearText=context.createLinearGradient(300,50,600,50);
	linearText.addColorStop(0,"yellow");
	linearText.addColorStop(0.5,"grey");
	linearText.addColorStop(1,"red");
	context.fillStyle=linearText;
	context.font="30px Arial";
	context.textBaseline="top";//文字对齐方式
	context.fillText("HTML5线性渐变文字",300,50);//参数表示文字x,y轴的位置
}
</script>
<fieldset>
<legend>线性渐变</legend>
<canvas id="myCanvas" width="600px" height="200px"> 
</canvas>
<br>
<button onclick="draw()">绘图</button>
</fieldset>
</body>
</html>
![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/718b579e0eae46adb5f7fa0855faad31~tplv-k3u1fbpfcp-watermark.image)

8.径向渐变

creatRadialGradient(xstart,ystart,radiusStart,xEnd,yEnd,radiusEnd)
--xstart渐变开始圆的圆心横坐标
--ystart渐变开始圆的圆心纵坐标
--radiusStart渐变开始圆的半径
--xEnd渐变结束圆的圆心横坐标
--yEnd渐变结束圆的圆心纵坐标
--radiusEnd渐变结束圆的半径
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/
TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<script>
function draw()
{
	var canvas=document.getElementById("myCanvas");
	var context=canvas.getContext("2d");
	fillColorRadial = context.createRadialGradient(150,150,10, 150,150,200);
	fillColorRadial.addColorStop(0, "red"); // 设置第一阶段颜色
	fillColorRadial.addColorStop(0.2, "yellow"); //设置第二阶段颜色
	fillColorRadial.addColorStop(0.4, "black"); // 设置第三阶段颜色
	context.fillStyle = fillColorRadial; // 填充样式
	context.rect(0,0,300,300); // 绘制矩形
	context.fill();
}
</script>
<fieldset>
<legend>线性渐变</legend>
<canvas id="myCanvas" width="300px" height="300px"> 
</canvas>
<br>
<button onclick="draw()">绘图</button>
</fieldset>
</body>
</html>

9.坐标平移

translate(x,y)
参数x为沿x轴方向唯一的像素数
参数y为沿着y轴方向位移的像素数
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/
TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<script>
function draw()
{
	var canvas = document.getElementById("myCanvas");
	var context = canvas.getContext("2d");
	context.fillRect(0,0,100,50); //绘制第一个矩形
	context.translate(50,80); //设置坐标平移
	context.fillRect(0,0,100,50); //绘制第二个矩形
}
</script>
<fieldset>
<legend>使用translate设置坐标平移</legend>
<canvas id="myCanvas" width="200px" height="200px"> 
</canvas>
<br>
<button onclick="draw()">绘图</button>
</fieldset>
</body>
</html>

10.坐标放大

scale(x,y)
参数x为沿x轴方向放大倍数
参数y为沿着y轴方向放大倍数
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/
TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<script>
function draw()
{
	var canvas = document.getElementById("myCanvas");
	var context = canvas.getContext("2d");
	context.fillRect(0,0,50,50); //绘制第一个矩形
	context.scale(1.5,2.5); //设置坐标放大
	context.fillRect(60,0,50,50); //绘制第二个矩形
	context.scale(0.5,0.5); //设置坐标缩小
	context.fillRect(280,0,50,50); //绘制第三个矩形
}
</script>
<fieldset>
<legend>使用scale设置坐标放大与缩小</legend>
<canvas id="myCanvas" width="300px" height="200px"> 
</canvas>
<br>
<button onclick="draw()">绘图</button>
</fieldset>
</body>
</html>

11.坐标旋转

rotate(angle)
坐标旋转指的是以原点为中心将图形旋转指定的角度
rotate方法用于设置坐标旋转
当angle为正值时没图形以顺时针方向旋转
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/
TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<script>
function draw()
{
	var canvas = document.getElementById("myCanvas");
	var context = canvas.getContext("2d");
	context.translate(150,150);
	for(var i=0; i<5; i++)
	{
		context.strokeRect(0,0,100,30); //绘制矩形
		context.rotate(Math.PI/10); //设置旋转
	}
}
</script>
<fieldset>
<legend>使用rotate设置坐标旋转</legend>
<canvas id="myCanvas" width="300px" height="300px"> 
</canvas>
<br>
<button onclick="draw()">绘图</button>
</fieldset>
</body>
</html>

11.图形组合处理

当我们的画布中有多个有重叠区域的图形时,
由于绘制顺序的不同,新绘制的图形将覆盖旧的图形
导致重叠部分将永远显示为新绘制图形
如果要自定义多个图形重叠部分的组合方式
以通过修改上下文对象的globalCompositeOperation属性来实现
属性值:source-over:
globalCompositeOperation默认属性值,新绘制图形将覆盖与原图形重叠部分

属性值:copy:
只显示新绘制图形,原图形与新图形重叠部分不显示,原图形中未与新图形重叠部分变成透明

属性值:darker:
重叠部分的两种突袭给都被显示,且新绘制图形与原图形的颜色值相减作为重叠部分的颜色值

属性值:xor:
原图形与绘制图形都显示,两图形重叠部分变为透明


...

12.图形阴影

属性值:shadowOffsetX:
阴影与图形的水平距离,默认值为0
当设置值大于0时阴影向右偏移

属性值:shadowOffsetY:
阴影与图形的垂直距离,默认值为0
当设置值大于0时阴影向上偏移

属性值:shadowColor
阴影颜色值

属性值:shadowBlur
阴影模糊度,默认值为1
设置值越大阴影模糊度越强
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/
TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<script>
function draw()
{
	var canvas = document.getElementById("myCanvas");
	var context = canvas.getContext("2d");
	context.fillStyle = "red"; //设置填充颜色为红色
	context.fillRect(50,50,100,100); //绘制矩形
	context.shadowOffsetX =6; //设置阴影水平偏移量
	context.shadowOffsetY =6; //设置阴影垂直偏移量
	context.shadowColor ="gray"; //设置阴影颜色
	context.shadowBlur=1; //设置阴影模糊度
}
</script>
<fieldset>
<legend>使用图像阴影</legend>
<canvas id="myCanvas" width="200px" height="200px"> 
</canvas>
<br>
<button onclick="draw()">绘图</button>
</fieldset>
</body>
</html>

13.绘制图像

使用drawImage()方法,可以将页面已经存在的<img>元素、<video>元素
或者通过js创建的image对象绘制再画布中
drawImage(image,dx,dy)直接绘制图像
drawImage(image,dx,dy,dw,dh)可绘制缩放图形
drawImage(image,sx,sy,sw,sh,dx,dy,dw,dh)可绘制切割图形

--image:画布引用的图片对象
--dx:图片对象左上角在画布中的横坐标
--dy:图片对象左上角在画布中的纵坐标
--dw:图片对象缩放至画布中的宽度
--dh:图片对象缩放至画布中的高度
--sx:图片对象被绘制部分的横坐标
--sy:图片对象被绘制部分的纵坐标
--sw:图片对象被绘制部分的宽度
--sh:图片对象被绘制部分的高度
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/
TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<script>
function draw(i)
{
	var canvas = document.getElementById("myCanvas");
	var context = canvas.getContext("2d");
	var image = new Image();
	image.src= "li.png";
	image.onload = function()
	{
		if(i==1)
			context.drawImage(image,0,0);
		else if(i==2)
			context.drawImage(image,500,0,200,300);
		else 
			context.drawImage(image,30,30,440,400,700,0,160,180);
	}
}

</script>
<fieldset>
<legend>使用drawImage方法绘制图像</legend>
<canvas id="myCanvas" width="850px" height="600px"> 
</canvas>
<br>
<button onclick="draw(1)">原图</button>
<button onclick="draw(2)">缩放图</button>
<button onclick="draw(3)">切割图</button>
</fieldset>
</body>
</html>

14.图像平铺

createPattern(image,type)
其中参数image为被平铺的图像对象,type表示图像平铺方式

type取值有四种
--no-repeat
--repeat-x
--repeat-y
--repeat
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/
TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<script>
function draw(i)
{
  var canvas = document.getElementById("myCanvas");
  var context = canvas.getContext("2d");
  var image = new Image();
  image.src= "li.png";
  image.onload = function()
  {
      if(i==1)
          context.fillStyle=context.createPattern(image,"repeat-x"); //设置横向平铺
      else if(i==2)
          context.fillStyle=context.createPattern(image,"repeat-y"); //设置纵向平铺
      else 
          context.fillStyle=context.createPattern(image,"repeat"); //设置全向平铺
      context.fillRect(0,0,canvas.width,canvas.height); //填充画布
  }
}
</script>
<fieldset>
<legend>图像平铺</legend>
<canvas id="myCanvas" width="800px" height="500px"> 
</canvas>
<br>
<button onclick="draw(1)">横向平铺</button>
<button onclick="draw(2)">纵向平铺</button>
<button onclick="draw(3)">全向平铺</button>
</fieldset>
</body>
</html>

15.图像剪裁

clip方法用于实现图片剪裁
调用前需要使用路径方式在画布中绘制剪裁区域,
然后才能调用clip方法对指定区域进行剪裁
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/
TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<script type="text/JavaScript">
function draw()
{
	var canvas = document.getElementById("myCanvas");
	var context = canvas.getContext("2d");
	var image = new Image();
	image.src="li.png";
	image.onload = function()
	{
		//绘制一个心形边框用于剪裁对象
		context.translate(250,120);
		var r=0 , a=100 , start = 0 , end= 0;
		context.rotate(Math.PI);
		for(var q=0; q<500; q++){
			start +=  Math.PI * 2 /500;
			end = start + Math.PI * 2 /500;
			r=a * (1-Math.sin(start))+60;  //心形极坐标表示法
			context.arc(0,0,r,start,end,false);
		}
		context.stroke();
		context.clip();	//调用clip方法进行剪裁
		context.drawImage(image,0,0); //绘图
	}
}
</script>
<fieldset>
<legend>图片剪裁</legend>
<canvas id="myCanvas" width="600px" height="400px"> 
</canvas>
<br>
<button onclick="draw()">图像剪裁</button>
</fieldset>
</body>
</html>

16.像素处理

1.getImageData
用于获取指定区域内的像素
2.putImageData
用于将处理后的像素重新绘制在指定区域内

17.绘制文字

fillText(content,dx,dy[,maxlength])
用于在画布中以填充的方式绘制文字
content:文字内容信息
dx:绘制文字开始点的横坐标
dy:绘制文字开始点的纵坐标
maxLength:可选参数,表示绘制文字的最大长度
strokeText(content,dx,dy[,maxlength])
用于在画布中以描边的方式绘制文字
绘制文字相关属性说明
font设置字体、大小、行距等样式
text-align文本对齐方式
textBaseline设置文本相对于起点坐标的位置,可取值topbottom、middle
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/
TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title></title>
</head>
<body>
<script>
function draw()
{
	var canvas = document.getElementById("myCanvas");
	var context = canvas.getContext("2d");
	drawText(context,"bold 40px impact",20,50,"stroke");
	drawText(context,"bold 40px sans ms",50,100,"fill");
}
function drawText(context,font,x,y,fillType)
{
	context.font = font;
	context.textAlign = "left";
	context.textBaseline = "top";
	if (fillType == "fill")
	{	
		context.fillText("HTML5 绘制文字",x,y)
	}
	else
	{
		context.strokeText("HTML5 绘制文字",x,y);
	}
}
</script>
<fieldset>
<legend>绘制文字</legend>
<canvas id="myCanvas" width="400px" height="200px"> 
</canvas>
<br>
<button onclick="draw()">绘图</button>
</fieldset>
</body>
</html>

18.保存、恢复图形

save和restore方法不需要任何参数,直接使用画布上下文对象进行调用即可
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/
TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<script>
var i=0;
function draw()
{
	i++;
	var canvas = document.getElementById("myCanvas");
	var context = canvas.getContext("2d");
	context.clearRect(0,0,400,200); //清空指定区域
	if (i==1) //绘制一个红色填充矩形区域
	{
		context.fillStyle="red";
		context.fillRect(10,10,100,50);
	}
	else if (i==2) //绘制一个黄色填充矩形区域
	{
		context.fillStyle="yellow";
		context.fillRect(30,40,100,50);
	}
	else 
	{
		context.fillRect(50,70,100,50);
	}
}
function save() //保存图形
{
	var canvas = document.getElementById("myCanvas");
	var context = canvas.getContext("2d");
	context.save();
}
function restore() //还原图形
{
	var canvas = document.getElementById("myCanvas");
	var context = canvas.getContext("2d");
	context.restore();
}
</script>
<fieldset>
<legend>绘制文字</legend>
<canvas id="myCanvas" width="400px" height="200px"> 
</canvas>
<br>
<button onclick="draw()">绘图</button>
<button onclick="save()">保存</button>
<button onclick="restore()">还原</button>
</fieldset>
</body>
</html>

19.制作动画

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/
TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<script>
var x=0,y=0;
//绘制矩形,其中矩形的起始点坐标为动态增加
function move() 
{
	var canvas = document.getElementById("myCanvas");
	var context = canvas.getContext("2d");
	context.clearRect(0,0,400,200);
	if (x<400)
	{
		x++;
	}
	if (y<200)
	{
		y++;
	}
	context.fillRect(x,y,50,50);
}
function draw()
{
	var canvas = document.getElementById("myCanvas");
	var context = canvas.getContext("2d");
	context.fillStyle = "red";
	context.fillRect(0,0,50,50);
	setInterval(move,200); //每200毫秒调用move方法一次
}
</script>
<fieldset>
<legend>简单动画效果</legend>
<canvas id="myCanvas" width="400px" height="200px"> 
</canvas>
<br>
<button onclick="draw()">绘图</button>
</fieldset>
</body>
</html>

20.案例:绘制时钟

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/
TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<script type="text/JavaScript"> 
var slen = 70;  //定义秒针长度
var mlen = 65;  //定义分针长度
var hlen = 45;  //定义时针长度
var ls = 0;
var lm = 0;
var lh = 0; 
function draw()
{
	var c = document.getElementById("myCanvas"); 
    var cxt = c.getContext("2d"); 
    cxt.beginPath(); 
    cxt.arc(200, 150, 4, 0, 2 * Math.PI, true); 	//绘制表盘中心
    cxt.fill(); 
    cxt.closePath(); 
    cxt.beginPath(); 
    cxt.arc(200, 150, 100, 0, 2 * Math.PI, true);	//绘制表盘外围
    cxt.stroke(); 
    cxt.closePath(); 
    cxt.beginPath(); 
    cxt.translate(200, 150); 						//平移原点
    cxt.rotate(-Math.PI / 2); 
    cxt.save();        
    for (var i = 0; i < 60; i++) 					//绘制矩形刻度线
		{ 
		if (i % 5 == 0) 
		{ 
			cxt.fillRect(80, 0, 20, 5); 
		} 
		else 
		{ 
			cxt.fillRect(90, 0, 10, 2); 
		} 
		cxt.rotate(Math.PI / 30); 					//每绘制一个刻度线旋转一次
		} 
    cxt.closePath(); 
	setInterval("Refresh();", 1000); //每1秒钟调用refresh方法刷新时针,分针,秒针位置
}
	
function Refresh() 
{ 
	var c = document.getElementById("myCanvas"); 
    var cxt = c.getContext("2d"); 
	cxt.restore(); 
	cxt.save(); 
	cxt.rotate(ls * Math.PI / 30); 
	cxt.clearRect(5, -1, slen+1, 4); 	//清除秒针上次显示内容
	cxt.restore(); 
	cxt.save(); 

	cxt.rotate(lm * Math.PI / 30); 
	cxt.clearRect(5, -1, mlen+1, 5);	//清除分针上次显示内容
	cxt.restore(); 
	cxt.save(); 

	cxt.rotate(lh * Math.PI / 6); 
	cxt.clearRect(5, -3, hlen+1, 6);	//清除时针上次显示内容
	var time = new Date(); 
	var s = ls=time.getSeconds();	//获取当前时间(秒钟)
	var m = lm=time.getMinutes();	//获取当前时间(分钟)
	var h = lh=time.getHours();		//获取当前时间(小时)
	cxt.restore(); 
	cxt.save(); 
	cxt.rotate(s * Math.PI / 30);	//根据当前秒钟数设置分针位置
	cxt.fillRect(5, 0, slen, 2);		//重新绘制秒针
	cxt.restore(); 
	cxt.save(); 
	cxt.rotate(m * Math.PI / 30);	//根据当前分钟数设置分针位置
	cxt.fillRect(5, 0, mlen, 3); 	//重新绘制分针
	cxt.restore(); 
	cxt.save(); 
	cxt.rotate(h * Math.PI / 6); 	//根据当前小时钟数设置分针位置
	cxt.fillRect(5, -2, hlen, 4); 	//重新绘制时针
} 
</script>
<body> 
<fieldset>
	<legend>绘制时钟</legend>
    <canvas id="myCanvas" width="400" height="300"></canvas> 
	<br>
	<button onClick="draw()">绘图</button> 
</fieldset>
</body>
</html>