(一)Canvas极简入门

news2025/1/12 0:59:59

Canvas 是 HTML5 引入的一个强大的元素,它允许通过 JavaScript在网页上绘制图形、生成图像、动画等。作为前端开发工程师,理解 Canvas的基本用法是非常重要的。接下来通过一个详细的入门教程,帮助大家快速掌握 Canvas 的基本操作。

1. 创建 Canvas 元素

Canvas 是 HTML 中的一个 <canvas> 元素,你需要在 HTML 页面中插入这个元素,并为其指定宽度和高度。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Canvas 入门教程</title>
</head>
<body>
    <canvas id="myCanvas" width="500" height="500" style="border:1px solid #000000;"></canvas>

    <script src="script.js"></script>
</body>
</html>

在上面的代码中,我们创建了一个宽高为 500x500 像素的 Canvas,并给它加上了一个黑色边框。Canvas 元素的默认背景是透明的。

2. 获取 Canvas 上下文 (Context)

Canvas 元素本身并不直接显示图形,你需要通过 JavaScript 获取一个 绘图上下文(context),然后才能在 Canvas 上绘制图形。Canvas 提供了两种常用的上下文:

  • 2D:用于绘制 2D 图形(例如矩形、圆形、线条等)。
  • WebGL:用于绘制 3D 图形(我们先从 2D 开始学习)。
// 获取 Canvas 元素
const canvas = document.getElementById('myCanvas');

// 获取 2D 上下文
const ctx = canvas.getContext('2d');

getContext('2d') 返回的是一个用于绘制 2D 图形的绘图上下文对象,常常用变量 ctx 来表示它。

3. 绘制基本形状

绘制矩形
// 绘制填充矩形
ctx.fillStyle = "red";  // 设置填充颜色为红色
ctx.fillRect(50, 50, 200, 100);  // 绘制一个矩形,位置(50, 50),宽200,高100

// 绘制空心矩形
ctx.strokeStyle = "blue";  // 设置描边颜色为蓝色
ctx.lineWidth = 5;  // 设置线条宽度
ctx.strokeRect(100, 100, 150, 75);  // 绘制空心矩形
绘制圆形
// 绘制填充圆形
ctx.fillStyle = "green";  // 设置填充颜色为绿色
ctx.beginPath();  // 开始路径
ctx.arc(250, 250, 50, 0, 2 * Math.PI);  // 绘制圆形,中心(250, 250),半径50
ctx.fill();  // 填充圆形

// 绘制空心圆形
ctx.strokeStyle = "purple";  // 设置描边颜色为紫色
ctx.lineWidth = 3;  // 设置线条宽度
ctx.beginPath();
ctx.arc(250, 250, 100, 0, 2 * Math.PI);  // 绘制空心圆形
ctx.stroke();  // 描边圆形
绘制线条
// 绘制线条
ctx.beginPath();  // 开始路径
ctx.moveTo(50, 50);  // 移动到起点
ctx.lineTo(450, 50);  // 绘制到终点
ctx.lineWidth = 2;  // 设置线条宽度
ctx.strokeStyle = "orange";  // 设置线条颜色
ctx.stroke();  // 描边线条

4. 文本绘制

Canvas 也支持文本绘制,你可以使用 fillTextstrokeText 方法来绘制填充或描边文本。

// 设置文本样式
ctx.font = "30px Arial";  // 设置字体大小和字体
ctx.fillStyle = "black";  // 设置文本填充颜色
ctx.fillText("Hello, Canvas!", 100, 200);  // 绘制文本

// 设置描边文本
ctx.strokeStyle = "red";  // 设置描边颜色
ctx.lineWidth = 2;  // 设置线条宽度
ctx.strokeText("Hello, Canvas!", 100, 250);  // 绘制描边文本

5. 清除画布

如果你想清除画布的某个区域或整个画布,可以使用 clearRect 方法。

// 清除一个矩形区域
ctx.clearRect(100, 100, 150, 75);  // 清除一个区域,位置(100, 100),宽150,高75

6. 组合图形

你可以通过组合基本形状和路径绘制更复杂的图形。例如,绘制一个自定义形状(如星形):

ctx.beginPath();
ctx.moveTo(250, 50);  // 起点
ctx.lineTo(300, 150);
ctx.lineTo(400, 150);
ctx.lineTo(325, 200);
ctx.lineTo(350, 300);
ctx.lineTo(250, 250);
ctx.lineTo(150, 300);
ctx.lineTo(175, 200);
ctx.lineTo(100, 150);
ctx.lineTo(200, 150);
ctx.closePath();  // 关闭路径,形成闭环
ctx.fillStyle = "yellow";  // 填充颜色
ctx.fill();  // 填充星形

