当前位置:网站首页>Fabric.js 动态设置字号大小
Fabric.js 动态设置字号大小
2022-07-02 11:08:00 【德育处主任】
本文简介
点赞 + 关注 + 收藏 = 学会了
<br>
本文使用 Fabric.js 的 IText 演示。如果你还不懂 Fabric.js ,我墙裂推荐你阅读 《Fabric.js从入门到精通》。
<br>
一图胜千言,先看看图我们再写作文~

<br>
<br>
分析
需求
从上图可以看出以下功能需求:
- 文本被选中后才能修改字号
- 整体修改字号
- 修改被选中的几个字的字号,没被选中的不进行修改
<br>
解决思路
- 获取被选中的文字:
canvas.getActiveObject()。 - 是否只选中一部分文字:
- 我通过编辑状态来判断是否只选中一部分文字:
isEditing。 - 修改被选中文字的样式:
setSelectionStyles({...})。
- 我通过编辑状态来判断是否只选中一部分文字:
- 修改
fontSize属性。 - 如果是全文修改,还要判断是否有些字符在自身设置了
fontSize,如果文字自己设置了fontSize,那全文设置的权重没独立设置的那么高。
<br>
<br>
编码
<input type="range" min="5" max="150" value="40" id="size" onchange="changeSize(value)"><canvas id="c" width="300" height="300" style="border: 1px solid #ccc"></canvas><script src="https://cdn.bootcdn.net/ajax/libs/fabric.js/521/fabric.js"></script><script> const canvas = new fabric.Canvas('c') const iText = new fabric.IText('hello world') canvas.add(iText) function changeSize(value) { let activeTxt = canvas.getActiveObject() if (!activeTxt) return if (activeTxt.isEditing) { // 编辑状态 activeTxt.setSelectionStyles({ 'fontSize': value}) } else { activeTxt.fontSize = value let s = activeTxt.styles // 遍历行和列 for(let i in s) { for (let j in s[i]) { s[i][j].fontSize = value // 针对每个字设置字号 } } activeTxt.dirty = true } canvas.renderAll() }</script>使用 isEditing 判断当前是否进入编辑状态,我是根据编辑状态下是否有选中文字来修改字号大小的。
最后有2层循环:
for(let i in s) { for (let j in s[i]) { s[i][j].fontSize = value }}第一层循环 i 是行数的遍历;第二层循环 j 是当前行的文字的遍历。
这么做是因为如果只使用 setSelectionStyles 设置字号大小是无法覆盖每个字本身被设置的 fontSize 。所以还是需要循环一遍,保证每个字都修改到位。
<br>
设置字号大小的例子还可以用在上标和下标里,比如 《Fabric.js 上标和下标的使用偏方》 一文中的用法。上标和小标适应用在合在数学公式和化学符号等场景。
<br>
<br>
代码仓库
<br>
<br>
推荐阅读
《Fabric.js 锁定背景图,不受缩放和拖拽的影响》点赞 + 关注 + 收藏 = 学会了
边栏推荐
- Dangbei projection 4K laser projection X3 Pro received unanimous praise: 10000 yuan projector preferred
- uniapp自动化测试学习
- Use bloc to build a page instance of shutter
- Data consistency between redis and database
- 字符串匹配问题
- Do you know that there is an upper limit on the size of Oracle data files?
- Route (II)
- 路由(二)
- uni-app中使用computed解决了tab切换中data()值显示的异常
- 每日学习2
猜你喜欢

Selenium installing selenium in pycharm

PHP linked list creation and traversal

Téléchargement par navigateur

Just 1000 fans, record it

Simple introduction to ENSP

Pycharm连接远程服务器
![[Hongke technology sharing] how to test DNS server: DNS performance and response time test](/img/f4/d8c21d6c33985fd6d819cd44c22c72.png)
[Hongke technology sharing] how to test DNS server: DNS performance and response time test

Yyds dry goods inventory software encryption lock function

Yolov3 & yolov5 output result description

uniapp自动化测试学习
随机推荐
Development and design of animation surrounding mall sales website based on php+mysql
Quarkus学习四 - 项目开发到部署
go操作redis
Adhere to the foundation of 20 minutes go every day II
Borui data integrated intelligent observable platform was selected into the "Yunyuan production catalogue" of China Academy of communications in 2022
2022 home projector preferred! Dangbei F5 brings the ultimate audio-visual experience with its powerful audio-visual effect
Available solution development oral arithmetic training machine / math treasure / children's oral arithmetic treasure / intelligent math treasure LCD LCD driver ic-vk1622 (lqfp64 package), original te
瀏覽器驅動的下載
Fabric.js 手动加粗文本iText
MQ教程 | Exchange(交换机)
Story point vs. Human Sky
腾讯云 TStor 统一存储通过信通院首批文件存储基础能力评测
抓包工具fiddler学习
MySQL 45 lecture - learning from the actual battle of geek time MySQL 45 Lecture Notes - 04 | easy to understand index (Part 1)
Data Lake (11): Iceberg table data organization and query
Methods of software testing
你知道Oracle的数据文件大小有上限么?
Route (II)
Codeforces Round #803 (Div. 2)(A~D)
BeanUtils -- shallow copy -- example / principle