好程序员:前端JavaScript全解析——Canvas绘制形状(下)
myzbx 2025-05-08 03:33 25 浏览
接着上一篇,好程序员继续讲解前端技术文章!
绘制椭圆
●canvas 也提供了绘制椭圆的 API
●语法 : 工具箱.ellipse( x, y, radiusX, radiusY, rotation, startAngle, endAngle, antiClockwise )
○x : 椭圆中心点的 x 轴坐标
○y : 椭圆中心点的 y 轴坐标
○radiusX : 椭圆在 x 轴方向上的半径
○radiusY : 椭圆在 y 轴方向上的半径
○rotation : 旋转弧度
○startAngle : 弧线开始弧度
○endAngle : 弧线结束弧度
○antiClockwise : 方向, false 表示逆时针绘制(默认), true 表示顺时针绘制
●注意 :
○计算弧度的方式和之前我们画圆的时候是一样的
○旋转弧度是指讲该椭圆进行旋转
●语法有了, 我们现在开始试一下
// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')
// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')
ctx.strokeStyle = '#000'
ctx.lineWidth = 2
// 2. 绘制椭圆
ctx.ellipse( 300, 150, 200, 100, 0, 0, Math.PI * 2, false )
// 3. 描边
ctx.stroke()
复制代码
●这样我们一个椭圆就出来了, 咱们来详细解释一下这些内容的意义
●旋转弧度, 就是在现在的基础上, 让整个图形进行旋转
绘制阴影
●canvas 中也是可以绘制阴影的
●不管是描边还是填充, 都可以绘制阴影
●但是要在 描边 或者 填充 之前, 进行阴影设置就好
// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')
// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')
ctx.strokeStyle = '#000'
ctx.lineWidth = 2
// 2. 绘制椭圆
ctx.ellipse( 300, 150, 200, 100, 0, 0, Math.PI * 2, false )
// 3. 设置阴影
// 3-1. 设置阴影颜色
ctx.shadowColor = 'red'
// 3-2. 设置阴影模糊成都
ctx.shadowBlur = 20
// 3-3. 设置阴影 x 轴方向偏移量
ctx.shadowOffsetX = 50
// 3-4. 设置阴影 y 轴方向偏移量
ctx.shadowOffsetY = 50
// 4. 描边
ctx.stroke()
复制代码
●阴影就出来了, 填充的图形, 阴影也是一个道理
绘制虚线
●canvas 中绘制虚线比较简单, 只要配置好虚线方案即可
●但是在配置虚线方案的时候, 我们需要多一些思考
●语法 : 工具箱.setDashLine([ 第一段长度, 第二段长度, ... ])
这个解释起来稍微复杂一些
我们都知道虚线就是一段有一段没有
按照有和没有区分, 我们可以把一个虚线分成一段一段的
●先来看一个例子
// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')
// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')
console.log(ctx)
// 2. 设置虚线方案
// 其实就是 5px 和 10px 重复出现
ctx.setLineDash([ 5, 10 ])
// 3. 绘制线段
ctx.moveTo( 100, 100 )
ctx.lineTo( 400, 100 )
ctx.strokeStyle = '#000'
ctx.lineWidth = 10
ctx.stroke()
复制代码
●现在看起来很简单, 但是我们讲方案稍作修改
// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')
// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')
console.log(ctx)
// 2. 设置虚线方案
// 其实就是 5px 和 10px 和 15px 重复出现
ctx.setLineDash([ 5, 10, 15 ])
// 3. 绘制线段
ctx.moveTo( 100, 100 )
ctx.lineTo( 400, 100 )
ctx.strokeStyle = '#000'
ctx.lineWidth = 10
ctx.stroke()
复制代码
●我们会看到出现了一个奇奇怪怪的图形, 这是为什么呢
其实我们先来看虚线方案
ctx.setLineDash([ 5, 10, 15 ])
也就是说, 在描述这个虚线的时候, 是 5px, 10px, 15px, 5px, 10px, 15px, ... 这样重复
在一个虚线的绘制过程中, 第一段是 有内容, 第二段是 空白, 第三段是 有内容, ... 重复
所以,
第一段有内容的就是 5px
第二段空白的就是 10px
第三段又是有内容, 那么就是 15px
第四段是空白内容, 回到 5px 重复
第五段是有内容, 就到了 10px
第六段是空白内容, 就是 15px
至此, 才是一个完整的 虚线方案 和 虚线绘制 配套的第一个重复片段
●建议 : 如果不是特殊需要, 一般来说, 虚线绘制方案我们进行采取两个数字重复绘制文本
●canvas 内可以直接绘制文本的, 不需要我们用线条去绘制
●而且我们绘制字体的时候可以有两种
○描边字体
// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')
// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')
console.log(ctx)
// 2. 开始绘制文本
// 2-1. 准备一段要绘制的文本内容
const text = '千锋 - 数字智慧大前端'
// 2-2. 设置字体内容
// 语法: 工具箱.font = '字号大小 字体'
ctx.font = '30px Arial'
// 2-3. 设置描边颜色
ctx.strokeStyle = '#000'
// 2-4. 绘制描边字体
// 语法: 工具箱.strokeText( 文本, 文本开始 X 坐标, 文本开始 Y 坐标 )
ctx.strokeText(text, 100, 100)
// 2-5. 设置填充颜色
ctx.fillStyle = 'skyblue'
// 2-6. 绘制填充字体
// 语法: 工具箱.fillText( 文本, 文本开始 X 坐标, 文本开始 Y 坐标 )
ctx.fillText(text, 100, 220)
复制代码
●这样我们的文字就绘制出来了
●接下来就是绘制一些文字相关的细节绘制文字阴影
●和刚才我们的绘制阴影是一样的
●只要在绘制之前把阴影属性设置好即可
// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')
// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')
console.log(ctx)
// 设置阴影信息
ctx.shadowColor = 'red'
ctx.shadowBlur = 5
ctx.shadowOffsetX = 50
ctx.shadowOffsetY = 50
// 2. 开始绘制文本
// 2-1. 准备一段要绘制的文本内容
const text = '千锋 - 数字智慧大前端'
// 2-2. 设置字体内容
ctx.font = '30px Arial'
// 2-3. 设置描边颜色
ctx.strokeStyle = '#000'
// 2-4. 绘制描边字体
ctx.strokeText(text, 100, 100)
// 2-5. 设置填充颜色
ctx.fillStyle = 'skyblue'
// 2-6. 绘制填充字体
ctx.fillText(text, 100, 220)
复制代码
设置文字对其方式
●在 canvas 内, 对于文字的对其方式修饰就是两种
○水平方向
○垂直方向
●水平方向对其
○语法 : 工具箱.textAlign = '值'
○值
start : 默认, 文本在指定的位置开始
end : 文本在指定的位置结束
center : 文本的中心被放置在指定的位置
left : 文本左对齐
right : 文本右对齐
○注意 : 这里指定的值是指你在使用 fillText 或者 strokeText 时设置的 x 轴坐标位置
●垂直对其方式
○语法 : 工具箱.testBaseline = '值'
○值
alphabetic:默认,文本基线是普通的字母基线
top:文本基线是 em 方框的顶端
hanging:文本基线是悬挂基线
middle:文本基线是 em 方框的正中
ideographic: 文本基线是 em 基线
bottom:文本基线是 em 方框的底端
○其实和我们学习 css 的时候的对其方式是一样的
获取文本信息
●有的时候, 我们可能需要给文本加一个下划线
●或者在某些时候, 我们需要把文本包裹在一个矩形框内
●那么这个时候, 我们就要拿到你写的这一段文本, 在画布上占多宽
●这个时候, 我们就可以获取文本信息了
●当你已经设置好文本信息以后, 不需要绘制的时候, 就可以拿到将来文本会在画布上占据多少信息
●语法 : 工具箱.measureText( 文本内容 )
// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')
// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')
console.log(ctx)
// 2. 开始绘制文本
// 2-1. 准备一段要绘制的文本内容
const text = '千锋 - 数字智慧大前端'
// 2-2. 设置字体内容
ctx.font = '30px Arial'
// 2-3. 设置描边颜色
ctx.strokeStyle = '#000'
// 获取字体信息
const textInfo = ctx.measureText(text)
console.log(textInfo) // 完整字体信息
console.log(textInfo.width) // 字体在画布上所占据的宽度
复制代码虚线文本
●其实就是在绘制一个描边文本的时候
●在绘制之前, 把虚线方案给到 canvas 即可
// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')
// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')
console.log(ctx)
// 2. 开始绘制文本
// 2-1. 准备一段要绘制的文本内容
const text = '千锋 - 数字智慧大前端'
// 2-2. 设置字体内容
ctx.font = '30px Arial'
// 2-3. 设置描边颜色
ctx.strokeStyle = '#000'
// 2-4. 添加虚线方案
ctx.setLineDash([ 5 ])
// 3. 描边绘制文本
ctx.strokeText(text, 100, 100)
复制代码
关注小源,为您解答更多前端和Java技术相关文章!
相关推荐
- vue3和web网页直接操作微信小程序云开发数据库
-
我们开发好小程序以后,有时候需要编写一个管理后台网页对数据库进行管理,之前我们只能借助云开发自带的cms网页,但是cms网页设计的比较丑,工作量和代码量也不够,所以我们今天就来带大家实现用vue3编写...
- WebCurl:极致轻量的跨平台 HTTP 请求调试工具
-
在接口开发与测试领域,工具的轻量化、兼容性与安全性往往直接影响工作效率。WebCurl作为一款纯原生、无依赖的网页版API测试与调试工具,凭借极简架构与全场景适配能力,重新定义了接口调试工具的使...
- webapi 全流程_webapi项目
-
C#中的WebAPIMinimalApi没有控制器,普通api有控制器,MinimalApi是直达型,精简了很多中间代码,广泛适用于微服务架构MinimalApi一切都在组控制台应用程序类【Progr...
- Nodejs之MEAN栈开发(四)-- form验证及图片上传
-
这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能。开始之前需要源码同学可以先在git上fork:https://github.com/stoneniqiu/R...
- CodeSpirit.Amis.AiForm 智能表单使用指南
-
概述AiForm是CodeSpirit.Amis框架的智能表单功能,专为AI驱动的长时间处理任务设计。它自动生成一个多步骤的用户界面,包含表单输入、进度监控、日志显示和结果展示等功能。功能特点...
- 初级、中级、高级前端工程师,对于form表单实现的区别
-
在React项目中使用AntDesign(Antd)的Form组件能快速构建标准化表单,特别适合中后台系统开发。以下是结合Antd的最佳实践和分层实现方案:一、基础用法:快速搭...
- Bun v0.7 大版本发布,与 Vite 牵手来破局?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。今天给大家带来...
- 「前端」界面可视化开发框架formio.js
-
简介formio是一个前端可视化开发框架,无需写css/js就可以开发一套前端界面。直接在界面内拖拽就可以完成界面的布局及开发。数据交互也是固定的,表单校验也可以配置,功能非常强大。特性使用ES6...
- 小伙给同事爬取数据竟获取不到,竟要使用这种请求方式才能获取?
-
Http请求中FormData和RequestPayload两种参数的区别?AjaxPost请求中常用的两种的形式:formdata和requestpayload一、默认的表单方式...
- WinForm + Win32 API 自定义无边框窗口实战(工业软件必备)
-
前言随着.NET9.0AOT(Ahead-of-Time)的发布,便萌生了用代码测试AOT编译效果的想法,同时评估未来是否为NanUI开发支持AOT编译的新版本。关于NanUI项目,若大家尚未了...
- DeepSeek从入门到精通(11)——网页版、APP、API使用方式比较
-
DeepSeek提供了三种主要的使用方法:网页版、手机APP和API调用。这三种方式各有特点,适用于不同的使用场景。下面从使用方法和主要特点两方面进行比较:一、网页版使用方法:直接通过浏览器访问De...
- 初略Web API Notification 桌面通知
-
HTML5WebNotificationsAPI通知接口用于向用户配置和显示桌面通知弹窗。例如,Email邮件通知、来电提醒、聊天信息提醒或任务提醒等。关于Web开发技术中Notificat...
- 什么是API网关?——驱动数字化转型的“隐形冠军”
-
什么是API网关API网关(APIGateway)是一个服务器,位于应用程序和后端服务之间,提供了一种集中式的方式来管理API的访问。它是系统的入口点,负责接收并处理来自客户端的请求,然后将请求路由...
- .NET 7使用 Entity Framework Core 制作增删改查(CRUD) Web API 教程
-
在本文中,我们将使用EntityFrameworkCore(EFCore)实现一个.NET7WebAPICRUD示例。WebAPI是一个构建HTTP服务的框架,可以从浏览器、移动设备和...
- C# ASP.NET Core Web Api 与 MVC 模式下 body 参数传递,post 参数方式
-
在ASP.NETCore中,WebAPI和MVC模式在处理HTTP请求时,特别是POST请求,使用body参数来传递数据的方式非常相似。两者都使用模型绑定来自动将请求体中的数据映射到C#对象上。下...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)
- JS Loop For (32)