canvas的HTML和JavaScript

news2024/9/29 11:29:19

文章目录

  • 一、canvas元素
  • 二、前期准备
    • 1. 坐标系
    • 2. canvas属性
      • ① 获取canvas元素
      • ② 把canvas实例化为2D
      • ③ 设置路径颜色
      • ④ 设置路径宽度
      • ⑤ 设置路径末端形状
      • ⑥ 设置路径相连时的相连部分形状
      • ⑦ 透明度
      • ⑦ 虚线
  • 三、绘制图行
    • 1. 绘制线段
    • 2. 绘制三角形
      • ① 空心三角形
      • ② 实心三角形
    • 3. 绘制矩形
      • ① 空心矩形
      • ② 实心矩形
    • 4. 绘制圆和圆弧
      • ① 圆
      • ② 圆弧
      • ③ 半圆
      • ③ 圆弧和点连接
    • 5. 椭圆
    • 6. 贝塞尔曲线
      • ① 一次贝塞尔
      • ② 二次贝塞尔
      • ③ 三次贝塞尔
  • 四、绘制文本
    • 1. 文本属性
      • ① font
      • ② textAlign
      • ③ textBaseline
      • ④ direction
    • 2. 绘制文本
    • 3. 获取文本属性

一、canvas元素

  • canvas只能在html中定义width和height。默认是宽300px、高150px。
<canvas id="canvas" width="1200" height="800">
	你的浏览器不支持canvas,请升级你的浏览器
</canvas>

二、前期准备

绘制都建立在 HTML 中有 canvas 元素的基础上。

1. 坐标系

在这里插入图片描述

2. canvas属性

① 获取canvas元素

const canvas = document.getElementById('canvas')

② 把canvas实例化为2D

const ctx = canvas.getContext("2d");

③ 设置路径颜色

ctx.strokeStyle = "blue";

④ 设置路径宽度

ctx.lineWidth = 5;

⑤ 设置路径末端形状

butt:线段末端以方形结束。
round:线段末端以圆形结束。
square:线段末端以方形结束,但是增加了一个宽度和线段相同,高度是线段厚度一半的矩形区域。

ctx.lineCap = "round"; // butt、round、square

⑥ 设置路径相连时的相连部分形状

round:通过填充一个额外的,圆心在相连部分末端的扇形,绘制拐角的形状。圆角的半径是线段的宽度。
bevel:在相连部分的末端填充一个额外的以三角形为底的区域,每个部分都有各自独立的矩形拐角。
miter:通过延伸相连部分的外边缘,使其相交于一点,形成一个额外的菱形区域。这个设置可以通过 miterLimit 属性看到效果。

ctx.lineJoin = "round";  // round、bevel、miter

⑦ 透明度

  • 0 表示完全透明,1 表示完全不透明
globalAlpha = 1

⑦ 虚线

  • setLineDash(<segments-array>) 方法在填充线时使用虚线模式
  • 数组中的长度交替绘制线段和间距。
const canvas = document.querySelector("canvas")
if(!canvas.getContext) throw SyntaxError();
let ctx = canvas.getContext('2d');

ctx.beginPath()
ctx.setLineDash([20, 10, 3, 3]);
ctx.moveTo(100, 100);
ctx.lineTo(500, 100);
ctx.stroke()
ctx.closePath()

在这里插入图片描述

三、绘制图行

1. 绘制线段

  • 线从 (30, 50) 处开始,并在 (150, 100) 处结束。
  • moveTo(x, y):移动画笔到 (x, y)
  • lineTo(x, y):连接线段到 (x, y)
  • stroke():绘制路径。样式要永远放在stroke之上,否则无效。(fill同理)
  • beginPath():清空子路径列表开始一个新路径
  • closePath():笔点返回到当前子路径起始点
const canvas = document.querySelector("canvas")
if(!canvas.getContext) throw SyntaxError();
let ctx = canvas.getContext('2d');

ctx.beginPath()
ctx.moveTo(30, 50);
ctx.lineTo(150, 100);
ctx.moveTo(100, 50);
ctx.lineTo(220, 100);
ctx.closePath()
ctx.stroke();

在这里插入图片描述

2. 绘制三角形

① 空心三角形

const canvas = document.querySelector("canvas")
if(!canvas.getContext) throw SyntaxError();
let ctx = canvas.getContext('2d');

