Canvas 基础(一)
canvas 系列:
一、前言
最近在看到公众号文章,关于流星雨的,看着效果挺好。就跟着做了。
在做的过程中,对 Canvas 有了一些了解。同时在使用过程中会有一些问题。在这里总结记录下。
二、width、height
首先 canvas 元素有自己的属性 width、height。同时也可以设置 CSS 的 width、height。
对于这两者的区别,最开始我以为是一样的。只有在 CSS 中设置就好了。
但是两者完全不一样。在 MDN 有这样一句话:当没有设置宽度和高度的时候,canvas会初始化宽度为300像素和高度为150像素。
是的,有默认值。
所以,我以为的流星雨效果是这样:
可是当没有设置 canvas 属性 width、height时是这样
这是什么鬼。
再回头看看 MDN 上面的说明:如果CSS的尺寸与初始画布的比例不一致,它会出现扭曲。
我只是设置了 CSS 的尺寸,没有设置 canvas 画布尺寸。两者不一样,而且差距有点大,就出现扭曲、变形。
一般是这样设置的:
// 这里设定,css 中已经设置了尺寸 var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); canvas.width = canvas.offsetWidth canvas.height = canvas.offsetHeight
这样设置后看到了想要的效果。
三、beginPath、moveTo 的使用
beginPath 是开始绘制一段路径。
一般路径绘制完成,要使用 stroke 或者 fill 进行绘制或者填充。
但是想绘制多段路径怎么办呢?
1、每次都调用 beginPath、stroke
实现如下:
this.canvasTxt.beginPath() this.canvasTxt.arc(250, 150, 50, 0, Math.PI * 2, true) this.canvasTxt.stroke() this.canvasTxt.beginPath() this.canvasTxt.arc(250, 150, 35, 0, Math.PI, false) this.canvasTxt.stroke() this.canvasTxt.beginPath() this.canvasTxt.arc(235, 120, 5, 0, Math.PI * 2, true) this.canvasTxt.stroke() this.canvasTxt.beginPath() this.canvasTxt.arc(265, 120, 5, 0, Math.PI * 2, true) this.canvasTxt.stroke()
2、从一个路径到另外一个路径使用 moveTo
如下面的代码:
this.canvasTxt.beginPath() this.canvasTxt.arc(250, 150, 50, 0, Math.PI * 2, true) this.canvasTxt.moveTo(285, 150) this.canvasTxt.arc(250, 150, 35, 0, Math.PI, false) this.canvasTxt.moveTo(240, 120) this.canvasTxt.arc(235, 120, 5, 0, Math.PI * 2, true) this.canvasTxt.moveTo(270, 120) this.canvasTxt.arc(265, 120, 5, 0, Math.PI * 2, true) this.canvasTxt.stroke()
如果都是路径的绘制,可以使用 moveTo 更简洁方便。
但是其中如果有是需要 fill 的,那么就需要使用第一种方法了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端