7. 动画效果

你还可以使用 requestAnimationFrame 来创建流畅的动画效果。这里展示一个简单的动画:

let x = 50;  // 初始位置

function draw() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);  // 清除整个画布
    ctx.beginPath();
    ctx.arc(x, 250, 20, 0, 2 * Math.PI);  // 绘制圆形
    ctx.fillStyle = "blue";
    ctx.fill();  // 填充圆形
    x += 2;  // 每次更新位置

    if (x > canvas.width) {
        x = 0;  // 当圆形超出画布宽度时重置位置
    }

    requestAnimationFrame(draw);  // 再次请求下一帧
}

draw();  // 启动动画

总结

以上介绍了 HTML5 Canvas 的基础知识,包括如何创建 Canvas 元素、获取绘图上下文以及绘制基本形状、文本和实现动画。Canvas 是一个非常灵活的工具,适合用于图像处理、游戏开发、数据可视化等各种应用场景。掌握这些基础后,你可以继续探索更多复杂的应用,比如图像滤镜、路径操作、复杂动画等。

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

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

相关文章

【Go】:图片上添加水印的全面指南——从基础到高级特性

前言 在数字内容日益重要的今天&#xff0c;保护版权和标识来源变得关键。为图片添加水印有助于声明所有权、提升品牌认知度&#xff0c;并防止未经授权的使用。本文将介绍如何用Go语言实现图片水印&#xff0c;包括静态图片和带旋转、倾斜效果的文字水印&#xff0c;帮助您有…

PyQt5 UI混合开发,控件的提升

