html5中的canvas标签

12 篇文章 1 订阅

个人blog,欢迎关注加收藏

canvas基本用法

  1. 什么是canvas(画布)
  • <canvas>是 HTML5 新增的元素,可用于通过使用JavaScript中的脚本来绘制图形
    例如,它可以用于绘制图形,创建动画。<canvas>最早由Apple引入WebKit
    我们可以使用<canvas>标签来定义一个canvas元素
    ----->使用<canvas>标签时,建议要成对出现,不要使用闭合的形式。
    ----->canvas元素默认具有高宽
    width: 300px
    height:150px
  1. 替换内容
  • <canvas>很容易定义一些替代内容。由于某些较老的浏览器(尤其是IE9之前的IE浏览器)
    不支持HTML元素"canvas",
    但在这些浏览器上你应该要给用户展示些替代内容。
    这非常简单:我们只需要在<canvas>标签中提供替换内容就可以。
    —>支持<canvas>的浏览器将会忽略在容器中包含的内容,并且只是正常渲染canvas。
    —>不支持<canvas>的浏览器会显示代替内容
<!-- 浏览器支持canvas则不显示span标签内容,不支持canvas则显示span标签内容 -->
<canvas id="test" width="300" height="300">
	<span>您的浏览器不支持画布元素 请您换成萌萌的谷歌</span>
</canvas>
		
  1. canvas标签的两个属性
    <canvas> 看起来和 <img>元素很相像,唯一的不同就是它并没有 src 和 alt 属性。
    实际上,<canvas> 标签只有两个属性—— width和height。这些都是可选的。
    当没有设置宽度和高度的时候,canvas会初始化宽度为300像素和高度为150像素。
    画布的高宽
    html属性设置width height时只影响画布本身不影画布内容
    css属性设置width height时不但会影响画布本身的高宽,还会使画布中的内容等比例缩放(缩放参照于画布默认的尺寸)

  2. 渲染上下文
    <canvas>元素只是创造了一个固定大小的画布,要想在它上面去绘制内容,
    我们需要找到它的渲染上下文
    <canvas>元素有一个叫做 getContext() 的方法,这个方法是用来获得渲染上下文(画笔)和它的绘画功能。

getContext()只有一个参数,上下文的格式
	----->获取方式
		  var canvas = document.getElementById('box');
		  var ctx = canvas.getContext('2d');
		  
	----->检查支持性
		  var canvas = document.getElementById('tutorial');
		  if (canvas.getContext){//判断是否支持canvas,存在画笔
				var ctx = canvas.getContext('2d');
			} 

canvas绘制矩形

HTML中的元素canvas只支持一种原生的图形绘制:矩形。所有其他的图形的绘制都至少需要生成一条路径
  1. 绘制矩形
    canvas提供了三种方法绘制矩形:
    ---->绘制一个填充的矩形(填充色默认为黑色)
    fillRect(x, y, width, height):x轴偏移量,y轴偏移量,宽,高,不用加px作为单位
    ---->绘制一个矩形的边框(空心矩形)(默认边框为:一像素实心黑色)
    strokeRect(x, y, width, height):x轴偏移量,y轴偏移量,宽,高,不用加px作为单位
    ---->清除指定矩形区域(填充矩形,填充色为底色),让清除部分完全透明。
    clearRect(x, y, width, height):x轴偏移量,y轴偏移量,宽,高,不用加px作为单位

    x与y指定了在canvas画布上所绘制的矩形的左上角(相对于原点)的坐标。
    width和height设置矩形的尺寸。(存在边框的话,边框会在width上占据一个边框的宽度,height同理)

  2. strokeRect时,边框像素渲染问题
    按理渲染出的边框应该是1px的,
    canvas在渲染矩形边框时,边框宽度是平均分在偏移位置的两侧。
    context.strokeRect(10,10,50,50)
    :边框会渲染在10.5 和 9.5之间,浏览器是不会让一个像素只用自己的一半的
    相当于边框会渲染在9到11之间
    context.strokeRect(10.5,10.5,50,50)
    :边框会渲染在10到11之间

  3. 添加样式和颜色

    • fillStyle :设置图形的填充颜色。
    • strokeStyle :设置图形轮廓的颜色。
      默认情况下,线条和填充颜色都是黑色(CSS 颜色值 #000000)
    • lineWidth : 这个属性设置当前绘线的粗细。属性值必须为正数。描述线段宽度的数字。 0、 负数、 Infinity 和 NaN 会被忽略。默认值是1.0。
  4. lineWidth & 覆盖渲染

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			*{
				margin: 0;
				padding: 0;
			}
			html,body{
				height: 100%;
				overflow: hidden;
			}
			body{
				background: pink;
			}
			#test{
				background: gray;
				position: absolute;
				left: 0;
				top: 0;
				right: 0;
				bottom: 0;
				margin: auto;
			}
		</style>
	</head>
	<body>
		<canvas id="test" width="300" height="300">
			<span>您的浏览器不支持画布元素 请您换成萌萌的谷歌</span>
		</canvas>
	</body>
	<script type="text/javascript">
