学习整理Fabric.js 动态设置文字字号大小的方法

188 篇文章 2 订阅
17 篇文章 6 订阅

需求

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

解决思路

1、获取被选中的文字:canvas.getActiveObject() 。
2、是否只选中一部分文字:
1)、我通过编辑状态来判断是否只选中一部分文字:isEditing 。
2)、修改被选中文字的样式:setSelectionStyles({…}) 。
3、修改 fontSize 属性。
4、如果是全文修改,还要判断是否有些字符在自身设置了 fontSize ,如果文字自己设置了 fontSize ,那全文设置的权重没独立设置的那么高。

代码

index.html 代码

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">

    <title>Fabric.js 修改文字大小</title>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.5.0/fabric.min.js"></script>

    <style>
        div#container {
            padding: 30px;
            font-family: 'verdana', lucida;
        }

        input {
            background-color: #ccc;
            padding: 0;
            width: 300px;
            color: #777;
        }

        a {
            color: #777;
            display: block;
            background-color: #ccc;
            width: 300px;
            padding: 0;
            margin-top: 2px;
            text-decoration: none;
        }
    </style>

</head>
<body>

<div id="container">
    <p>
        拖动控制字体大小
        <input type="range" min="5" max="150" value="40" id="size" onchange="changeSize(value)">
    </p>
    <p>
        下拉控制字体大小
        <select name="" id="" onchange="changeSize(value)">
            <option value="1">1</option>
            <option value="11">11</option>
            <option value="15">15</option>
            <option value="19">19</option>
            <option value="20">20</option>
            <option value="30">30</option>
            <option value="40">40</option>

        </select>
    </p>
    <p>
        手动输入控制字体大小
        <input type="text" min="5" max="150" value="40" oninput="changeSize(value)">
    </p>

    <canvas id="imageCanvas" width="300" height="300"></canvas>
    <a id="lnkDownload" href="#">Save image</a>
</div>

<script src="script.js"></script>

</body>
</html>

script.js代码

var canvas = new fabric.Canvas('imageCanvas', {
    backgroundColor: 'rgb(240,240,240)',
    includeDefaultValues: false,// 指示toObject/toDatalessObject是否应该包含默认值,如果设置为false,则优先于对象值
    perPixelTargetFind: true, //这一句说明选中的时候以图形的实际大小来选择而不是以边框来选择
    hasBorders: false,
});

canvas.setWidth(500);
canvas.setHeight(500);


// 使用 IText,可编辑文本
var text_1 = new fabric.IText(
    '奇葩呀',
    {
        fontSize: 20,
        fontFamily: 'Comic Sans',
        left: 10,
        top: 10,
    }
);
canvas.add(text_1);

// 使用 IText,可编辑文本
var text_2 = new fabric.IText(
    'www.qipa250.com',
    {
        fontSize: 25,
        fontFamily: 'Comic Sans',
        left: 10,
        top: 50,
    }
);
canvas.add(text_2);


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();
}




var imageSaver = document.getElementById('lnkDownload');
imageSaver.addEventListener('click', saveImage, false);

function saveImage(e) {

    console.log('toJSON==', canvas.toJSON());

    console.log('toObject==', canvas.toObject()); // 输出序列化的内容

    this.href = canvas.toDataURL({
        format: 'png',
        quality: 0.8
    });
    this.download = 'canvas.png';

}

知识点:

使用 isEditing 判断当前是否进入编辑状态,我是根据编辑状态下是否有选中文字来修改字号大小的。

最后有2层循环:

for(let i in s) {
  for (let j in s[i]) {
    s[i][j].fontSize = value
  }
}

第一层循环 i 是行数的遍历;第二层循环 j 是当前行的文字的遍历。

这么做是因为如果只使用 setSelectionStyles 设置字号大小是无法覆盖每个字本身被设置的 fontSize 。所以还是需要循环一遍,保证每个字都修改到位。

最终实现用三种不同的样式,修改已选中的文字字体大小
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值