【问题标题】:How to get Text object font-size after modifying object修改对象后如何获取文本对象字体大小
【发布时间】:2019-06-11 17:36:57
【问题描述】:

在fabric.js中修改对象后如何获取文本对象字体大小?

下面是我的代码。

var text = new fabric.Text(imgText, {
                left: 10,
                top: 5,
                fontSize: 15,
                fontFamily: 'Verdana',
                fill: 'white'
            });
            text.scaleToWidth(canvas.width * 0.5);
            text.setControlsVisibility(canvasConfig);
            canvas.add(text);
            canvas.renderAll();
var objects = canvas.getActiveObject();

            var obj = objects;
            if (!obj) {
                return;
            }
            //console.log(obj.get('fontSize') *= obj.scaleX); 
            var angle = obj.get('angle');

            var objWidth = obj.get('width') * obj.scaleX;
            var objWidthPercent = objWidth / canvas.width * 100;

            var objHeight = obj.get('height') * obj.scaleY;
            var objHeightPercent = objHeight / canvas.height * 100;

            var bound = obj.getBoundingRect();
            var objLeft = obj.get('left') / canvas.width * 100;
            var objTop = obj.get('top') / canvas.height * 100;

            var newfontsize = obj.fontSize * obj.scaleX;

上面我将默认 FontSize 设置为 15。然后我修改对象我可以得到正确的 Height, Width, Left, Top, 但我无法得到 FontSize。

在后端,我设置了如下截图所示的图像和文本。

在前端我得到如下截图。

前端图像和文本的以下样式。

element.style {
    left: 64.37%;
    top: 14.54%;
    width: 28.25%;
    height: 14.37%;
    font-size: 63.58px;
    color: #E346FF;
    font-family: Times New Roman;
    position: absolute;
    max-width: 100%;
    z-index: 996;
    max-height: 100%;
}