//		同步思维  有别于浏览器本身的渲染机制:浏览器渲染模式,由于js解析非常快,解析速度远大于渲染速度,所以js操作渲染样式的代码位置放在渲染前后都无所谓,但canvas解析和渲染是同时的,在渲染之前必须先告诉渲染样式
		window.onload=function(){
			//拿到画布
			var canvas = document.querySelector("#test");
			if(canvas.getContext){
				var ctx = canvas.getContext("2d");
				
				//在canvas渲染极快,所以渲染前要先告诉canvas渲染的方式,比如颜色,粗细等等,canvas才能按你指定的渲染方式进行渲染
				ctx.fillStyle="deeppink";//填充颜色
				ctx.strokeStyle="pink";//线条颜色
				ctx.lineWidth=25;//线条粗细
				ctx.lineJoin="round";//设定线条与线条间接合处的样式(默认是 miter)round : 圆角 ,bevel : 斜角,miter : 直角
				
				//注意不加单位
				//填充的矩形
				
				//带边框的矩形  
				// 100	: 99.5 --- 100.5(99-101)
				// 100.5: 100  --- 101 
				
				ctx.strokeRect(100,100,100,100)
				ctx.fillRect(0,0,100,100)
//				ctx.clearRect(100,100,100,100)
				
				
				
			}
		}
		
		
	</script>
</html>

  1. lineJoin
    设定线条与线条间接合处的样式(默认是 miter)
    round : 圆角
    bevel : 斜角
    miter : 直角

canvas绘制路径

图形的基本元素是路径。路径是通过不同颜色和宽度的线段或曲线相连形成的不同形状的点的集合。
步骤
  1. 首先,你需要创建路径起始点。
  2. 然后你使用画图命令去画出路径
  3. 之后你把路径封闭。
  4. 一旦路径生成,你就能通过描边或填充路径区域来渲染图形。
    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="UTF-8">
    		<title></title>
    		<style type="text/css">
    			*{
    				margin: 0;
    				padding: 0;
    			}
    			html,body{
    				height: 100%;
    				overflow: hidden;
    			}
    			body{
    				background: pink;
    			}
    			#test{
    				background: gray;
    				position: absolute;
    				left: 0;
    				top: 0;
    				right: 0;
    				bottom: 0;
    				margin: auto;
    			}
    		</style>
    	</head>
    	<body>
    		<canvas id="test" width="300" height="300">
    			<span>您的浏览器不支持画布元素 请您换成萌萌的谷歌</span>
    		</canvas>
    	</body>
    	<script type="text/javascript">
    		window.onload=function(){
    			//querySelector身上有坑
    			//拿到画布
    			var canvas = document.querySelector("#test");
    			if(canvas.getContext){
    				var ctx = canvas.getContext("2d");
    				
    				ctx.strokeStyle="deeppink";//线颜色
    				ctx.lineWidth=10;//线宽
    				
    				ctx.moveTo(100,100);//起点
    				ctx.lineTo(100,200);//线条路径至的终点
    				ctx.lineTo(200,200);//线条路径至的终点
    				//ctx.closePath();//闭合路径
    				//ctx.stroke();//线条描绘
    				
    				
    
    				//fill方法会自动合并路径
    				ctx.fill();//填充描绘
    				
    			}
    		}
    		
    		
    	</script>
    </html>
    
    
