Canvas入门学习笔记系列之:Canvas基本用法

  • 原创
  • 作者:程序员三丰
  • 发布时间:2025-01-03 23:42
  • 浏览量:692
本文从一些基础开始,描述了如何使用canvas元素来绘制 2D 图形,让你明白可以用 canvas 做什么,提供一些示例代码片段来帮助你快速入门。

认识 Canvas

<canvas>是一个可以使用 JavaScript 来绘制图形的 HTML 元素。
例如,可以用于绘制图表、制作图片构图或者简单的动画。
属性:

  • width:容器宽度,单位像素(px),默认300。
  • height:容器高度,单位像素(px),默认150。

注意:可以使用 CSS 的 width 和 height 以在渲染期间缩放图像以适应样式大小,就像元素一样。如果你发现<canvas>元素中展示的内容变形,你可以通过<canvas>自带的 height 和 width 属性进行相关设置,而不要使用 CSS。

代码示例:

<canvas id="canvas" width="300" height="300">
  抱歉,你的浏览器不支持 canvas 元素
  (这些内容将会在不支持<canvas%gt;元素的浏览器或是禁用了 JavaScript
  的浏览器内渲染并展现)
</canvas>

Canvas API 介绍

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 API 教程

本篇教程从一些基础开始,描述了如何使用 <canvas> 元素来绘制 2D 图形。教程中提供的例子,会让你明白可以用 canvas 做什么,也会提供一些代码片段来帮助你开始构建自己的内容。

<canvas> 最早由 Apple 引入 WebKit,用于 Mac OS X 的 Dashboard,随后被各个浏览器实现。如今,所有主流的浏览器都支持它。

开始之前

  • 基础:使用 <canvas> 元素不是非常难,但你需要一些基本的HTML和JavaScript知识。
  • 浏览器兼容性:除一些过时的浏览器不支持 <canvas> 元素外,所有的新版本主流浏览器都支持它。
  • 尺寸设置:Canvas 的默认大小为 300 像素 ×150 像素(宽 × 高,像素的单位是 px)。但是,可以使用 HTML 的高度和宽度属性来自定义 Canvas 的尺寸。

    该元素可以使用CSS来定义大小,但在绘制时图像会伸缩以适应它的框架尺寸:如果 CSS 的尺寸与初始画布的比例不一致,它会出现扭曲。
    提示: 如果你绘制出来的图像是扭曲的,尝试用 width 和 height 属性为 <canvas> 明确规定宽高,而不是使用 CSS。

  • Javascript:为了在 Canvas 上绘制图形,我们使用一个 JavaScript 上下文对象,它能动态创建图像(creates graphics on the fly)。

基本用法

  • id:给 canvas 元素设置id属性,方便在JavaScript中操作。
  • 替换内容:在 <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() 方法来访问绘画上下文。

Javascript检查API编程支持性

替换内容是用于在不支持 <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>

Canvas 开发骨架模版

这里的是一个最简单的模板,我们之后就可以把它作为之后的例子的起点。

<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>
声明:本文为原创文章,51blog.xyz和作者拥有版权,如需转载,请注明来源于51blog.xyz并保留原文链接:https://mp.51blog.xyz/article/79.html

文章归档

推荐文章

buildadmin logo
Thinkphp8 Vue3 Element PLus TypeScript Vite Pinia

🔥BuildAdmin是一个永久免费开源,无需授权即可商业使用,且使用了流行技术栈快速创建商业级后台管理系统。

热门标签

PHP ThinkPHP ThinkPHP5.1 Go Mysql Mysql5.7 Redis Linux CentOS7 Git HTML CSS CSS3 Javascript JQuery Vue LayUI VMware Uniapp 微信小程序 docker wiki Confluence7 学习笔记 uView ES6 Ant Design Pro of Vue React ThinkPHP6.0 chrome 扩展 翻译工具 Nuxt SSR 服务端渲染 scrollreveal.js ThinkPHP8.0 Mac webman 跨域CORS vscode GitHub ECharts Canvas