HTML5 Canvas
Canvas基础
Canvas元素是HTML5中新增的一个重要元素,专门用来绘制图形。在页面上放置一个canvas元素就相当于在页面上放置了一块“画布”,可以在其中进行图形的描绘。
Canvas的绘制需要通过JS编写在其中进行绘画的脚本。
-
<canvas>
看起来很像<img>
,唯一不同就是它不含 src 和 alt 属性。
-
它只有两个属性,width和height,两个都是可选的,并且都可以DOM或者CSS来设置。
-
如果不指定width和height,默认的是宽300像素,高150像素。
基础代码框架
代码框架 |
---|
| <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Html5 Canvas</title>
</head>
<body>
<canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
您的浏览器不支持 HTML5 canvas 标签。
</canvas>
<script>
var c = document.getElementById("myCanvas"); //获取canvas元素
var ctx = c.getContext("2d"); //获取绘图上下文
ctx.rect(20, 20, 150, 100); //绘图
ctx.stroke();
</script>
</body>
</html>
|
getContext()
定义和用法
- getContext() 方法返回一个用于在画布上绘图的环境。
语法
Canvas.getContext(contextID)
参数
参数 contextID 指定了您想要在画布上绘制的类型。
返回值
一个 CanvasRenderingContext2D 对象,使用它可以绘制到 Canvas 元素中。
个画布所使用的大多数方法。
Canvas上下文主要成员
颜色、样式和阴影
属性 |
描述 |
fillStyle |
设置或返回用于填充绘画的颜色、渐变或模式。 |
strokeStyle |
设置或返回用于笔触的颜色、渐变或模式。 |
shadowColor |
设置或返回用于阴影的颜色。 |
shadowBlur |
设置或返回用于阴影的模糊级别。 |
shadowOffsetX |
设置或返回阴影与形状的水平距离。 |
shadowOffsetY |
设置或返回阴影与形状的垂直距离。 |
方法 |
描述 |
createLinearGradient() |
创建线性渐变(用在画布内容上)。 |
createPattern() |
在指定的方向上重复指定的元素。 |
createRadialGradient() |
创建放射状/环形的渐变(用在画布内容上)。 |
addColorStop() |
规定渐变对象中的颜色和停止位置。 |
颜色、样式和阴影源代码 |
---|
| <canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
您的浏览器不支持 HTML5 canvas 标签。
</canvas>
<script>
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
var grd = ctx.createLinearGradient(0, 0, 170, 0);
grd.addColorStop(0, "black");
grd.addColorStop(0.5, "red");
grd.addColorStop(1, "white");
ctx.fillStyle = grd;
ctx.fillRect(20, 20, 150, 100);
</script>
|
源代码
front/js/advanced/canvas/src/js_canvas_createLinearGradient.html |
---|
| <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>createLinearGradient</title>
</head>
<body>
<canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
您的浏览器不支持 HTML5 canvas 标签。
</canvas>
<script>
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
var grd = ctx.createLinearGradient(0, 0, 170, 0);
grd.addColorStop(0, "black");
grd.addColorStop(0.5, "red");
grd.addColorStop(1, "white");
ctx.fillStyle = grd;
ctx.fillRect(20, 20, 150, 100);
</script>
</body>
</html>
|
线条样式
矩形
方法 |
描述 |
rect() |
创建矩形。 |
fillRect() |
绘制"被填充"的矩形。 |
strokeRect() |
绘制矩形(无填充)。 |
clearRect() |
在给定的矩形内清除指定的像素。 |
矩形源代码 |
---|
| <canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
您的浏览器不支持 HTML5 canvas 标签。
</canvas>
<script>
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
// 红色矩形
ctx.beginPath();
ctx.lineWidth = "6";
ctx.strokeStyle = "red";
ctx.rect(5, 5, 290, 140);
ctx.stroke();
// 绿色矩形
ctx.beginPath();
ctx.lineWidth = "4";
ctx.strokeStyle = "green";
ctx.rect(30, 30, 50, 50);
ctx.stroke();
// 蓝色矩形
ctx.beginPath();
ctx.lineWidth = "10";
ctx.strokeStyle = "blue";
ctx.rect(50, 50, 150, 80);
ctx.stroke();
</script>
|
源代码
front/js/advanced/canvas/src/js_canvas_rect.html |
---|
| <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>rect</title>
</head>
<body>
<canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
您的浏览器不支持 HTML5 canvas 标签。
</canvas>
<script>
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
// 红色矩形
ctx.beginPath();
ctx.lineWidth = "6";
ctx.strokeStyle = "red";
ctx.rect(5, 5, 290, 140);
ctx.stroke();
// 绿色矩形
ctx.beginPath();
ctx.lineWidth = "4";
ctx.strokeStyle = "green";
ctx.rect(30, 30, 50, 50);
ctx.stroke();
// 蓝色矩形
ctx.beginPath();
ctx.lineWidth = "10";
ctx.strokeStyle = "blue";
ctx.rect(50, 50, 150, 80);
ctx.stroke();
</script>
</body>
</html>
|
路径
方法 |
描述 |
fill() |
填充当前绘图(路径)。 |
stroke() |
绘制已定义的路径。 |
beginPath() |
起始一条路径,或重置当前路径。 |
moveTo() |
把路径移动到画布中的指定点,不创建线条。 |
closePath() |
创建从当前点回到起始点的路径。 |
lineTo() |
添加一个新点,然后在画布中创建从该点到最后指定点的线条。 |
clip() |
从原始画布剪切任意形状和尺寸的区域。 |
quadraticCurveTo() |
创建二次贝塞尔曲线。 |
bezierCurveTo() |
创建三次贝塞尔曲线。 |
arc() |
创建弧/曲线(用于创建圆形或部分圆)。 |
arcTo() |
创建两切线之间的弧/曲线。 |
isPointInPath() |
如果指定的点位于当前路径中,则返回 true,否则返回 false。 |
路径源代码 |
---|
| <canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
您的浏览器不支持 HTML5 canvas 标签。
</canvas>
<script>
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.beginPath();
ctx.moveTo(20, 20);
ctx.bezierCurveTo(20, 100, 200, 100, 200, 20);
ctx.stroke();
</script>
|
源代码
front/js/advanced/canvas/src/js_canvas_bezierCurveTo.html |
---|
| <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>bezierCurveTo</title>
</head>
<body>
<canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
您的浏览器不支持 HTML5 canvas 标签。
</canvas>
<script>
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.beginPath();
ctx.moveTo(20, 20);
ctx.bezierCurveTo(20, 100, 200, 100, 200, 20);
ctx.stroke();
</script>
</body>
</html>
|
转换
方法 |
描述 |
scale() |
缩放当前绘图至更大或更小。 |
rotate() |
旋转当前绘图。 |
translate() |
重新映射画布上的 (0,0) 位置。 |
transform() |
替换绘图的当前转换矩阵。 |
setTransform() |
将当前转换重置为单位矩阵。然后运行 transform()。 |
转换源代码 |
---|
| <canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
您的浏览器不支持 HTML5 canvas 标签。
</canvas>
<script>
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.fillStyle = "yellow";
ctx.fillRect(0, 0, 250, 100)
ctx.transform(1, 0.5, -0.5, 1, 30, 10);
ctx.fillStyle = "red";
ctx.fillRect(0, 0, 250, 100);
ctx.transform(1, 0.5, -0.5, 1, 30, 10);
ctx.fillStyle = "blue";
ctx.fillRect(0, 0, 250, 100);
</script>
|
源代码
front/js/advanced/canvas/src/js_canvas_transform.html |
---|
| <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>transform</title>
</head>
<body>
<canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
您的浏览器不支持 HTML5 canvas 标签。
</canvas>
<script>
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.fillStyle = "yellow";
ctx.fillRect(0, 0, 250, 100)
ctx.transform(1, 0.5, -0.5, 1, 30, 10);
ctx.fillStyle = "red";
ctx.fillRect(0, 0, 250, 100);
ctx.transform(1, 0.5, -0.5, 1, 30, 10);
ctx.fillStyle = "blue";
ctx.fillRect(0, 0, 250, 100);
</script>
</body>
</html>
|
文本
图像
像素操作
属性 |
描述 |
width |
返回 |
ImageData |
对象的宽度。 |
height |
返回 |
ImageData |
对象的高度。 |
data |
返回一个对象,其包含指定的 ImageData 对象的图像数据。 |
方法 |
描述 |
createImageData() |
创建新的、空白的 |
ImageData |
对象。 |
getImageData() |
返回ImageData 对象,该对象为画布上指定的矩形复制像素数据。 |
putImageData() |
把图像数据(从指定的 ImageData 对象)放回画布上。 |
像素操作源代码 |
---|
| <canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
您的浏览器不支持 HTML5 canvas 标签。
</canvas>
<script>
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.fillStyle = "red";
ctx.fillRect(10, 10, 50, 50);
function copy() {
var imgData = ctx.getImageData(10, 10, 50, 50);
ctx.putImageData(imgData, 10, 70);
}
</script>
<button onclick="copy()">复制</button>
|
源代码
front/js/advanced/canvas/src/js_canvas_putImageData.html |
---|
| <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>putImageData</title>
</head>
<body>
<canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
您的浏览器不支持 HTML5 canvas 标签。
</canvas>
<script>
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.fillStyle = "red";
ctx.fillRect(10, 10, 50, 50);
function copy() {
var imgData = ctx.getImageData(10, 10, 50, 50);
ctx.putImageData(imgData, 10, 70);
}
</script>
<button onclick="copy()">复制</button>
</body>
</html>
|
合成
属性 |
描述 |
globalAlpha |
设置或返回绘图的当前 alpha 或透明值。 |
globalCompositeOperation |
设置或返回新图像如何绘制到已有的图像上。 |
合成源代码 |
---|
| <canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
您的浏览器不支持 HTML5 canvas 标签。
</canvas>
<script>
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.fillStyle = "red";
ctx.fillRect(20, 20, 75, 50);
//转换透明度
ctx.globalAlpha = 0.2;
ctx.fillStyle = "blue";
ctx.fillRect(50, 50, 75, 50);
ctx.fillStyle = "green";
ctx.fillRect(80, 80, 75, 50);
</script>
|
源代码
front/js/advanced/canvas/src/js_canvas_globalAlpha.html |
---|
| <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>globalAlpha</title>
</head>
<body>
<canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
您的浏览器不支持 HTML5 canvas 标签。
</canvas>
<script>
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.fillStyle = "red";
ctx.fillRect(20, 20, 75, 50);
//转换透明度
ctx.globalAlpha = 0.2;
ctx.fillStyle = "blue";
ctx.fillRect(50, 50, 75, 50);
ctx.fillStyle = "green";
ctx.fillRect(80, 80, 75, 50);
</script>
</body>
</html>
|