绘制三角形
  1. beginPath()
    新建一条路径,生成之后,图形绘制命令被指向到路径上准备生成路径。---->多条路径时,是必须的!!!

    生成路径的第一步叫做beginPath()。本质上,路径是由很多子路径构成,这些子路径都是在一个列表中,
    所有的子路径(线、弧形、等等)构成图形。而每次这个方法调用之后,列表清空重置,
    然后我们就可以重新绘制新的图形。

  2. moveTo(x, y)
    将笔触移动到指定的坐标x以及y上(抬起画笔)
    当canvas初始化或者beginPath()调用后,你通常会使用moveTo()函数设置起点

  3. lineTo(x, y)
    将笔触移动到指定的坐标x以及y上
    绘制一条从当前位置到指定x以及y位置的直线

  4. closePath()
    闭合路径之后图形绘制命令又重新指向到上下文中。
    闭合路径closePath(),不是必需的。这个方法会通过绘制一条从当前点到开始点的直线来闭合图形。
    如果图形是已经闭合了的,即当前点为开始点,该函数什么也不做
    当你调用fill()函数时,所有没有闭合的形状都会自动闭合,所以你不需要调用closePath()函数。
    但是调用stroke()时不会自动闭合

  5. stroke()
    通过线条来绘制图形轮廓。
    不会自动调用closePath()

  6. fill()
    通过填充路径的内容区域生成实心的图形。
    自动调用closePath()

绘制矩形
  1. rect(x, y, width, height)
    绘制一个左上角坐标为(x,y),宽高为width以及height的矩形。
    当该方法执行的时候,moveTo()方法自动设置坐标参数(0,0)。
    也就是说,当前笔触自动重置会默认坐标
方法一:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			*{
				margin: 0;
				padding: 0;
			}
			html,body{
				height: 100%;
				overflow: hidden;
			}
			body{
				background: pink;
			}
			#test{
				background: gray;
				position: absolute;
				left: 0;
				top: 0;
				right: 0;
				bottom: 0;
				margin: auto;
			}
		</style>
	</head>
	<body>
		<canvas id="test" width="300" height="300">
			<span>您的浏览器不支持画布元素 请您换成萌萌的谷歌</span>
		</canvas>
	</body>
	<script type="text/javascript">
		window.onload=function(){
			//querySelector身上有坑
			//拿到画布
			var canvas = document.querySelector("#test");
			if(canvas.getContext){
				var ctx = canvas.getContext("2d");
				ctx.rect(50,50,100,100);
//				ctx.fill();
				ctx.stroke();
			}
		}
		
		
	</script>
</html>

方法二:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			*{
				margin: 0;
				padding: 0;
			}
			html,body{
				height: 100%;
				overflow: hidden;
			}
			body{
				background: pink;
			}
			#test{
				background: gray;
				position: absolute;
				left: 0;
				top: 0;
				right: 0;
				bottom: 0;
				margin: auto;
			}
		</style>
	</head>
	<body>
		<canvas id="test" width="300" height="300">
			<span>您的浏览器不支持画布元素 请您换成萌萌的谷歌</span>
		</canvas>
	</body>
	<script type="text/javascript">
