HTML5 Canvas 入门教程与精彩案例全解析

news2024/11/5 16:22:35

一、前言

在当今的前端开发领域,HTML5 中的 canvas元素无疑是一颗耀眼的明星。它提供了强大的绘图能力,让我们能够在网页上创造出丰富多彩的图形、图像以及令人惊叹的动画效果。本文将带你深入探索 canvas的奇妙世界,从基础概念到精彩案例,让你轻松掌握 canvas的使用技巧。

二、Canvas 概述

canvas是 HTML5 引入的全新元素,主要用于在网页上进行图形绘制。它就像一块数字化的画布,以像素为单位,为我们提供了一个自由发挥创意的空间。通过 JavaScript 的操控,我们可以在 canvas上绘制各种形状、展示图像,甚至实现动态的动画效果,为网页增添独特的视觉魅力。

三、创建 Canvas 元素

在 HTML 页面中,创建一个 canvas元素非常简单。以下是代码示例:

<canvas id="myAwesomeCanvas" width="400" height="200"></canvas>

这里我们创建了一个 canvas元素,给它的 id写成 “myAwesomeCanvas”,并设置了宽度为 400 像素,高度为 200 像素。你可以根据实际需求调整这些参数,以满足不同的绘图场景。

四、获取 Canvas 上下文

要在 canvas上进行绘图操作,首先需要获取它的上下文。这可以通过以下 JavaScript 代码实现:

const canvas = document.getElementById('myAwesomeCanvas');
const ctx = canvas.getContext('2d');

通过 document.getElementById方法,我们可以获取到指定 id的 canvas元素。然后,使用 getContext方法并传入 “2d” 参数,我们就得到了一个二维绘图上下文对象 ctx。这个对象包含了一系列用于绘制图形的方法和属性。

五、绘制基本图形

1.矩形绘制

  • 使用 fillRect方法可以绘制填充矩形。例如:

     ctx.fillRect(50, 50, 100, 100);
  • 而 strokeRect方法则用于绘制边框矩形。例如:
     ctx.strokeRect(150, 50, 100, 100);

2.圆形绘制

  • 要绘制圆形,可以借助 arc方法。如下所示:
     ctx.beginPath();
     ctx.arc(200, 150, 50, 0, 2 * Math.PI);
     ctx.stroke();

3.线条绘制

  • 首先使用 beginPath方法开启一条新的路径。然后,通过 moveTo方法设置起点,再用 lineTo方法设置终点。再使用 stroke方法绘制线条。例如:
     ctx.beginPath();
     ctx.moveTo(50, 150);
     ctx.lineTo(150, 150);
     ctx.stroke();

六、设置图形样式

1.填充颜色

  • 通过 fillStyle属性可以设置填充颜色。例如:
     ctx.fillStyle = 'red';
     ctx.fillRect(50, 50, 100, 100);

2.边框颜色和宽度

  • strokeStyle属性用于设置边框颜色,而 lineWidth属性则用来设置边框宽度。例如:
     ctx.strokeStyle = 'blue';
     ctx.lineWidth = 5;
     ctx.strokeRect(150, 50, 100, 100);

七、绘制图像

在 canvas上绘制图像可以使用 drawImage方法。首先创建一个 Image对象,并设置其 src属性为图像的 URL。当图像加载完成后,调用 drawImage方法将图像绘制到 canvas上。示例代码如下:

const image = new Image();
image.src = 'your-image-url.jpg';
image.onload = function() {
  ctx.drawImage(image, 50, 50, 100, 100);
};

八、精彩案例

