兼容性
IE9以后才支持canvas,其它的兼容性还好
基本的使用
- canvas身上的属性 width/height
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<canvas width="300" height="150"></canvas>
</body>
</html>
画矩形
- 画矩形 三种情况 填充满的矩形/只有轮廓的矩形/透明矩形
-
- 填充矩形
- fillRect
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#canvas {
border: 1px solid #000;
}
</style>
</head>
<body>
<canvas id="canvas" width="300" height="150"></canvas>
<script>
// 获取canvas元素
var canvas = document.getElementById("canvas");
// 获取渲染上下文 getContext
var ctx = canvas.getContext("2d");//也可以称之为画笔
//2d类型的上下文 webgl就是3d 接口就是 WebGLRenderingContext
/*
canvas grid(画布栅格) 概念
(0, 0)----------------> X
|
|
\|
y
原点: (0, 0) -> 坐标的概念
canvas只支持一种原生图形的绘制 -> 矩形
其它的图像都是线段组合出来的
*/
// 案例1: 画矩形 三种情况 填充满的矩形/只有轮廓的矩形/透明矩形
// 1.橙色矩形
// 2. 定义画笔颜色
ctx.fillStyle = "orange";
/*
fillRect的四个参数:
x: 落笔的横坐标
y: 落笔的纵坐标
width: 宽
height: 高
*/
//填充
ctx.fillRect(50, 50, 100, 100);
</script>
</body>
</html>
- 2. 在上面的基础上画出镂空的矩形
- clearRect
<canvas id="canvas" width="300" height="150"></canvas>
<script>
// 获取canvas元素
var canvas = document.getElementById("canvas");
// 获取渲染上下文 getContext
var ctx = canvas.getContext("2d");//也可以称之为画笔
ctx.fillStyle = "orange"
//填充
ctx.fillRect(50, 50, 100, 100);
/*
清除指定的区域并且让它完全透明 -> 镂空的效果
清除 clearRect
x: 落笔的横坐标
y: 落笔的纵坐标
width: 宽
height: 高
*/
ctx.clearRect(75, 75, 50, 50);
</script>
- 带轮廓的矩形
- strokeRect
<canvas id="canvas" width="300" height="150"></canvas>
<script>
// 获取canvas元素
var canvas = document.getElementById("canvas");
// 获取渲染上下文 getContext
var ctx = canvas.getContext("2d");//也可以称之为画笔
// 带轮廓的矩形
ctx.strokeRect(50, 50, 100, 100)
</script>
- 轮廓换颜色
<canvas id="canvas" width="300" height="150"></canvas>
<script>
// 获取canvas元素
var canvas = document.getElementById("canvas");
// 获取渲染上下文 getContext
var ctx = canvas.getContext("2d");//也可以称之为画笔
// 轮廓换色
ctx.strokeStyle = "orange"
// 带轮廓的矩形
ctx.strokeRect(50, 50, 100, 100)
</script>
画线
<canvas id="canvas" width="300" height="150"></canvas>
<script>
// 获取canvas元素
var canvas = document.getElementById("canvas");
// 获取渲染上下文 getContext
var ctx = canvas.getContext("2d");//也可以称之为画笔
// 1.创建新路径
ctx.beginPath();
// 2.使用画图命令画出路径
ctx.strokeStyle = "orange";//设置画笔颜色
ctx.moveTo(50, 50);//画笔落笔位置(起始点)
ctx.lineWidth = 5;//调整线的宽度
ctx.lineTo(100, 100);//执行到哪个点(终止点)
// 3.一旦路径被画出来了的话,就可以通过描边或者填充路径区域来渲染图形
ctx.stroke();
</script>
画三角形
- 画2条线,然后闭合路径
<canvas id="canvas" width="300" height="150"></canvas>
<script>
// 获取canvas元素
var canvas = document.getElementById("canvas");
// 获取渲染上下文 getContext
var ctx = canvas.getContext("2d");//也可以称之为画笔
// 1.创建路径
ctx.beginPath();
ctx.strokeStyle = "blue";
ctx.moveTo(50, 50);
ctx.lineWidth = 5;
ctx.lineTo(150, 50);
// 在这个点的基础上,画到另一个点
ctx.lineTo(100, 100);
// 闭合路径 api
ctx.closePath();
ctx.stroke();
</script>
画圆弧
<canvas id="canvas" width="300" height="150"></canvas>
<script>
// 获取canvas元素
var canvas = document.getElementById("canvas");
// 获取渲染上下文 getContext
var ctx = canvas.getContext("2d");//也可以称之为画笔
// arc(x, y, radius半径, startAngle起始角度, endAngle终止角度, 顺逆时针画默认false)默认顺时针
ctx.beginPath();
// 找圆心坐标 Math.PI是Π 360°整圆
ctx.arc(70, 70, 50, 0, 2 * Math.PI);
// 64°的圆弧
// ctx.arc(70, 70, 50, 0, 64/180 * Math.PI)
ctx.stroke();
</script>
组合画法
<canvas id="canvas" width="300" height="150"></canvas>
<script>
// 获取canvas元素
var canvas = document.getElementById("canvas");
// 获取渲染上下文 getContext
var ctx = canvas.getContext("2d");//也可以称之为画笔
ctx.beginPath();
ctx.moveTo(150, 20);
ctx.arcTo(150, 100, 50, 20, 30);// x1 y1 x2 y2 radius半径做切线的圆弧
ctx.lineTo(50, 20);
ctx.stroke();
ctx.fillStyle = "blue";
// 基础点
ctx.fillRect(150, 20, 10, 10);
ctx.fillStyle = "red";
// 控制点1
ctx.fillRect(150, 100, 10, 10);
// 控制点2
ctx.fillRect(50, 20, 10, 10);
</script>
2次/3次贝塞尔曲线
- 1962法国的一个叫贝塞尔提出来的
// => 二次贝塞尔 经典案例 旋转木马
<canvas id="canvas" width="300" height="150"></canvas>
<script>
// 获取canvas元素
var canvas = document.getElementById("canvas");
// 获取渲染上下文 getContext
var ctx = canvas.getContext("2d");//也可以称之为画笔
ctx.beginPath();
ctx.moveTo(50, 20);
// cpx控制点x cpy控制点y x y 终点坐标
ctx.quadraticCurveTo(230, 30, 50, 100);
ctx.stroke()
ctx.fillStyle = "blue";
// 起始点
ctx.fillRect(50, 20, 10, 10);
// 终止点
ctx.fillRect(50, 100, 10, 10);
ctx.fillStyle = "red";
// 控制点
ctx.fillRect(230, 30, 10, 10);
</script>
- 3次贝塞尔
<canvas id="canvas" width="300" height="150"></canvas>
<script>
// 获取canvas元素
var canvas = document.getElementById("canvas");
// 获取渲染上下文 getContext
var ctx = canvas.getContext("2d");//也可以称之为画笔
ctx.beginPath();
ctx.moveTo(50, 20);
ctx.bezierCurveTo(230, 30, 150, 60, 50, 100);
ctx.stroke();
ctx.fillStyle = "blue";
// 起始点
ctx.fillRect(50, 20, 10, 10);
// 终点
ctx.fillRect(50, 100, 10, 10);
ctx.fillStyle = "red";
// 控制点1
ctx.fillRect(230, 30, 10, 10);
// 控制点2
ctx.fillRect(150, 60, 10, 10);
</script>
坐标轴的变换
- translate: 移动坐标原点
- 往x水平移动,往y方向垂直移动
<canvas id="canvas" width="300" height="150"></canvas>
<script>
// 获取canvas元素
var canvas = document.getElementById("canvas");
// 获取渲染上下文 getContext
var ctx = canvas.getContext("2d");//也可以称之为画笔
// 原点坐标进行平移 (0,0) -> (50, 50)
ctx.translate(50, 50);
ctx.fillRect(0, 0, 30, 30);
</script>
- 记录状态 和 重置
<canvas id="canvas" width="300" height="150"></canvas>
<script>
// 获取canvas元素
var canvas = document.getElementById("canvas");
// 获取渲染上下文 getContext
var ctx = canvas.getContext("2d");//也可以称之为画笔
ctx.save();
// 原点坐标(0,0)
ctx.fillRect(0, 0, 30, 30);
// 原点坐标进行平移 (0,0) -> (50, 50)
ctx.translate(50, 50);
ctx.fillRect(0, 0, 30, 30);
// 还原到上次(最近)保存的状态
ctx.restore();
ctx.fillStyle = "orange";
ctx.fillRect(100, 0, 30, 30);
</script>
变形 scale(w倍数, h倍数)
- 可以看作画布的单元格子变大了,就可以清除知道画的东西的位置了
<canvas id="canvas" width="300" height="150"></canvas>
<script>
// 获取canvas元素
var canvas = document.getElementById("canvas");
// 获取渲染上下文 getContext
var ctx = canvas.getContext("2d");//也可以称之为画笔
ctx.scale(2, 1);
ctx.fillRect(50, 0, 30, 30);
</script>
旋转 rotate
- 旋转按照原定旋转的
<canvas id="canvas" width="300" height="150"></canvas>
<script>
// 获取canvas元素
var canvas = document.getElementById("canvas");
// 获取渲染上下文 getContext
var ctx = canvas.getContext("2d");//也可以称之为画笔
ctx.fillRect(20, 20, 50, 50);
ctx.rotate(Math.PI / 180 * 10);//转10°
ctx.fillStyle = "red";
ctx.fillRect(20, 20, 50, 50);
</script>
变形transform
<canvas id="canvas" width="300" height="150"></canvas>
<script>
// 获取canvas元素
var canvas = document.getElementById("canvas");
// 获取渲染上下文 getContext
var ctx = canvas.getContext("2d");//也可以称之为画笔
/*
6个参数:
水平缩放
垂直倾斜
水平倾斜
垂直缩放
水平移动
垂直移动
*/
ctx.transform(1, 1, 0, 1, 0, 0);
ctx.fillRect(0, 0, 50, 50);
</script>
setTransform重置为变形前的状态
<canvas id="canvas" width="300" height="150"></canvas>
<script>
// 获取canvas元素
var canvas = document.getElementById("canvas");
// 获取渲染上下文 getContext
var ctx = canvas.getContext("2d");//也可以称之为画笔
ctx.translate(50, 50);
ctx.setTransform(1, 1, 0, 1, 0, 0);//上面的translate失效了
ctx.fillRect(0, 0, 50, 50);
</script>