//		同步思维  有别于浏览器本身的渲染机制
		window.onload=function(){
			//querySelector身上有坑
			//拿到画布
			var canvas = document.querySelector("#test");
			if(canvas.getContext){
				var ctx = canvas.getContext("2d");
				
				ctx.fillStyle="deeppink";
				ctx.strokeStyle="pink";
				ctx.lineWidth=25;
				ctx.lineJoin="round";
				
				//注意不加单位
				//填充的矩形
				
				//带边框的矩形  
				// 100	: 99.5 --- 100.5(99-101)
				// 100.5: 100  --- 101 
				
				ctx.strokeRect(100,100,100,100)
				ctx.fillRect(0,0,100,100)
//				ctx.clearRect(100,100,100,100)
				
				
				
			}
		}
		
		
	</script>
</html>

lineCap
  1. lineCap 是 Canvas 2D API 指定如何绘制每一条线段末端的属性
    有3个可能的值,分别是:
    butt :线段末端以方形结束。
    round :线段末端以圆形结束
    square:线段末端以方形结束,但是增加了一个宽度和线段相同,高度是线段厚度一半的矩形区域
    默认值是 butt。
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			*{
				margin: 0;
				padding: 0;
			}
			html,body{
				height: 100%;
				overflow: hidden;
			}
			body{
				background: pink;
			}
			#test{
				background: gray;
				position: absolute;
				left: 0;
				top: 0;
				right: 0;
				bottom: 0;
				margin: auto;
			}
		</style>
	</head>
	<body>
		<canvas id="test" width="300" height="300">
			<span>您的浏览器不支持画布元素 请您换成萌萌的谷歌</span>
		</canvas>
	</body>
	<script type="text/javascript">
		window.onload=function(){
			//querySelector身上有坑
			//拿到画布
			var canvas = document.querySelector("#test");
			if(canvas.getContext){
				var ctx = canvas.getContext("2d");
				
				ctx.strokeStyle="pink";
				ctx.lineWidth=10;
				ctx.lineCap="round";//线的两端都是圆形的
				
				ctx.moveTo(100,100);
				ctx.lineTo(100,200);
				ctx.stroke();
				
			}
		}
		
		
	</script>
</html>

save:入栈,样式容器
  1. save() 是 Canvas 2D API 通过将当前状态放入栈中,保存 canvas 全部状态的方法:将当前的样式保存进入栈结构

    保存到栈中的绘制状态有下面部分组成:
    当前的变换矩阵。
    当前的剪切区域。
    当前的虚线列表.
    以下属性当前的值:
    strokeStyle,
    fillStyle,
    lineWidth,
    lineCap,
    lineJoin…

restore:弹栈,样式容器
  1. restore() 是 Canvas 2D API 通过在绘图状态栈中弹出顶端的状态,将 canvas 恢复到最近的保存状态的方法。
    如果没有保存状态,此方法不做任何改变。
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			*{
				margin: 0;
				padding: 0;
			}
			html,body{
				height: 100%;
				overflow: hidden;
			}
			body{
				background: pink;
			}
			#test{
				background: gray;
				position: absolute;
				left: 0;
				top: 0;
				right: 0;
				bottom: 0;
				margin: auto;
			}
		</style>
	</head>
	<body>
		<canvas id="test" width="300" height="300">
			<span>您的浏览器不支持画布元素 请您换成萌萌的谷歌</span>
		</canvas>
	</body>
	<script type="text/javascript">
		window.onload=function(){
			/*
			1.路径容器
				每次调用路径api时,都会往路径容器里做登记
				调用beginPath时,清空整个路径容器
			2.样式容器
				每次调用样式api时,都会往样式容器里做登记
				调用save时候,将样式容器里的状态压入样式栈
				调用restor时候,将样式栈的栈顶状态弹出到样式样式容器里,进行覆盖
			3.样式栈
				调用save时候,将样式容器里的状态压入样式栈
				调用restor时候,将样式栈的栈顶状态弹出到样式样式容器里,进行覆盖
			*/
			
			var canvas = document.querySelector("#test");
			if(canvas.getContext){
				var ctx = canvas.getContext("2d");
				
				ctx.save();
				//关于样式的设置
				//save  restore成对出现
				ctx.beginPath();
				//关于路径
				ctx.restore();
				
				
				ctx.save();
				//关于样式的设置
				ctx.beginPath();
				//关于路径
				
				ctx.fill();
				ctx.restore();
			}
		}
		
		
	</script>