ctx.beginPath()
ctx.moveTo(200, 200);
ctx.lineTo(500, 200);
ctx.lineTo(500, 500);
ctx.lineTo(200, 200);
ctx.strokeStyle = "blue";
ctx.lineWidth = 20;
ctx.closePath()
ctx.stroke();

在这里插入图片描述

② 实心三角形

  • stroke是绘制路径,fill是填充。只需要把 stroke... 替换成 fill... 即可。
const canvas = document.querySelector("canvas")
if(!canvas.getContext) throw SyntaxError();
let ctx = canvas.getContext('2d');

ctx.beginPath()
ctx.moveTo(200, 200);
ctx.lineTo(500, 200);
ctx.lineTo(500, 500);
ctx.lineTo(200, 200);
ctx.fillStyle = "blue";
ctx.lineWidth = 20;
ctx.closePath()
ctx.fill();

在这里插入图片描述

3. 绘制矩形

① 空心矩形

  • strokeRect()rect():参数都是 x, y, width, height
const canvas = document.querySelector("canvas")
if(!canvas.getContext) throw SyntaxError();
let ctx = canvas.getContext('2d');

// 方法一,比较繁琐
ctx.beginPath()
ctx.moveTo(100, 100);
ctx.lineTo(100, 200);
ctx.lineTo(200, 200);
ctx.lineTo(200, 100);
ctx.lineTo(100, 100);
ctx.strokeStyle = "blue";
ctx.lineWidth = 2;
ctx.closePath()
ctx.stroke();

// 方法二,同时连接路径和绘制
ctx.beginPath()
ctx.strokeStyle = "red";
ctx.lineWidth = 2;
ctx.strokeRect(300, 100, 100, 100);
ctx.closePath()

// 方法三,路径和绘制分开
ctx.beginPath()
ctx.rect(500, 100, 100, 100);
ctx.strokeStyle = "yellow";
ctx.lineWidth = 2;
ctx.stroke();
ctx.closePath()

在这里插入图片描述

② 实心矩形

  • 同样是三种方法。把stroke替换成fill就能绘制出实心矩形。
const canvas = document.querySelector("canvas")
if(!canvas.getContext) throw SyntaxError();
let ctx = canvas.getContext('2d');

// 方法一
ctx.beginPath()
ctx.moveTo(100, 100);
ctx.lineTo(100, 200);
ctx.lineTo(200, 200);
ctx.lineTo(200, 100);
ctx.lineTo(100, 100);
ctx.fillStyle = "blue";
ctx.lineWidth = 2;
ctx.closePath()
ctx.fill();

// 方法二
ctx.beginPath()
ctx.fillStyle = "red";
ctx.lineWidth = 2;
ctx.fillRect(300, 100, 100, 100);
ctx.closePath()

// 方法三
ctx.beginPath()
ctx.rect(500, 100, 100, 100);
ctx.fillStyle = "yellow";
ctx.lineWidth = 2;
ctx.fill();
ctx.closePath()

在这里插入图片描述

4. 绘制圆和圆弧

接下来将不再区分实心和空心。根据下方的实例可以得出下图角度图。
在这里插入图片描述

① 圆

  • 使用 arc() 方法
  • 写法:ctx.arc(x, y, radius, startAngle, endAngle[, anticlockwise]);
  • 其中角度使用弧度制,顺逆时针方向anticlockwise为可选。
const canvas = document.querySelector("canvas")
if(!canvas.getContext) throw SyntaxError();
let ctx = canvas.getContext('2d');

ctx.beginPath()
ctx.fillStyle = "blue";
ctx.lineWidth = 2;
ctx.arc(100,100,50,(Math.PI / 180) * 0,(Math.PI / 180) * 360)
ctx.stroke()
ctx.closePath()

在这里插入图片描述

② 圆弧

  • 方法一:使用 arc 方法。参数上面都有提到
  • 方法二:使用 arcTo 方法。写法:ctx.arcTo(x1, y1, x2, y2, radius);
  • (x1, y1) 表示角顶点,(x2, y2)表示第二条边。
const canvas = document.querySelector("canvas")
if(!canvas.getContext) throw SyntaxError();
let ctx = canvas.getContext('2d');

ctx.setLineDash([])
ctx.beginPath();
ctx.moveTo(150, 20);
ctx.arcTo(150,100,50,20,30);
ctx.stroke();

ctx.fillStyle = 'blue';
// base point
ctx.fillRect(150, 20, 10, 10);