PromoteLabelTest.py 提升的类 import sys from PyQt5.QtWidgets import QApplication, QWidget,QVBoxLayout,QTextEdit,QPushButton,QHBoxLayout,QFileDialog,QLabelclass PromoteLabel(QLabel):def __init__(self,parent None):super().__init__(parent)self.setText("…

CI/CD 流水线

CI/CD 流水线 CI 与 CD 的边界CI 持续集成CD&#xff08;持续交付/持续部署&#xff09;自动化流程示例&#xff1a; Jenkins 引入到 CI/CD 流程在本地或服务器上安装 Jenkins。配置 Jenkins 环境流程设计CI 阶段&#xff1a;Jenkins 流水线实现CD 阶段&#xff1a;Jenkins 流水…

ROS核心概念解析:从Node到Master,再到roslaunch的全面指南

Node 在ROS中&#xff0c;最小的进程单元就是节点&#xff08;node&#xff09;。一个软件包里可以有多个可执行文件&#xff0c;可执行文件在运行之后就成了一个进程(process)&#xff0c;这个进程在ROS中就叫做节点。 从程序角度来说&#xff0c;node就是一个可执行文件&…

深入Android架构(从线程到AIDL)_22 IPC的Proxy-Stub设计模式04

目录 5、 谁来写Proxy及Stub类呢? 如何考虑人的分工 IA接口知识取得的难题 在编程上&#xff0c;有什么技术可以实现这个方法&#xff1f; 范例 5、 谁来写Proxy及Stub类呢? -- 强龙提供AIDL工具&#xff0c;给地头蛇产出Proxy和Stub类 如何考虑人的分工 由框架开发者…

风水算命系统架构与功能分析

系统架构 服务端&#xff1a;Java&#xff08;最低JDK1.8&#xff0c;支持JDK11以及JDK17&#xff09;数据库&#xff1a;MySQL数据库&#xff08;标配5.7版本&#xff0c;支持MySQL8&#xff09;ORM框架&#xff1a;Mybatis&#xff08;集成通用tk-mapper&#xff0c;支持myb…

551 灌溉

常规解法&#xff1a; #include<bits/stdc.h> using namespace std; int n,m,k,t; const int N105; bool a[N][N],b[N][N]; int cnt; //设置滚动数组来存贮当前和下一状态的条件 //处理传播扩散问题非常有效int main() {cin>>n>>m>>t;for(int i1;i&l…

HDFS编程 - 使用HDFS Java API进行文件操作

文章目录 前言一、创建hdfs-demo项目1. 在idea上创建maven项目2. 导入hadoop相关依赖 二、常用 HDFS Java API1. 简介2. 获取文件系统实例3. 创建目录4. 创建文件4.1 创建文件并写入数据4.2 创建新空白文件 5. 查看文件内容6. 查看目录下的文件或目录信息6.1 查看指定目录下的文…

Java面试题~~

深拷贝和浅拷贝区别了解吗?什么是引用拷贝? 关于深拷贝和浅拷贝区别&#xff0c;我这里先给结论&#xff1a; 浅拷贝&#xff1a;浅拷贝会在堆上创建一个新的对象&#xff08;区别于引用拷贝的一点&#xff09;&#xff0c;不过&#xff0c;如果原对象内部的属性是引用类型的…

el-table 自定义表头颜色

第一种方法&#xff1a;计算属性 <template><div><el-table:data"formData.detail"border stripehighlight-current-row:cell-style"{ text-align: center }":header-cell-style"headerCellStyle"><el-table-column fixed…

MySQL笔记大总结20250108

Day2 1.where (1)关系运算符 select * from info where id>1; select * from info where id1; select * from info where id>1; select * from info where id!1;(2)逻辑运算符 select * from info where name"吴佩奇" and age19; select * from info wh…

精选2款.NET开源的博客系统

前言 博客系统是一个便于用户创建、管理和分享博客内容的在线平台&#xff0c;今天大姚给大家分享2款.NET开源的博客系统。 StarBlog StarBlog是一个支持Markdown导入的开源博客系统&#xff0c;后端基于最新的.Net6和Asp.Net Core框架&#xff0c;遵循RESTFul接口规范&…

SEO内容优化:如何通过用户需求赢得搜索引擎青睐?

在谷歌SEO优化中&#xff0c;内容一直是最重要的因素之一。但要想让内容真正发挥作用&#xff0c;关键在于满足用户需求&#xff0c;而不是简单地堆砌关键词。谷歌的算法越来越智能化&#xff0c;更注重用户体验和内容的实用性。 了解目标用户的需求。通过工具如Google Trends…

Spring——自动装配

假设一个场景&#xff1a; 一个人&#xff08;Person&#xff09;有一条狗&#xff08;Dog&#xff09;和一只猫(Cat)&#xff0c;狗和猫都会叫&#xff0c;狗叫是“汪汪”&#xff0c;猫叫是“喵喵”&#xff0c;同时人还有一个自己的名字。 将上述场景 抽象出三个实体类&…

计算机网络(三)——局域网和广域网

一、局域网 特点&#xff1a;覆盖较小的地理范围&#xff1b;具有较低的时延和误码率&#xff1b;使用双绞线、同轴电缆、光纤传输&#xff0c;传输效率高&#xff1b;局域网内各节点之间采用以帧为单位的数据传输&#xff1b;支持单播、广播和多播&#xff08;单播指点对点通信…

错误的类文件: *** 类文件具有错误的版本 61.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中

一、问题 用maven对一个开源项目打包时&#xff0c;遇到了“错误的类文件: *** 类文件具有错误的版本 61.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中。”&#xff1a; 二、原因 原因是当前java环境是Java 8&#xff08;版本52.0&#xff09;&#xff0c;但…

【大模型入门指南 07】量化技术浅析

【大模型入门指南】系列文章&#xff1a; 【大模型入门指南 01】深度学习入门【大模型入门指南 02】LLM大模型基础知识【大模型入门指南 03】提示词工程【大模型入门指南 04】Transformer结构【大模型入门指南 05】LLM技术选型【大模型入门指南 06】LLM数据预处理【大模型入门…

在线工具箱源码优化版

在线工具箱 前言效果图部分源码源码下载部署教程下期更新 前言 来自缤纷彩虹天地优化后的我爱工具网源码&#xff0c;百度基本全站收录&#xff0c;更能基本都比较全&#xff0c;个人使用或是建站都不错&#xff0c;挑过很多工具箱&#xff0c;这个比较简洁&#xff0c;非常实…

@LocalBuilder装饰器: 维持组件父子关系

一、前言 当开发者使用Builder做引用数据传递时&#xff0c;会考虑组件的父子关系&#xff0c;使用了bind(this)之后&#xff0c;组件的父子关系和状态管理的父子关系并不一致。为了解决组件的父子关系和状态管理的父子关系保持一致的问题&#xff0c;引入LocalBuilder装饰器。…

C 语言内存探秘:数据存储的字节密码

文章目录 一、数据在内存中的存储1、基本数据类型存储2、数组存储3、结构体存储1、基本存储规则2、举例说明3、查看结构体大小和成员偏移量的方法 二、大小端字节序三、字节序的判断 一、数据在内存中的存储 1、基本数据类型存储 整型&#xff1a;如int类型&#xff0c;通常在…