【Canvas系列】基础入门(一)

news2024/11/26 13:56:31

📚 Canvas基础入门
🔥 收藏关注随时温习
💻 在线地址方便浏览

在线学习/演示地址

Canvas API 提供了一个通过JavaScript 和 HTML的元素来绘制图形的方式。它可以用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面 —— MDN

一、用Canvas画一个实心矩形

HTML

<canvas id="canvas"></canvas>

JavaScript

// 获取 HTML <canvas> 元素的引用
const canvas = document.getElementById('canvas'); 
// 获取这个元素的context——图像稍后将在此被渲染
const ctx = canvas.getContext('2d');
// fillStyle 属性让长方形变成绿色
ctx.fillStyle = 'green';
// fillRect() 方法将它的左上角放在 (10, 10),把它的大小设置成宽 150 高 100。
ctx.fillRect(10, 10, 150, 100);

实际效果:
在这里插入图片描述

这里的几个新概念都不难理解,获取Canvas的渲染”画布“,ctx完成可以比理解成为一个画板,我们绘制一个矩形,并填充制定的颜色。

二、用Canvas画一个空心矩形

  • ctx.strokeRect() 使用当前的绘画样式,描绘一个起点在 (x, y)、宽度为 w、高度为 h 的矩形的方法。

HTML

<canvas id="canvas"></canvas>

JavaScript

// 获取 HTML <canvas> 元素的引用
const canvas = document.getElementById('canvas'); 
// 获取这个元素的context——图像稍后将在此被渲染
const ctx = canvas.getContext('2d');

ctx.beginPath();
ctx.shadowColor = '#d53'; // 阴影颜色
ctx.shadowBlur = 20; // 模糊效果程度的
ctx.lineJoin = 'round'; // 线段拐点样式(可忽略)
ctx.lineWidth = 15; // 线段宽度
ctx.strokeStyle = '#38f'; // 线段颜色
ctx.strokeRect(30, 30, 160, 90);

实际效果:
在这里插入图片描述

三、用Canvas画一个圆

  • ctx.arc() 是 Canvas 2D API 绘制圆弧路径的方法。圆弧路径的圆心在 (x, y) 位置,半径为 r,根据anticlockwise (默认为顺时针)指定的方向从 startAngle 开始绘制,到 endAngle 结束。
  • ctx.beginPath() 是 Canvas 2D API 通过清空子路径列表开始一个新路径的方法。当你想创建一个新的路径时,调用此方法。

HTML

<canvas id="canvas"></canvas>

JavaScript

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

ctx.beginPath();
ctx.arc(50, 50, 50, 0, 2 * Math.PI); // x , y, r, start, end
ctx.fill();

实际效果:
在这里插入图片描述

四、用Canvas画一个三角形/线段

4.1 线段-lineTo

  • 透明画笔:ctx.moveTo() 将一个新的子路径的起始点移动到 (x,y) 坐标的方法。
  • 画笔轨迹:ctx.lineTo() 使用直线连接子路径的终点到 x,y 坐标的方法(并不会真正地绘制)。
  • 画笔涂色:ctx.stroke() 根据当前的画线样式,绘制当前或已经存在的路径的方法。

HTML

<canvas id="canvas"></canvas>

JavaScript

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

ctx.beginPath();
ctx.moveTo(0, 0);
ctx.lineTo(100, 100);
ctx.stroke();

实际效果:
在这里插入图片描述

4.2 三角形-lineTo

三角形是依赖三条线段组合的封闭图形,这里Canvas可以这样做:

  • ctx.closePath() 将笔点返回到当前子路径起始点的方法。它尝试从当前点到起始点绘制一条直线。如果图形已经是封闭的或者只有一个点,那么此方法不会做任何操作。

HTML

<canvas id="canvas"></canvas>

JavaScript

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

ctx.beginPath();
ctx.moveTo(50, 50); // 起始点
ctx.lineTo(150, 50);
ctx.lineTo(100, 80);
ctx.closePath(); // 返回起始点
ctx.fill();

ctx.moveTo(150, 50);
ctx.lineTo(250, 50);
ctx.lineTo(200, 80);
ctx.closePath();
ctx.stroke();

实际效果:

在这里插入图片描述

五、渲染图片

HTML

<canvas id="canvas"></canvas>

JavaScript

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

const img = new Image();
img.src = 'http://panpan.dapanna.cn//image-20221009113426344.png';
// 图片加载完成之后绘制图片:
img.onload = function () {
	ctx.drawImage(img, 0, 0); // 在(0,0)处绘制原图
}

实际效果:

在这里插入图片描述

六、Canvas渲染文字

HTML

<canvas id="canvas"></canvas>

Javascript

canvas.width=500;
canvas.height=500
ctx.font = `50px serif`; // 大小+字体
ctx.fillText('Canvas!', 200, 200, 400); // 绘制文字, x, y, 绘制的最大宽度s

