Canvas画布从彩虹到千万方块(上)

407 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天, 点击查看活动详情

HTML5新增canvas元素,与其他传统div元素对应页面块区域不同,它提供画布容器区域,让我们操作粒度聚焦到像素点,必须通过写JS代码来驱动画图,同时它有有一套自己独立的尺寸单位,如下代码我们canvas画布宽300,高200。

<div></div>

<canvas width="300" height="200"></canvas>

接下来我们通过JS来获取canvas元素的2d绘图环境,并且分别绘制描边和填充正方形。

图片.png

我们知道绘制一个矩形,需要一个点坐标(x,y)和 宽高,即
c2d.fillRect(x坐标,y坐标,宽度,高度)

//获取canvas的2d绘图环境
let c2d = document.querySelector('canvas').getContext('2d')
let w = 50
let h = 50
c2d.fillRect(0,0,w,h);		//绘制填充矩形
c2d.strokeRect(25,25,w,h);	//绘制描边矩形

一、canvas的 坐标系统

图片.png 如上图设置一个canvas width="600" height="400"并增加一个背景样式, 我们根据尺寸画出标尺。我们可以知道:
1.画图容器尺寸左上角坐标为(0,0)
2.整个坐标系 x轴向右为正,y向下为正
3.在容器外的元素坐标通常为负值,我们只能看到容器所在区域的绘图效果

<style>
	canvas{background-color: pink;}
</style>
<canvas width="600" height="400"></canvas>

二、canvas的动画主循环

我们将在页面上多绘制几个正方形,并修改它们的x,y坐标, 如果我们把这个方框当作同一个,那么下图不就是他随着时间运动轨迹。
所以我们要实现动画运动效果,就是通过定时器不断地修改它的x,y坐标,再重新绘制

图片.png

我们需要一个主循环函数,每秒执行60次,也就是60FPS,这是不是像游戏。 我们可以使用setInterval()设置定时器,但更好的是用浏览器自带的 window.requestAnimationFrame

animate();//循环动画函数 
function animate(t){
	//TO DO重复执行的绘图部分  
	//...

	requestAnimationFrame(animate);//每隔16.67ms去调用,即每秒绘制60次
}

我们将需要放在动画主循环的代码写入,每次修改方块的位置下x,y
因为x,y都同步+1,所以和速度的方向是45°右下,速度的向量合成😊

x+=1;
y+=1;
c2d.strokeRect(x,y,w,h); 

3.gif

好了,到这里恭喜你入门canvas开发。
那么根据以下案例代码,在本地改写为requestAnimationFrame,实现一个X彩虹效果。

图片.png

下节预告:Canvas画布从彩虹到千万方块(下)

31.gif