1.动态烟花秀

   <!DOCTYPE html>
   <html lang="en">

   <head>
     <meta charset="UTF-8">
   </head>

   <body>
     <canvas id="fireworksCanvas" width="800" height="600"></canvas>
     <script>
       const canvas = document.getElementById('fireworksCanvas');
       const ctx = canvas.getContext('2d');
       const particles = [];

       function Particle(x, y, hue, firework) {
         this.x = x;
         this.y = y;
         this.hue = hue;
         this.firework = firework;
         this.lifespan = 200;
         if (this.firework) {
           this.speedX = (Math.random() - 0.5) * 10;
           this.speedY = (Math.random() - 0.5) * 10;
         } else {
           this.speedX = (Math.random() - 0.5) * 3;
           this.speedY = Math.random() * -5;
         }
       }

       Particle.prototype.update = function () {
         if (this.firework) {
           this.x += this.speedX;
           this.y += this.speedY;
           this.lifespan--;
         } else {
           this.x += this.speedX;
           this.y += this.speedY;
           this.speedY += 0.1;
           this.lifespan--;
         }
       };

       Particle.prototype.draw = function () {
         ctx.beginPath();
         ctx.arc(this.x, this.y, 2, 0, 2 * Math.PI);
         ctx.fillStyle = `hsl(${this.hue}, 100%, 50%)`;
         ctx.fill();
       };

       function createFirework() {
         const hue = Math.random() * 360;
         const x = canvas.width / 2;
         const y = canvas.height;
         return new Particle(x, y, hue, true);
       }

       function createParticles(centerX, centerY, hue) {
         for (let i = 0; i < 50; i++) {
           particles.push(new Particle(centerX, centerY, hue, false));
         }
       }

       function draw() {
         ctx.globalCompositeOperation = 'destination-out';
         ctx.fillStyle = 'rgba(0, 0, 0, 0.1)';
         ctx.fillRect(0, 0, canvas.width, canvas.height);
         ctx.globalCompositeOperation = 'lighter';
         for (let i = particles.length - 1; i >= 0; i--) {
           particles[i].update();
           particles[i].draw();
           if (particles[i].lifespan <= 0) {
             particles.splice(i, 1);
           }
         }
         if (Math.random() < 0.05) {
           const firework = createFirework();
           particles.push(firework);
           createParticles(firework.x, firework.y, firework.hue);
         }
         requestAnimationFrame(draw);
       }

       draw();
     </script>
   </body>

   </html>

这个案例在网页上呈现出绚丽多彩的动态烟花效果,仿佛一场视觉盛宴。

2.旋转图形之舞

   <!DOCTYPE html>
   <html lang="en">

   <head>
     <meta charset="UTF-8">
   </head>

   <body>
     <canvas id="rotationCanvas" width="400" height="400"></canvas>
     <script>
       const canvas = document.getElementById('rotationCanvas');
       const ctx = canvas.getContext('2d');
       let angle = 0;

       function draw() {
         ctx.clearRect(0, 0, canvas.width, canvas.height);
         ctx.beginPath();
         ctx.arc(canvas.width / 2, canvas.height / 2, 50, 0, 2 * Math.PI);
         ctx.strokeStyle = 'blue';
         ctx.lineWidth = 5;
         ctx.stroke();
         ctx.save();
         ctx.translate(canvas.width / 2, canvas.height / 2);
         ctx.rotate(angle);
         ctx.beginPath();
         ctx.rect(-20, -20, 40, 40);
         ctx.fillStyle = 'red';
         ctx.fill();
         ctx.restore();
         angle += 0.05;
         requestAnimationFrame(draw);
       }

       draw();
     </script>
   </body>

   </html>

此案例展示了一个圆形和一个不断旋转的矩形。

3.波浪动画之美

   <!DOCTYPE html>
   <html lang="en">

   <head>
     <meta charset="UTF-8">
   </head>

   <body>
     <canvas id="waveCanvas" width="800" height="400"></canvas>
     <script>
       const canvas = document.getElementById('waveCanvas');
       const ctx = canvas.getContext('2d');
       let offset = 0;

       function drawWave() {
         ctx.clearRect(0, 0, canvas.width, canvas.height);
         ctx.beginPath();
         ctx.strokeStyle = 'blue';
         ctx.lineWidth = 2;
         for (let x = 0; x < canvas.width; x++) {
           const y = Math.sin(x * 0.02 + offset) * 20 + canvas.height / 2;
           if (x === 0) {
             ctx.moveTo(x, y);
           } else {
             ctx.lineTo(x, y);
           }
         }
         ctx.stroke();
         offset += 0.05;
         requestAnimationFrame(drawWave);
       }

       drawWave();
     </script>
   </body>

   </html>