// 两条相互垂直的辅助线,两条线的交点为文本绘制的起始点:
ctx.beginPath();
ctx.moveTo(200, 0);
ctx.lineTo(200, 400);
ctx.setLineDash([10]); // 绘制虚线,实现10,空位10
ctx.stroke();
ctx.beginPath();
ctx.moveTo(0, 200);
ctx.lineTo(400, 200);
ctx.stroke();

实际效果:
在这里插入图片描述

七、给图形添加阴影

注意:不同的笔触下,阴影是可以多次添加的

HTML

<canvas id="canvas"></canvas>

Javascript

canvas.width = 600;
canvas.height = 600;
// 画线
ctx.moveTo(100, 100);
ctx.lineTo(600, 100);
ctx.lineWidth = 6;

ctx.shadowColor = '#ccc' // 设置阴影颜色
ctx.shadowBlur = 3 // 设置阴影模糊度
ctx.shadowOffsetX = 10 // 向x轴正方向平移10像素
ctx.shadowOffsetY = 10 // 向y轴正方向平移10像素

ctx.stroke()
// 绘制一个带阴影的矩形:
ctx.fillRect(100, 150, 100, 50)
// 绘制带阴影的文本:
ctx.lineWidth = 1
ctx.font = '30px Verdana'
ctx.strokeText('Hello Canvas!', 300, 190, 400)
// 绘制带阴影的圆:
ctx.beginPath();

ctx.shadowOffsetX = 20// 向x轴负方向平移20像素
ctx.shadowOffsetY = 20 // 向y轴负方向平移20像素
ctx.shadowColor = 'skyblue' // 设置阴影颜色为天蓝色
ctx.shadowBlur = 9 // 设置阴影模糊度
ctx.lineWidth = 5
ctx.arc(350, 400, 100, 0, 2 * Math.PI)
ctx.stroke()

实际效果:

在这里插入图片描述

到此Canvas基础方法介绍完了,翻看MDN的文档,你会发现更多例如动画、渐变、合成等等概念和对应的属性方法,我们会在下篇文章继续介绍~,共勉!

⭐️⭐️⭐️文中提到的所有Demo地址在此 -> 本项目Star地址

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

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

相关文章

shell-条件

条件可以用test或【命令 符号和被检查的条件之间要留有空格 &#xff1a; if [ -f filename *** ] if 和then用于同一行 if [ ]; then 字符串比较&#xff1a; if [ string1 string2 ] 两个字符串相等为真 if [ string1 ! string2 ] 两个字符串不相等为假 …

web自动化测试:Selenium+Python基础方法封装

推荐阅读&#xff1a; [内部资源] 想拿年薪30W的软件测试人员&#xff0c;这份资料必须领取~ Python自动化测试全栈性能测试全栈&#xff0c;挑战年薪40W 正文 01 目的 web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”&#xff0c;通常都会作为广大测试从…

Fiddler(4):在fiddler会话栏中添加IP列,设置抓HTTPS的请求证书安装

Fiddler(4)&#xff1a;在fiddler会话栏中添加IP列 在fiddler会话栏中添加IP列 1、点击菜单栏rules——customize rules…或者在右侧响应栏中点击FiddlerScript栏&#xff1b;如下图&#xff1a; 2、ctrlf搜索“static function main” 3、在main函数里加入下面一行代码&…

Kafka极客 - 09 Kafka Java Consumer 多线程开发实例

文章目录1. Kafka Java Consumer 设计原理2. 多线程方案3. 代码实现4. 问题思考目前&#xff0c;计算机的硬件条件已经大大改善&#xff0c;即使是在普通的笔记本电脑上&#xff0c;多核都已经是标配了&#xff0c;更不用说专业的服务器了。如果跑在强劲服务器机器上的应用程序…

对称美学 华为OD真题 100

