用canvas绘制一个饼状图...

Canvas,网页原来是可以画出来的...


  1. 认识Canvas
  2. Canvas绘制矩形
  3. Canvas绘制圆形
  4. 使用moveTo()和lineTo()绘制路径
  5. Canvas绘制一个饼状图

 

认识Canvas


canvas是HTML5中新增的一个元素,专门用来绘制图形。在页面放置一个canvas元素,就相当于放置了一个画布,可以在其中进行图形的绘制。但绘制图形,并不是指使用鼠标作画,而是需要javascript进行配合。创建canvas的时候,他默认的宽高为300px*150px。

<canvas id="canvas">我是一个画布</canvas>

​​​Canvas绘制矩形


我们在HTML页面中直接插入canvas标签,也可以对它设置宽度和高度,切记设置canvas的时候不可以利用css样式进行设置。那么,我们想在canvas上面画出矩形,我们就需要认识以下几种api。

方法描述
getContext()获取绘图环境,可选参数"2d"
fillRect(x,y,width,height)绘制一个填充的矩形
strokeRect(x,y,width,height)绘制一个矩形的边框
clearRect(x,y,width,height)清除指定矩形区域。
<script>
    var canvas = document.getElementById("canvas")
    var ctx = canvas.getContext("2d")//获取绘制图片的"2d"环境
    ctx.fillRect(50,50,100,100)//绘制填充的"黑色"的矩形
    ctx.strokeRect(50,50,100,100)//绘制一个"黑色"矩形的边框
    ctx.clearRect(50,50,10,10)//清除"x=50,y=50,宽度为10,高度为10的区域"
</script>

但有些时候,我们希望能够修改矩形的样式,又不可以直接通过修改css方式来修改。那么在canvas中也提供了api为我们来修改样式。

方法描述
fillStyle填充背景颜色
strokeStyle设置边框颜色
lineWidth设置边框的宽度
<script>
    var canvas = document.getElementById("canvas")
    var ctx = canvas.getContext("2d")//获取绘制图片的"2d"环境
    ctx.fillStyle = "red"//绘制填充的"红色"的矩形
    ctx.strokeStyle = "red"//绘制边框的"红色"的矩形
    ctx.lineWidth = "10"//设置边框宽度
</script>

Canvas绘制圆形


绘制圆形,canvas也为我们提供了arc这个方法:

ctx.arc(x,y,radius,startAngle,endAngle,anticlockwise)

该方法有6个参数,x为绘制圆形的起点横坐标,y表示绘制圆形的起点的纵坐标,radius表示圆的半径,startAngle为开始角度,endAngle为结束的角度, anticlockwise是否按照顺时针方向进行绘制。false表示顺时针。(默认为顺时针)。

<script>
	var canvas = document.getElementById("canvas")
	var ctx = canvas.getContext("2d")//获取绘制图片的"2d"环境
	ctx.beginPath()
	ctx.arc(100,100,50,0,90*Math.PI/180,false)
	ctx.stroke()
	ctx.closePath()
</script>

 其中有个弧度转换的公式:degreens*Math.PI/180绘制圆形默认按照以下的位置进行切换。

使用moveTo()和lineTo()绘制路径

我们可以使用moveTo()和lineTo()绘制直线,或者是自己想要的图形,不局限于矩形。

方法描述
moveTo(x,y)不绘制,只是将当前位置移动到新的目标点
lineTo(x,y)不仅将当前位置移动到新的目标点(x,y),而且在两个坐标之间画一条直线。
linejoin设置两线段连接处所显示的样子。round,bevel,miter
lineCap线段端点显示的样式
save保存绘画路径
restore销毁路径

注意:我们使用两个方法的时候,要注意使用closePath()闭合。因为它会通知canvas当前绘制的图形已经闭合或者形成了完全封闭。(linejoin)

用Canvas绘制一个饼状图

那么重点来了,如何用Canvas绘制一个饼状图呢?下面是我的代码,带注释。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style>
			body{
				background: black;
			}
			canvas{
				background: #fff;
			}
		</style>
	</head>
	<body>
		<canvas id="canvas" width="400" height="400"></canvas>//创建画布
		<script>
			var ctx = document.getElementById("canvas")
			var oC = ctx.getContext("2d")//获取绘制图片环境
			
			oC.beginPath()//开始绘制路径
			oC.moveTo(100,100)//不绘制,只是将当前位置移动到新的目标点
			oC.arc(100,100,60,-90*Math.PI/180,45*Math.PI/180);//红色圆弧的角度
			//该方法有6个参数,x为绘制圆形的起点横坐标,y表示绘制圆形的起点的纵坐标,
			//radius表示圆的半径,startAngle为开始角度,endAngle为结束的角度, 
			//anticlockwise是否按照顺时针方向进行绘制。false表示顺时针。(默认为顺时针)。
			oC.closePath()//关闭路径
			oC.stroke()//实际地绘制出通过 moveTo() 和 lineTo() 方法定义的路径
			oC.fillStyle = "red"//填充背景颜色
			oC.fill()//填充颜色
			
			oC.beginPath()
			oC.moveTo(100,100)
			oC.arc(100,100,60,45*Math.PI/180,160*Math.PI/180);//绿色圆弧的角度
			oC.closePath()
			oC.stroke()
			oC.fillStyle = "green"
			oC.fill()
			
			oC.beginPath()
			oC.moveTo(100,100)
			oC.arc(100,100,60,160*Math.PI/180,-90*Math.PI/180);//蓝色圆弧的角度
			oC.closePath()
			oC.stroke()
			oC.fillStyle = "blue"
			oC.fill()
		</script>
<!--<script>
    var canvas = document.getElementById("canvas")
    var ctx = canvas.getContext("2d")//获取绘制图片的"2d"环境
    ctx.fillRect(50,50,100,100)//绘制填充的"黑色"的矩形
    ctx.strokeRect(50,50,100,100)//绘制一个"黑色"矩形的边框
    ctx.clearRect(50,50,10,10)//清除"x=50,y=50,宽度为10,高度为10的区域"
</script>
<script>
	 ctx.fillStyle = "red"//绘制填充的"红色"的矩形
    ctx.strokeStyle = "red"//绘制边框的"红色"的矩形
	ctx.lineWidth = "10"//设置边框宽度
</script>
<script>
	var canvas = document.getElementById("canvas")
	var ctx = canvas.getContext("2d")//获取绘制图片的"2d"环境
	ctx.beginPath()
	ctx.arc(100,100,50,0,90*Math.PI/180,false)
	ctx.stroke()
	ctx.closePath()
</script>-->
	</body>
</html>

下面是效果图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值