这个案例通过绘制不断波动的蓝色线条,创造出一种宁静而优美的波浪动画效果。

九、总结

本文详细介绍了 canvas的基本用法,包括创建 canvas元素、获取上下文、绘制基本图形、设置图形样式以及绘制图像。同时,通过三个精彩案例 —— 动态烟花秀、旋转图形之舞和波浪动画之美,展示了 canvas的强大绘图和动画能力。相信通过学习本文,你已经对 canvas有了更深入的了解,并能够在网页开发中充分发挥它的优势,创造出令人惊艳的视觉效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2233672.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

江协科技STM32学习- P32 MPU6050

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

程序设计方法与实践-时空权衡

什么是时空权衡&#xff1f; 时空权衡是算法设计中的一个众所周知的问题&#xff0c;也就是对算法的空间和时间效率做出权衡&#xff0c;它大概有分两种形式&#xff1a; 对输入的部分数据或者全部数据作预处理&#xff0c;然后对于获得额外信息储存起来&#xff0c;从而加快…

STM32F1学习——TIM

一、STM32中的定时器 在STM32中分为三种定时器&#xff0c;分别是基本定时器&#xff0c;通用定时器和高级定时器&#xff0c;每种定时器都是向下兼容的。 二、定时器详细介绍 a、基本定时器 基本定时器主要由下面与分频器、计数器 和 自动重装寄存器三个组成的时基单元&#…

W5500-EVB-Pico2评估板介绍

目录 1 概述 2 板载资源 2.1 硬件规格 2.2 硬件规格 2.3 工作条件 3 参考资料 3.1 RP2350 数据手册 3.2 W5500 数据手册 3.3 原理图 原理图 & 物料清单 & Gerber 文件 3.3 尺寸图 (单位 : mm) 3.4 参考例程 认证 CE FCC AWS 资质 Microsoft Azure 认证…

FFmpeg 4.3 音视频-多路H265监控录放C++开发十二:在屏幕上显示多路视频播放,可以有不同的分辨率,格式和帧率。

上图是在安防领域的要求&#xff0c;一般都是一个屏幕上有显示多个摄像头捕捉到的画面&#xff0c;这一节&#xff0c;我们是从文件中读取多个文件&#xff0c;显示在屏幕上。

Oracle视频基础1.4.3练习

15个视频 1.4.3 できない dbca删除数据库 id ls cd cd dbs ls ls -l dbca# delete a database 勾选 # chris 勾选手动删除数据库 ls ls -l ls -l cd /u01/oradata ls cd /u01/admin/ ls cd chris/ ls clear 初始化参数文件&#xff0c;admin&#xff0c;数据文件#新版本了…

一个由Deno和React驱动的静态网站生成器

大家好&#xff0c;今天给大家分享一个由 Deno React 驱动的静态网站生成器Pagic。 项目介绍 Pagic 是一个由 Deno React 驱动的静态网站生成器。它配置简单&#xff0c;支持将 md/tsx 文件渲染成静态页面&#xff0c;而且还有大量的官方或第三方主题和插件可供扩展。 核心…

1分钟解决Excel打开CSV文件出现乱码问题

一、编码问题 1、不同编码格式 CSV 文件有多种编码格式&#xff0c;如 UTF - 8、UTF - 16、ANSI 等。如果 CSV 文件是 UTF - 8 编码&#xff0c;而 Excel 默认使用的是 ANSI 编码打开&#xff0c;就可能出现乱码。例如&#xff0c;许多从网络应用程序或非 Windows 系统生成的 …

发布天工AI高级搜索功能,昆仑万维做最懂科研学术的AI搜索

今天&#xff0c;昆仑万维天工AI正式发布最新版本的AI高级搜索功能。 一年时光&#xff0c;栉风沐雨。昆仑万维致力于通过领先的AI技术&#xff0c;为全球用户提供创新的智能搜索和信息处理解决方案。无论是金融、科技领域的专业搜索还是文档分析&#xff0c;「天工AI高级搜索…

mac找到主目录下的文件夹

访达-&#xff08;上方状态栏显示&#xff09;-然后在

安装fpm,解决*.deb=> *.rpm