element.style {
    left: 56.5%;
    top: 0.81%;
    width: 42.86%;
    height: 42.86%;
    max-width: 100%;
    max-height: 100%;
    position: absolute;
    z-index: 995;
    display: block;
    background-image: url(http://10.16.16.101/LabelExtension/pub/media/labelimageuploader/images/image/o/r/orange_38.png);
    background-position: center;
    background-repeat: no-repeat;
    background-size: contain;
}

当我添加下面的代码时,它运行良好,但后端对象变得模糊。

this.canvas.setHeight(300);
this.canvas.setWidth(240);
this.canvas.backgroundColor = '#E8EEF1';
this.canvas.setDimensions({width: '480px', height: '600px'}, {cssOnly: true});

【问题讨论】:

  • 您能否将修改对象并尝试获取 fontSize 的代码包含在内?
  • @shkaper 检查我更新的问题,我可以得到高度、宽度、左侧、顶部。但找不到字体大小。
  • 我不确定您在该注释行中要做什么。 obj.get('fontSize') 确实应该返回一个数字。 console.log(obj.get('fontSize') *= obj.scaleX) 不能工作并且会引发错误。该行翻译为:console.log(15 = 15 * obj.scaleX)。您不能将值分配给另一个原始值。
  • 您是否尝试获取 fabric.Text 对象的“字体大小”,这样当您通过 CSS 将此值设置为纯 HTML 文本的“字体大小”时,它看起来大小相同?
  • 我想知道在 fabric.js 中获取字体大小的实际公式是什么?

标签: javascript jquery fabricjs


【解决方案1】:

以下是将 Fabric.js 字体转换与 CSS 转换相匹配的方法:https://jsfiddle.net/mmalex/evpky3tn/

解决方案是匹配文本的转换,不尝试调整字体大小


第 1 步 - 准备场景,合成画布,用矩形对文本进行分组,让用户操作该组,旋转和缩放它。

var canvas = new fabric.Canvas(document.getElementById('c'));

var rect = new fabric.Rect({
    width: 50,
    height: 50,
    left: 90,
    top: 120,
    fill: 'rgba(255,0,0,0.25)'
});

var text = new fabric.Text("123", {
    left: rect.left,
    top: rect.top,
    fontSize: 15,
    fontFamily: 'Verdana',
    fill: 'black'
});

text.scaleToWidth(rect.width);
canvas.add(text);

var group = new fabric.Group([rect, text], {
    originX: 'center',
    originY: 'center',
    angle: 25,
    scaleY: 1.7
});

canvas.add(group);
canvas.renderAll();

第 2 步 - 为缩放准备 DIV 样式

.scaled {  // this style is applied to DIV element with text
    ...
    font-size: 15px; // Fabric.js text is also 15px size
    transform: scale(1, 1); // define initial transform
    transition: all 0.25s linear; // let it animate
    ...
}

第 3 步 - 评估 Fabric.js 转换并将 CSS 应用于 DIV 元素, 例如:

element.style {
    transform: rotate(25deg) scale(1.74774, 2.97116); 
}

解决方案(又名按钮处理程序)将 Fabric.js 转换转换为 CSS 转换:

function matchCssTransform() {
    let textScale = text.getTotalObjectScaling();
    let pixelRatio = window.devicePixelRatio;
    let styleStr = `rotate(${group.angle}deg) scale(${textScale.scaleX / pixelRatio}, ${textScale.scaleY / pixelRatio}) `;
    document.getElementById("scaled").style.transform = styleStr;
}

【讨论】:

    【解决方案2】:

    getHeightOfLine(lineIndex) → {Number} :计算给定位置的字符高度并返回字符的 fontSize。是吗?告诉我。 它是文本类的一种方法。 http://fabricjs.com/docs/fabric.Text.html#getHeightOfLine

    【讨论】:

      【解决方案3】:

      这是 vanilla js 解决方案。

      我无法获取 FontSize。

      你可以使用computedStyle来实现fontSize

        let style = window.getComputedStyle(text, null).getPropertyValue('font-size');
        let fontSize = parseFloat(style); 
      

      https://developer.mozilla.org/de/docs/Web/API/Window/getComputedStyle

      除此之外,我建议您使用vwvh

      .text {
        font-size: 10vw;
      }
      

      https://web-design-weekly.com/2014/11/18/viewport-units-vw-vh-vmin-vmax/

      大家一起给我们https://jsfiddle.net/a8woL1eh/

      【讨论】:

        【解决方案4】:

        问题是文本对象在修改或转换时不会改变它的fontSize属性,除非手动设置fontSize属性。这就是为什么你得到模糊文本的原因,因为尽管改变了变换大小,但主要的 fontSize 保持不变。所以可能的解决方案是以某种方式动态改变 fontSize 属性。 http://jsfiddle.net/therowf/xkhwagd8/41/ 在这里,我从您的代码中附加了一个 jsfiddle 示例。此代码与您的代码非常相似。

        谢谢,让我知道这是否有效。 (:

        var canvas = new fabric.Canvas(document.getElementById('c'));
        var imgText ="This is text";
        var canvasConfig = true;
        var text = new fabric.Text(imgText, {
                        left: 10,
                        top: 5,
                        fontSize: 50,
                        fontFamily: 'Verdana',
                        fill: 'black'
                    });
                    text.scaleToWidth(canvas.width * 0.5);
                    text.setControlsVisibility(canvasConfig);
                    canvas.add(text);
                    canvas.renderAll();
        
        
        
        
        var objects = canvas.getActiveObject();
        
        function moveHandler(evt){
        //evt.target.fontSize = 10;
        var fontSizeX = evt.target.scaleX;
        var fontSizeY = evt.target.scaleY;
        if(fontSizeX === fontSizeY){
        	evt.target.fontSize = fontSizeX*100;
          console.log(evt.target.fontSize);
        }
        }
        canvas.on('object:scaling', moveHandler);
        <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.6.0/fabric.min.js"></script>
        
        
        
            <canvas id="c" width="400" height="400"></canvas>

        【讨论】:

        • RawGit 已达到使用寿命
        • 谢谢,我不知道,但 jsFiddle 仍在使用它。 @AlexKhoroshylov
        猜你喜欢
        • 2016-11-28
        • 2023-03-09
        • 1970-01-01
        • 2020-01-25
        • 2010-11-17
        • 2020-01-23
        相关资源
        最近更新 更多