</html>

签名
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			*{
				margin: 0;
				padding: 0;
			}
			body{
				background: gray;
			}
			#test{
				position: absolute;
				left: 0;
				right: 0;
				top: 0;
				bottom: 0;
				margin: auto;
				background:white;
			}
		</style>
	</head>
	<body>
		<canvas id="test" width="500" height="500"></canvas>
	</body>
	<script type="text/javascript">
		
		window.onload=function(){
			
			var canvas =document.getElementById("test");
			if(canvas.getContext){
				var ctx = canvas.getContext("2d");
			}
			//鼠标落下
			canvas.onmousedown=function(ev){
				ev = ev || window.event;
				//兼容IE6及以下浏览器
				if(canvas.setCapture){
					canvas.setCapture();
				}
				//开始画图
				ctx.beginPath();
				//抬起画笔,且画笔以canvas的左上角的点为坐标点起始点
				ctx.moveTo(ev.clientX -canvas.offsetLeft,ev.clientY -canvas.offsetTop);
				
				//鼠标移动
				document.onmousemove=function(ev){
					ctx.save();//保存初始状态
					ctx.strokeStyle="pink";
					ev = ev || event;
					ctx.lineTo(ev.clientX -canvas.offsetLeft,ev.clientY -canvas.offsetTop);//签名即划线,画到鼠标移动的位置,此位置也是以canvas的左上角的点为坐标点起始点
					ctx.stroke();//划线
					ctx.restore();//清除样式,返回初始状态样式,这里即清除pink的线颜色
				}
				//鼠标抬起
				document.onmouseup=function(){
					document.onmousemove=document.onmouseup=null;
					if(document.releaseCapture){
						document.releaseCapture();
					}
				}
				return false;
			}
			
		}
		
	</script>
</html>

曲线
角度与弧度的js表达式:radians=(Math.PI*degrees)/180。
canvas绘制圆形

度数范围
arc(x, y, radius, startAngle, endAngle, anticlockwise):圆
画一个以(x,y)为圆心的以radius为半径的圆弧(圆),从startAngle(起始弧度)开始到endAngle(终止弧度)结束,
按照anticlockwise给定的方向(默认为顺时针)来生成。
ture:逆时针
false:顺时针

	x,y为绘制圆弧所在圆上的圆心坐标
	radius为半径
	startAngle以及endAngle参数用弧度定义了开始以及结束的弧度。这些都是以x轴为基准
	参数anticlockwise 为一个布尔值。为true时,是逆时针方向,否则顺时针方向。
arcTo:圆弧
arcTo(x1, y1, x2, y2, radius)
根据给定的控制点和半径画一段圆弧
肯定会从(x1 y1)  但不一定经过(x2 y2);(x2 y2)只是控制一个方向
1. 必须用moveTo确定第一个点
2. 实际是以三个点确定一个角度,以半径画圆,推进,形成圆弧

在这里插入图片描述

贝塞尔
二次贝塞尔
quadraticCurveTo(cp1x, cp1y, x, y)
	绘制二次贝塞尔曲线,cp1x,cp1y为一个控制点,x,y为结束点。
	1. 起始点为moveto时指定的点
	2. 不需要指定半径
	3. 圆弧必过moveTo指定的起始点和终止点

在这里插入图片描述

三次贝塞尔
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
	绘制三次贝塞尔曲线,cp1x,cp1y为控制点一,cp2x,cp2y为控制点二,x,y为结束点。
	1. 起始点为moveto时指定的点
	2. 不需要指定半径
	3. 圆弧必过moveTo指定的起始点和终止点

在这里插入图片描述

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值