亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

Fabric.js 動態設置字號大小

本文简介

点赞 + 关注 + 收藏 = 学会了



一图胜千言,先看看图我们再写作文~

file



分析

需求

从上图可以看出以下功能需求:

  1. 文本被选中后才能修改字号
  2. 整体修改字号
  3. 修改被选中的几个字的字号,没被选中的不进行修改

解决思路

  1. 获取被选中的文字:canvas.getActiveObject()
  2. 是否只选中一部分文字:
    1. 我通过编辑状态来判断是否只选中一部分文字:isEditing
    2. 修改被选中文字的样式:setSelectionStyles({...})
  3. 修改 fontSize 属性。
  4. 如果是全文修改,还要判断是否有些字符在自身设置了 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 。所以还是需要循环一遍,保证每个字都修改到位。




代码仓库



點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消