ctx.fillStyle = 'red';
// control point one
ctx.fillRect(150, 100, 10, 10);
// control point two
ctx.fillRect(50, 20, 10, 10);
//
ctx.setLineDash([5,5])
ctx.moveTo(150, 20);
ctx.lineTo(150,100);
ctx.lineTo(50, 20);
ctx.stroke();
ctx.beginPath();
ctx.arc(120,38,30,0,2*Math.PI);
ctx.stroke();

在这里插入图片描述

const canvas = document.querySelector("canvas")
if(!canvas.getContext) throw SyntaxError();
let ctx = canvas.getContext('2d');

// 方法一
ctx.beginPath()
ctx.fillStyle = "blue";
ctx.lineWidth = 2;
ctx.arc(100, 100, 50, (Math.PI / 180) * 0, (Math.PI / 180) * 180);
ctx.stroke()
ctx.closePath()

// 方法二
ctx.beginPath();
ctx.strokeStyle = "red"
ctx.moveTo(300, 100);
ctx.arcTo(350, 250, 400, 50, 40);
ctx.stroke();

在这里插入图片描述

③ 半圆

  • 即闭合圆弧
const canvas = document.querySelector("canvas")
if(!canvas.getContext) throw SyntaxError();
let ctx = canvas.getContext('2d');

ctx.beginPath()
ctx.fillStyle = "blue";
ctx.lineWidth = 2;
ctx.arc(100, 100, 50, (Math.PI / 180) * 0, (Math.PI / 180) * 180);
ctx.closePath()
ctx.stroke()

在这里插入图片描述

③ 圆弧和点连接

  • 多绘制一条直线,最后起止点相连。
const canvas = document.querySelector("canvas")
if(!canvas.getContext) throw SyntaxError();
let ctx = canvas.getContext('2d');

ctx.beginPath()
ctx.fillStyle = "blue";
ctx.lineWidth = 2;
ctx.arc(100, 100, 50, (Math.PI / 180) * 30, (Math.PI / 180) * 330);
ctx.lineTo(100, 100);
ctx.closePath()
ctx.stroke()

在这里插入图片描述

5. 椭圆

  • ellipse():绘制椭圆路径
  • 写法:ctx.ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle[, anticlockwise]);
  • (x, y) 为圆心,radiusX为长轴半径,radiusY为短轴半径,rotation为旋转角度,角度均为弧度制。
const canvas = document.querySelector("canvas")
if(!canvas.getContext) throw SyntaxError();
let ctx = canvas.getContext('2d');

ctx.beginPath()
ctx.ellipse(100, 100, 50, 100, (Math.PI / 180) * 45, 0, (Math.PI / 180) * 360);
ctx.stroke()
ctx.closePath()

在这里插入图片描述

6. 贝塞尔曲线

① 一次贝塞尔

  • 是一根直线

② 二次贝塞尔

  • quadraticCurveTo():绘制二次贝塞尔曲线路径
  • 语法:ctx.quadraticCurveTo(cpx, cpy, x, y);
  • (cpx, cpy)是控制点坐标,(x, y) 是结束点坐标。
const canvas = document.querySelector("canvas")
if(!canvas.getContext) throw SyntaxError();
let ctx = canvas.getContext('2d');

ctx.beginPath()
ctx.moveTo(100,100)
ctx.quadraticCurveTo(150, 150, 200, 100);
ctx.stroke()
ctx.closePath()

在这里插入图片描述

③ 三次贝塞尔

  • bezierCurveTo(): 绘制三次贝赛尔曲线路径
  • 语法:ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
  • 参数同二次贝塞尔类似,只多了一个控制点。
const canvas = document.querySelector("canvas")
if(!canvas.getContext) throw SyntaxError();
let ctx = canvas.getContext('2d');

ctx.beginPath()
ctx.moveTo(100,100)
ctx.bezierCurveTo(150, 150, 200, 50, 250, 100);
ctx.stroke()
ctx.closePath()

在这里插入图片描述

四、绘制文本

1. 文本属性

① font

  • 设置文本大小和字体。
  • 语法:ctx.font = "40px Verdana";

② textAlign

  • 设置文本水平对齐方式。
  • 可选参数有 left、right、center、start、end
  • 语法:ctx.textAlign = "center";

③ textBaseline

  • 设置文本垂直对齐方式。
  • 可选参数有 alphabetic、top、hanging、middle、ideographic、bottom
  • 语法:ctx.textBaseline = "middle";

④ direction

  • 设置文本的绘制方向
  • 可选参数有 ltr(left to right)、rtl(right to left)
  • 语法:ctx.direction = 'ltr'