要从生成 .deb 包转换为 .rpm 包&#xff0c;可以按照以下步骤修改打包脚本 1. 使用 fpm 工具 fpm 是一个强大的跨平台打包工具&#xff0c;可以将 .deb 包重新打包成 .rpm&#xff0c;也可以直接从源文件打包成 .rpm。 安装 fpm sudo apt-get install ruby-dev sudo gem in…

分布式光伏管理办法

随着分布式光伏项目的不断增加&#xff0c;传统的管理方式已经难以满足高效、精准的管理需求。光伏业务管理系统作为一种集信息化、智能化于一体的管理工具&#xff0c;正在逐步成为分布式光伏项目管理的重要支撑。 光伏业务管理系统通过数字化手段实现对光伏业务全流程的精细化…

数据结构:LRUCache

什么是LRUCache 首先我们来看看什么是cache 缓存&#xff08;Cache&#xff09;通常用于两个速度不同的介质之间&#xff0c;以提高数据访问的速度和效率。这里有几个典型的应用场景&#xff1a; 处理器和内存之间&#xff1a; 处理器&#xff08;CPU&#xff09;的运算速度远…

智能提醒助理系列-springboot项目彩虹日志+TraceID

本系列文章记录“智能提醒助理”产品建设历程&#xff0c;记录实践经验、巩固知识点、锻炼总结能力。 本篇介绍如何让springboot启动日志“彩打” 提升日志识别度&#xff0c;同时增加TraceID&#xff0c;便于同一请求&#xff0c;全链路的追踪。 一、需求出发点 提升日志识别度…

窨井监测遥测终端RTU IP68防水强信号穿透力

在窨井的潮湿 黑暗和腐蚀性环境中 常规物联网设备往往难以生存 如何突破层层环境挑战 轻松应对极端条件 确保信号 24h不掉线&#xff0c;不延迟 不仅是对技术的突破 更是对恶劣环境的征服 ↓↓↓ 坚守 ——严苛环境下的工业设备 计讯物联工业级设备&#xff0c;专为恶劣环境设计…

150道MySQL高频面试题,学完吊打面试官--如何实现索引机制

前言 本专栏为150道MySQL大厂高频面试题讲解分析&#xff0c;这些面试题都是通过MySQL8.0官方文档和阿里巴巴官方手册还有一些大厂面试官提供的资料。 MySQL应用广泛&#xff0c;在多个开发语言中都处于重要地位&#xff0c;所以最好都要掌握MySQL的精华面试题&#xff0c;这也…

基于Matlab 模拟停车位管理系统【源码 GUI】

系统对进入停车位的车辆进行车牌识别&#xff0c;将识别出来的车牌号显示出来&#xff1b;然后对车主进行人脸识别&#xff0c;框出车主照片的人脸部分作为车主信息的标记&#xff0c;记录在系统库中。车辆在库期间&#xff0c;系统使用者可以随意查看车辆与车主信息的获取过程…

微信小程序 https://pcapi-xiaotuxian-front-devtest.itheima.net 不在以下 request 合法域名

微信小程序在调用接口的时候出现以上报错&#xff0c;接口没有问题&#xff0c;是因为小程序自动校验了合法域名 打开本地设置&#xff1a; 勾选不校验合法域名&#xff0c;即可 效果如下&#xff1a;

数据治理,数据提取,大数据中心建设,大数据治理总体解决方案书(word,ppt原件)

1. 数据管理的现状 2. 数据治理的概述 1.1数据治理概念 2.2数据治理目标 3. 数据治理体系 4. 数据治理核心领域 1.1 数据模型 1.2 数据生命周期 &#xff08;1&#xff09;数据生成及传输 &#xff08;2&#xff09;数据存储 &#xff08;3&#xff09;数据处理和应用…

电机控制储备知识 二:电磁学理论知识

一&#xff1a;磁场的发现过程和和一些实验现象 古代发现&#xff1a;公元前七世纪&#xff0c;中国和古希腊的学者就已经发现了磁石。 吉尔伯特的研究&#xff1a;1600年&#xff0c;英国女王御臣威廉吉尔伯特&#xff08;William Gilbert&#xff09;发表了《地磁论》&#…