canvas:画布
canvas : 画布,它是一个标签; 允许脚本(js)动态渲染图形
canvas 的使用
1. html中需要定义一个canvas 标签
<canvas id="mycanvas" height="" width=""></canvas>
注:canvas 的宽高,要通过height,width属性去设置
2. js 中获取canvas,得到canvas 上下文,调用对应的属性和方法
var context = document.getElementById("mycanvas").getContext("2d");
3. canvas 绘制图形
3.1直线
// 绘制直线
function drawLine() {
context.moveTo(0,0) ; //设置起点 x,y
context.lineWidth=5;
context.strokeStyle="red";
//直线中的点
context.lineTo(500,300);
// 结束
context.stroke();
}
3.2添加折点:
function drawLine() {
context.moveTo(0,0);
context.lineWidth=5;
context.strokeStyle="red";
//直线中的点
context.lineTo(500,300);
// 结束
context.stroke();
// 新开始路径 context.restore恢复到上一次保存
context.beginPath();
context.moveTo(200,200);
context.lineTo(500,300);
context.lineWidth=5;
context.strokeStyle="green";
context.stroke();
}
3.3矩形 :
// 画矩形
function drawRect() {
//边框线
context.strokeStyle="red";
context.lineWidth=2;
//坐标(x,y)宽高
context.strokeRect(50,50,100,50);
//填充
context.fillStyle="green";
//调用填充的方法 坐标(x,y)宽高
context.fillRect(50,50,100,50);
}
3.4弧度
//画弧度
function drawArc() {
// arc 参数
/*
* 1, 圆心x 坐标 2,圆心y坐标 , 3.半径 4.开始的弧度 5.结束的弧度
* 6. 绘制方向,true:逆时针,false:顺时针
*
* 注:角度和弧度的转换公式
* 角度 = 弧度 * Math.PI /180
* */
context.arc(100,100,50,0,360*Math.PI/180,true);
context.stroke();
}
4. 图形的变换
context.translate(x,y); //平移
context.scale(x,y); //放大
context.rotate(x,y); //旋转
画布旋转
function roate() {
context.moveTo(0,0);
context.lineTo(100,0);
context.lineWidth=5;
context.stroke();
context.beginPath();
context.rotate(30*Math.PI/180);
context.moveTo(0,0);
context.lineTo(100,0);
context.lineWidth=5;
context.stroke();
}
canvas 原理:
双缓冲画布,一个用于显示给用户,一个内存中使用的,绘制图像时,都以内存画布为准,进行绘制
//画时钟:
context.beginPath();
context.closePath();
context.restore(); //重复到上一次在保存
context.save()
context.clearRect();
- canvas 绘制图像
//绘制图像
//刷新后出现图像
function drawImage() {
// 参数:context.drawImage(img,x,y)
// 参数:context.drawImage(img,x,y,height,width); 指定要绘制图像的宽高
context.drawImage(img,0,0,50,50);
}
context.drawImage(img,x,y); //img:图片对象 x: x坐标,y
context.drawImage(img,x,y,width,height);
//img:图片对象 x: x坐标,y ,width:宽度, height:高
context.drawImage(img,cut_x,cut_y,cut_width,cut_height , draw_x,draw_y,draw_width,draw_heigth);
- canvas vs svg(矢量)
Canvas 和 SVG 都允许您在浏览器中创建图形,但是它们在根本上是不同的
SVG
SVG 是一种使用 XML 描述 2D 图形的语言。
SVG 基于 XML,这意味着 SVG DOM 中的每个元素都是可用的。您可以为某个元素附加 JavaScript 事件处理器。
在 SVG 中,每个被绘制的图形均被视为对象。如果 SVG 对象的属性发生变化,那么浏览器能够自动重现图形。
Canvas
Canvas 通过 JavaScript 来绘制 2D 图形。
Canvas 是逐像素进行渲染的。
在 canvas 中,一旦图形被绘制完成,它就不会继续得到浏览器的关注。如果其位置发生变化,那么整个场景也需要重新绘制,包括任何或许已被图形覆盖的对象。
Canvas
1.依赖分辨率
2.不支持事件处理器
3.弱的文本渲染能力
4.能够以 .png或 .jpg 格式保存结果图像
5.最适合图像密集型的游戏,其中的许
多对象会被频繁重绘
SVG
1.不依赖分辨率
2.支持事件处理器
3.最适合带有大型渲染区域的应用程序(比如谷歌地图)
4.复杂度高会减慢渲染速度(任何过度使用 DOM 的应用都不快)
5.不适合游戏应用
代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
canvas{
border: 1px red solid;
}
</style>
</head>
<body>
<!--canvas的宽高只能在标签中设置-->
<canvas id="myCanvas" height="300" width="500">
</canvas>
<img src="img/11.png" alt="" id="img" style="display: none">
<script type="text/javascript">
let myCanvas = document.getElementById("myCanvas");
// 得到cancas的上下文,调用对应属性和方法
let context = myCanvas.getContext("2d");
let img = document.getElementById("img");
//调用绘制函数
// drawLine();
// drawJuXing();
// drawYuan();
roate();
// drawImage();
// context.clearRect(x,y,h,w);清除矩形
//通过canvas画线(绘制图形)
// 绘制直线
function drawLine() {
context.moveTo(0,0);
context.lineWidth=5;
context.strokeStyle="red";
//直线中的点
context.lineTo(200,200);
// 结束
context.stroke();
// 新开始路径 context.restore恢复到上一次保存
context.beginPath();
context.moveTo(200,200);
context.lineTo(500,300);
context.lineWidth=5;
context.strokeStyle="green";
context.stroke();
}
//绘制矩形
function drawJuXing() {
//边框线
context.strokeStyle="red";
context.lineWidth=2;
//坐标(x,y)宽高
context.strokeRect(50,50,100,50);
//填充
context.fillStyle="green";
//调用填充的方法 坐标(x,y)宽高
context.fillRect(50,50,100,50);
}
// 绘制圆形(有弧度的)
function drawYuan() {
/*arc(圆心的x坐标,圆心的y坐标,半径,开始的弧度,结束的弧度,
顺时针还是逆时针(true为逆时针,false为顺时针))
角度和弧度的转换:角度=弧度*Math.PI/180
*/
context.arc(100,100,50,0,360*Math.PI/180,true);
context.stroke();
}
//画布旋转
//canvas双缓冲画布,一个给用户看,一个在内存中使用,绘制图像时,都以内存画布为准
function roate() {
context.moveTo(0,0);
context.lineTo(100,0);
context.lineWidth=5;
context.stroke();
context.beginPath();
context.rotate(30*Math.PI/180);
context.moveTo(0,0);
context.lineTo(100,0);
context.lineWidth=5;
context.stroke();
}
//绘制图像
//刷新后出现图像
function drawImage() {
// 参数:context.drawImage(img,x,y)
// 参数:context.drawImage(img,x,y,height,width); 指定要绘制图像的宽高
context.drawImage(img,0,0,50,50);
}
</script>
</body>
</html>