点赞 + 关注 + 收藏 = 学会了
一图胜千言,先看看图我们再写作文~
需求
从上图可以看出以下功能需求:
解决思路
canvas.getActiveObject()
。isEditing
。setSelectionStyles({...})
。fontSize
属性。fontSize
,如果文字自己设置了 fontSize
,那全文设置的权重没独立设置的那么高。<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
。所以还是需要循环一遍,保证每个字都修改到位。
⭐IText 动态修改字号