2. 绘制文本

  • strokeText():在给定的 (x, y) 位置绘制文本
  • 语法:ctx.strokeText(text, x, y [, maxWidth]);
  • 如果超过了 maxWidth, 会缩小字体。
const canvas = document.querySelector("canvas")
if(!canvas.getContext) throw SyntaxError();
let ctx = canvas.getContext('2d');

ctx.beginPath()
ctx.font = "50px Verdana"
ctx.strokeText("Hello", 100, 100);
ctx.closePath()

在这里插入图片描述

3. 获取文本属性

  • measureText():被测量文本对象包含的信息
const canvas = document.querySelector("canvas")
if(!canvas.getContext) throw SyntaxError();
let ctx = canvas.getContext('2d');

ctx.beginPath()
ctx.font = "50px Verdana"
ctx.strokeText("Hello", 100, 100);
console.log(ctx.measureText("Hello"));
ctx.closePath()

在这里插入图片描述

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

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

相关文章

大学四年,我建议你这么学网络安全

在所有关注我的朋友中&#xff0c;大致分为两类&#xff0c;一类是社会人士&#xff0c;有的是安全老手&#xff0c;有的是其它工作但对安全感兴趣的朋友&#xff0c;另一类应该就是大学生了。 尤其随着国家的号召和知识的普及&#xff0c;越来越多的人开始对网络安全感兴趣&a…

ffmpeg日记1011-过滤器-语法高阶,逻辑,函数使用

Author: wencoo Blog&#xff1a;https://wencoo.blog.csdn.net/ Date: 19/05/2023 Details:文章目录 摘要什么是时间线编辑哪些filter支持时间线编辑时间线编辑中&#xff0c;可以使用哪些预设函数常用预设函数功能即使用方法if(x, y)if(x, y, z)gt(x, y)gte(x, y)lt(x, y)lte…

AHB-to-APB Bridge——04apb_tran、apb_if、apb_drv、mem、apb_mon、apb_agt

apb_if放入所有apb需要的信号&#xff0c;以及cb ifndef APB_IF_SV define APB_IF_SVinterface apb_if;logic pclk;logic prst;logic penable;logic …

C++的stack和queue

stack和queue 1.stackstack的模拟实现 2.queuequeue的模拟实现 3.容器适配器3.1. 什么是容器适配器3.2. STL标准库中stack和queue的底层结构3.3. deque的简单介绍3.3.1. deque原理介绍3.3.2. deque的缺陷3.3.3. 为什么选择deque作为stack和queue的底层默认容器 1.stack stack的…

深度学习-第T7周——咖啡豆识别

深度学习-第T7周——咖啡豆识别 深度学习-第T7周——咖啡豆识别一、前言二、我的环境三、前期工作1、导入数据集2、查看图片数目 四、数据预处理1、 加载数据1、设置图片格式2、划分训练集3、划分验证集4、查看标签 2、数据可视化3、检查数据4、配置数据集 五、搭建CNN网络六、…

Vue3+TS知识点补充

一、关于Ref 1.shallowRef() shallowRef 是 Vue 3 中新引入的响应式数据类型之一&#xff0c;它与 ref 类型非常相似&#xff0c;但是有一些不同点。 不同的是&#xff0c;shallowRef 只会对其包装的对象进行浅层次的响应式处理&#xff0c;即如果这个对象的子属性发生改变&…

软件测试——黑盒测试

1.测试概述 1.1综述 本测试报告为计算机程序能力在线测评系统的黑盒测试&#xff0c;黑盒测试可以在不知道程序内部结构和代码的情况下进行&#xff0c;用来测试软件功能是否符合用户需求&#xff0c;是否达到用户预期目标&#xff0c;是否拥有较好的人机交互体验。 图1.1 黑…

media设备节点初始化与Video4Linux初始化

media设备节点初始化与Video4Linux初始化 文章目录 media设备节点初始化与Video4Linux初始化media设备节点初始化Video4Linux初始化 media设备节点初始化 media_devnode_init函数是一个内核初始化函数&#xff0c;用于在Linux内核启动期间进行设备节点初始化。 函数的主要作用…

复习:遥感图像解译复习整理

惭愧&#xff0c;这个课程从始自终就没有认真学过&#xff0c;一部分是因为自己的原因&#xff0c;另一部分也是因为自己的原因。因此&#xff0c;对于整理的资料有不足之处请指正。 另外&#xff0c;资料自word复制&#xff0c;没有时间整理博客的格式。 -- 2023年05月19日记…

