<canvas>
是一个可以使用 JavaScript 来绘制图形的 HTML 元素。
例如,可以用于绘制图表、制作图片构图或者简单的动画。
属性:
注意:可以使用 CSS 的 width 和 height 以在渲染期间缩放图像以适应样式大小,就像
元素一样。如果你发现
<canvas>
元素中展示的内容变形,你可以通过<canvas>
自带的 height 和 width 属性进行相关设置,而不要使用 CSS。
代码示例:
<canvas id="canvas" width="300" height="300">
抱歉,你的浏览器不支持 canvas 元素
(这些内容将会在不支持<canvas%gt;元素的浏览器或是禁用了 JavaScript
的浏览器内渲染并展现)
</canvas>
Canvas API 提供了一个通过 JavaScript 和 HTML 的 <canvas>
元素来绘制图形的方式。
它可以用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面。
Canvas API 主要聚焦于 2D 图形。
而同样使用 <canvas>
元素的 WebGL API 则用于绘制硬件加速的 2D 和 3D 图形。
基础示例:在画布上绘制一个绿色的长方形,代码如下:
<canvas
id="canvasContainer"
style="background-color: gainsboro; width: 100%; height: 360px"
></canvas>
<script>
const canvasContainer = document.getElementById("canvasContainer");
const canvasContext = canvasContainer.getContext("2d");
canvasContext.fillStyle = "green";
canvasContext.fillRect(10, 10, 150, 100);
</script>
本篇教程从一些基础开始,描述了如何使用 <canvas>
元素来绘制 2D 图形。教程中提供的例子,会让你明白可以用 canvas 做什么,也会提供一些代码片段来帮助你开始构建自己的内容。
<canvas>
最早由 Apple 引入 WebKit,用于 Mac OS X 的 Dashboard,随后被各个浏览器实现。如今,所有主流的浏览器都支持它。
<canvas>
元素不是非常难,但你需要一些基本的HTML和JavaScript知识。<canvas>
元素外,所有的新版本主流浏览器都支持它。该元素可以使用CSS来定义大小,但在绘制时图像会伸缩以适应它的框架尺寸:如果 CSS 的尺寸与初始画布的比例不一致,它会出现扭曲。
提示: 如果你绘制出来的图像是扭曲的,尝试用 width 和 height 属性为<canvas>
明确规定宽高,而不是使用 CSS。
替换内容:在 <canvas>
标签中设置替换内容。不支持 <canvas>
的浏览器将会忽略容器并在其中渲染替换内容,而支持 <canvas>
的浏览器将会忽略在容器中包含的替换内容,并且只是正常渲染 canvas。
替换内容可以是文字描述,或者静态图片。示例:
<canvas id="stockGraph" width="150" height="150">
抱歉,你的浏览器不支持 canvas 元素
</canvas>
<canvas id="clock" width="150" height="150">
<img src="images/unsupport-canvas.png" width="150" height="150" alt="unsupport-canvas" />
</canvas>
<canvas>
元素创造了一个固定大小的画布,它公开了一个或多个渲染上下文,其可以用来绘制和处理要展示的内容。<canvas>
起初是空白的。为了展示,首先脚本需要找到渲染上下文,然后在它的上面绘制。<canvas>
元素有一个叫做 getContext() 的方法,这个方法是用来获得渲染上下文和它的绘画功能。getContext()接受一个参数,即上下文的类型。
对于 2D 图像而言,如本教程,你可以使用 CanvasRenderingContext2D(查看其API)。
<canvas id="firstCanvas" width="600" height="360"></canvas>
<script>
const firstCanvas = document.getElementById('firstCanvas')
const firstCanvasContext = firstCanvas.getContext('2d')
console.log(firstCanvasContext) // 打印出来是一个CanvasRenderingContext2D实例
</script>
通过使用 document.getElementById() 方法来为 <canvas>
元素得到 DOM 对象。一旦有了元素对象,就可以通过使用它的 getContext() 方法来访问绘画上下文。
替换内容是用于在不支持 <canvas>
标签的浏览器中展示的。
通过简单的测试 getContext() 方法的存在,脚本可以检查编程支持性。
<canvas id="firstCanvas" width="600" height="360"></canvas>
<script>
const firstCanvas = document.getElementById("firstCanvas");
if (firstCanvas.getContext) { // 支持
const firstCanvasContext = firstCanvas.getContext("2d");
} else { // 不支持
}
</script>
这里的是一个最简单的模板,我们之后就可以把它作为之后的例子的起点。
<html>
<head>
<title>Canvas tutorial</title>
<script type="text/javascript">
function draw() {
var canvas = document.getElementById("tutorial");
if (canvas.getContext) {
var ctx = canvas.getContext("2d");
} else {
alert('您的浏览器不支持Canvas!')
}
}
</script>
<style type="text/css">
canvas {
background-color: #f3f4f8;
}
</style>
</head>
<body onload="draw();">
<canvas id="tutorial" width="150" height="150"></canvas>
</body>
</html>
先看效果:
实现代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>一个简单的例子</title>
<script>
function draw() {
var canvas = document.getElementById('canvas');
if (canvas.getContext) {
const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgb(200, 0, 0)';
ctx.fillRect(10, 10, 55, 50);
ctx.fillStyle = 'rgba(0, 0, 200, 0.5)';
ctx.fillRect(30, 30, 55, 50);
} else {
alert('您的浏览器不支持Canvas!');
}
}
</script>
</head>
<body onload="draw();">
<canvas id="canvas" width="150" height="150" style="background-color: #f3f4f8;"></canvas>
</body>
</html>
先看效果:
实现代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>一个简单的例子</title>
<script>
function draw() {
var canvas = document.getElementById('canvas');
if (canvas.getContext) {
const ctx = canvas.getContext('2d');
// 设置线条宽度
ctx.lineWidth = 6;
// 墙
ctx.strokeRect(75, 140, 150, 110);
// 门
ctx.fillRect(130, 190, 40, 60);
// 房顶
ctx.beginPath();
ctx.moveTo(50, 140);
ctx.lineTo(150, 60);
ctx.lineTo(250, 140);
ctx.closePath();
ctx.stroke();
} else {
alert('您的浏览器不支持Canvas!');
}
}
</script>
</head>
<body onload="draw();">
<canvas id="canvas" width="300" height="300" style="background-color: #f3f4f8; color: chocolate;"></canvas>
</body>
</html>