import java.util.Scanner; import java.util.*; import java.util.stream.Collectors; import java.math.BigInteger;class Main {public static void main(String[] args) {// 处理输入Scanner in new Scanner(System.in);int t in.nextInt();long[][] cases new long[t][…

Python学习笔记-模块

目录 一、模块的概念 二、自定义模块 1.创建模块 2.使用import语句导入模块 3.使用from...import 语句导入模块 4.模块搜索目录 4.1模块默认搜索目录 4.2临时添加目录 4.3增加.pth文件 4.4 在PYTHONPATH环境变量中添加 三、以主程序的形式执行 四、python中的包&am…

计算机毕业设计php_thinkphp_vue的家乡石泉网站-乡村家乡旅游信息网站

运行环境 开发语言&#xff1a;PHP 数据库:MYSQL数据库 应用服务:apache服务器 使用框架:ThinkPHP&#xff1a;vue 开发工具:VScode/Dreamweaver/PhpStorm等均可 项目简介 目前家乡石泉市是一个有不同民族“大杂居,小聚居”的地方,所以对于发展家乡特色业还是比较有优势…

C++初阶 priority_queue(优先级队列)的使用和模拟实现

作者&#xff1a;小萌新 专栏&#xff1a;C初阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍优先级队列的使用和模拟实现 优先级队列的使用和模拟实现priority_queue的使用priority_queue的介绍priority_queue的定义priority…

Solid.js前端新秀框架 力压 web3.js 框架

SolidJS 是什么&#xff1f;SolidJS是一个声明式、高效且灵活用于构建用户界面的 JavaScript 库。 Solid 号称拥有 JSX 语法&#xff0c;类似于 React hook 的语法&#xff0c;你可以用现代化的开发方式&#xff0c;获得性能最快的代码。 框架本身只有7 KB大小&#xff0c;无需…

【在SpringBoot项目中删除相册数据--Controller层】

在AlbumController中添加处理请求的方法&#xff1a; 请求路径&#xff1a;/album/delete请求方式&#xff1a;POST请求参数&#xff1a;Long id响应结果&#xff1a;JsonResult >>> state:20000 具体代码为&#xff1a; // http://localhost:9080/album/delete ApiO…

常用Assignment写作句型怎么积累?

Assignment是留学生在国外留学期间常见的写作内容。很多留学生在最初接触Assignment时往往会感到无从下手&#xff0c;更不知道该怎么去表达自己想要表达的内容。其实&#xff0c;Assignment写作并没有想象中那么难&#xff0c;在Assignment写作中有很多句型是经常用到的&#…

Windows win10 win11 多屏幻灯片放映壁纸 多屏设置不同的壁纸 多屏不同幻灯片壁纸

背景&#xff1a;windows 可以右键为不同的显示器设置不同的壁纸&#xff08;需要先关闭虚拟桌面&#xff09;。但是 slideshow 的不支持多个屏幕。 目前看这个问题是没有官方的方案的&#xff0c;理论上有一个收费软件可以解决&#xff0c;或者用*版&#xff0c;但是不想给钱…

React Fiber树的构建和替换过程

文章の目录前言mount 过程update 过程写在最后前言 React Fiber树的创建和替换过程运用了双缓存技术&#xff0c;即先在内存中创建 fiber 树&#xff0c;待 fiber 树创建完成以后&#xff0c;直接将旧的 fiber 树替换成新的 fiber 树&#xff0c;这样做的好处是省去了直接在页…

datax之channel学习

一般来说datax只需要我们设置reader和writer&#xff0c;但是是什么连接了reader和writer呢&#xff1f; 就是channel&#xff01; 这个有什么用&#xff1f; 慢慢学习。 core.json [devusercdp-node12 /data/DATA_DIR/share/dataingestion/conf]$ cat core.json { &quo…

应急物资仓库可视化管理系统-智慧应急物资装备管理系统

1. 项目概述 应急物资仓库可视化系统(智慧物资管理系统 DW-S300)是一套成熟系统&#xff0c;依托互 3D 技术、云计算、大数据、RFID 技术、数据库技术、AI、视频分析技术对 RFID 智能仓库进行统管理、分析的信息化、智能化、规范化的系统。 应急物资&#xff0c;是每当灾害发…

Cyanine7 NHS|CY7-N-羟基琥珀酰亚胺|CY7-NHS ester

Cyanine7 NHS|CY7-N-羟基琥珀酰亚胺|CY7-NHS ester 中文名称&#xff1a;CY7-N-羟基琥珀酰亚胺 英文名称&#xff1a;Cyanine7 NHS 性 状&#xff1a;深绿色粉末 分子量&#xff1a;827.94 Abs/Em Maxima&#xff1a;675/694nm 分子式&#xff1a;C41H46N3NaO10S2 溶解性…

【网站架构】项目越迭代越难、严重延期?那是没处理好变化

大家好&#xff0c;欢迎来到停止重构的频道。 本期&#xff0c;我们讨论网站系统的扩展性。 扩展性指的是网站系统应该如何更好地处理需求变化、版本迭代。 对于有几个项目经验的人来说&#xff0c;可能对这样的问题不以为然&#xff0c;毕竟devops、CI/CD、git、敏捷开发、…

Pytest测试框架(一):Pytest介绍与安装,Pytest编写规则及pytest.main()的参数

Pytest测试框架(1)&#xff1a;Pytest介绍与安装 pytest简介&#xff1a; pytest是python的第三方单元测试框架&#xff0c;比自带的unittest更简洁和高效&#xff0c;同时兼容unittest框架。 它还有如下优点&#xff1a; 1、简单灵活&#xff0c;容易上手&#xff0c;文档丰…

计算机毕业设计django基于python精品课程在线学习系统

项目介绍 在各学校的教学过程中,租房系统是一项非常重要的事情。随着计算机多媒体技术的发展和网络的普及。采用当前流行的B/S模式以及3层架构的设计思想通过Python技术来开发此系统的目的是建立一个配合网络环境的精品课程系统的平台,这样可以有效地解决课程学习系统混乱的局…

线上卡顿监控

文章目录1. 卡顿与ANR的关系2. 卡顿原理3. 卡顿监控3.1 WatchDog3.2 Looper Printer3.2.1 监控TouchEvent卡顿3.2.2 监控IdleHandler卡顿3.2.3 监控SyncBarrier泄漏4. 小结平时看博客或者学知识&#xff0c;学到的东西比较零散&#xff0c;没有独立的知识模块概念&#xff0c;而…