深度学习训练营之Densenet网络

深度学习训练营 原文链接环境介绍前言设计理念网络结构实验结果和讨论pytorch实现DenseNet附录 原文链接 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;365天深度学习训练营-第J3周&#xff1a;Densenet网络学习&…

第一代AIGC硬件悄然爆发

文 | 智能相对论 作者 | 叶远风 看起来&#xff0c;这可能是一副正常的黑框眼镜&#xff0c;你戴上去彬彬有礼、斯斯文文&#xff1b; 实际上&#xff0c;它里边还装了一个“小伙伴”&#xff0c;你随时可以与它交流&#xff0c;谈天说地或者提出各种问题接受它的帮助&#x…

深度学习之构建MPL神经网络——泰坦尼克号乘客的生存分析

大家好&#xff0c;我是带我去滑雪&#xff01; 本期使用泰坦尼克号数据集&#xff0c;该数据集的响应变量为乘客是生存还是死亡&#xff08;survived&#xff0c;其中1表示生存&#xff0c;0表示死亡&#xff09;&#xff0c;特征变量有乘客舱位等级&#xff08;pclass&#x…

广告投放的关键成功因素:广告归因与广告效果监测

在当今竞争激烈的市场环境中&#xff0c;广告归因和广告效果监测成为了广告投放中至关重要的环节。通过深入了解广告归因和广告效果监测的方法&#xff0c;企业可以更好地评估广告投放的成效&#xff0c;并做出精确的决策&#xff0c;以提高广告效果和最大化投资回报。 本文将带…

昆仑万维“勇闯”百模大战:一个“无懈可击”的商业故事话本?

文丨智能相对论 作者丨沈浪 新能源火了做新能源&#xff0c;元宇宙火了做元宇宙。 如果一个热点领域没有昆仑万维的身影&#xff0c;那一定是这个领域还不够“热”&#xff0c;爆不了。 但凡是热到爆的领域&#xff0c;昆仑万维虽迟但到。 不过&#xff0c;这样说可能有些…

【计算机网络基础】章节测试3 数据链路层

文章目录 判断题选择题辨析题应用题 判断题 相对于广域网而言&#xff0c;局域网的误码率较低。√ 交换机是依据IP地址来转发数据包的。 局域网使用集线器作为网络连接设备时&#xff0c;逻辑上是星型结构。 PPP协议应首先满足的需求是简单&#xff0c;以使得协议在实现的时…

Go语言的学习【2】基础语法

目录 代码组成部分字符串格式化字符数据类型变量遇到的问题及解决办法1 代码组成部分 Go 程序可以由多个标记组成&#xff0c;可以是关键字&#xff0c;标识符&#xff0c;常量&#xff0c;字符串&#xff0c;符号。 在 Go 程序中&#xff0c;一行代表一个语句结束。 如果你…

【linux】图文并茂,让你轻松掌握Linux基本指令

目录 一&#xff0c;前提 二&#xff0c; 在root身份下&#xff0c;管理用户 1. 判断身份 2. 创建用户 3. 销毁用户 三&#xff0c;文件增&#xff0c;删&#xff0c;移动指令 1. pwd——查看路径 2. ps ——打开文件目录 3. touch——创建文件 4. nano——打开文件 5.…

【大数据】Presto(Trino)REST API 与执行计划介绍

文章目录 一、概述二、环境准备三、常用 REST API1&#xff09;worker 节点优雅退出2&#xff09;提交SQL查询请求3&#xff09;获取查询状态4&#xff09;获取查询结果5&#xff09;取消查询请求6&#xff09;获取Presto 节点信息7&#xff09;获取Presto服务器使用统计信息8&…

功率放大器电路中的三极管和MOS管,究竟有什么区别?

学习模拟电子技术基础&#xff0c;和电子技术相关领域的朋友&#xff0c;在学习构建功率放大器电路时最常见的电子元器件就是三极管和场效应管&#xff08;MOS管&#xff09;了。那么三极管和MOS管有哪些联系和区别呢&#xff1f;在构建功率放大器电路时我们要怎么选择呢&#…

干货 | 利用SPSS进行高级统计分析第一期

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐&#xff5e; 你是否还在为分析实验数据而感到头疼&#xff1f;你是否还在苦于自己不知道如何选择合适的模型来分析数据&#xff1f; 本期我们就来为大家带来了利用SPSS软件进行高级统计分析…