Fabricjs Textbox 使文本缩小以适应

Posted

技术标签:

【中文标题】Fabricjs Textbox 使文本缩小以适应【英文标题】:Fabricjs Textbox make the text shrink to fit 【发布时间】:2017-05-07 21:14:28 【问题描述】:

我会定义一个文本框(单行)

默认情况下,字符大小为 16(例如)

当文本比文本框大时,我不希望它换行或文本框变大,我希望文本大小适合文本框的最大大小。文本。当文本恢复到较小的大小时,它可以恢复其初始大小(在我们的示例 16 中)。可能管理最小尺寸

如果你有想法,我接受:)

提前致谢

测试用例:http://jsfiddle.net/Da7SP/273/

// initialize fabric canvas and assign to global windows object for debug
var canvas = window._canvas = new fabric.Canvas('c');

// ADD YOUR CODE HERE
var canvas = window._canvas = new fabric.Canvas('c');
var t1 = new fabric.Textbox('My Text', 
    width: 200,
    top: 5,
    left: 5,
    fontSize: 16,
    textAlign: 'center'
);

var t2 = new fabric.Textbox('My text is longer, but I do not want the box to grow, or the text to wrap. I only want the text to fit the available size', 
    width: 200,
    height: 200,
    top: 250,
    left: 5,
    fontSize: 16,
    textAlign: 'center'
);



canvas.add(t1);
canvas.add(t2);

一个小视频来解释我想要什么:

当文本比文本框大时,我希望文本大小适合文本框的最大大小。

【问题讨论】:

您找到解决问题的方法了吗?下面标记为正确答案的答案不包含文本的大小。当输入多个单词时,它会添加另一行 @neopheus 【参考方案1】:

这是一个基本的小提琴,可以复制你的想法。 关键是您有一个事件会在每次文本更改时触发,并且可以用来在文本框呈现之前执行某些操作。

在这种情况下,我会根据我添加到名为fixedWidth的文本框的非标准参数来缩小字体大小

// ADD YOUR CODE HERE
var canvas = new fabric.Canvas('c');
var t1 = new fabric.Textbox('MyText', 
    width: 150,
    top: 5,
    left: 5,
    fontSize: 16,
    textAlign: 'center',
    fixedWidth: 150
);

canvas.on('text:changed', function(opt) 
  var t1 = opt.target;
  if (t1.width > t1.fixedWidth) 
    t1.fontSize *= t1.fixedWidth / (t1.width + 1);
    t1.width = t1.fixedWidth;
  
);

canvas.add(t1);
canvas 
    border: 1px solid #999;
<script src="https://rawgithub.com/kangax/fabric.js/master/dist/fabric.js"></script>
<canvas id="c"  ></canvas>

【讨论】:

谢谢@AndreaBogazzi ;) 但是你知道在 TextBox 中禁用自动换行吗?谢谢 如果您不需要自动换行切换到 Itext。没有办法禁用它,因为制作文本框的唯一原因是启用自动换行 我需要有一个固定大小的区域,比如 TextBox。是否可以将固定大小区域的管理添加到 IText ?谢谢 如果他们当用户减少文本时应该恢复正常【参考方案2】:

这是与https://***.com/a/41335051/1469525 类似的答案,但此示例将 fontSize 修改为 maxFontSize(初始 fontSize)。这允许文本缩小然后恢复到原始大小,并防止换行。

(注意,如果你使用它,你必须找到一种方法来阻止用户使用enter 键。我进行了检查,如果检测到回车键,则基本上取消它。我的应用程序实际上有一个单独的表单来输入文本,所以我可以通过普通的 javascript 来控制预防。我不太确定如何直接在画布元素上执行此操作,当它像这里一样可编辑时......)

var canvas = new fabric.Canvas('c');
var t1 = new fabric.Textbox('MyText', 
    width: 150,
    top: 5,
    left: 5,
    fontSize: 16,
    textAlign: 'center',
    maxFontSize: 16,
);

canvas.on('text:changed', function(opt) 
  var t1 = opt.target;
  if (t1.text.match(/[\r\n]/)) return;

  t1.set(
    fontSize: t1.maxFontSize,
  );
  while (t1._textLines.length > 1) 
    t1.set(
      fontSize: t1.fontSize - 1,
    );
  
);

canvas.add(t1);
canvas 
    border: 1px solid #999;
<script src="https://rawgithub.com/kangax/fabric.js/master/dist/fabric.js"></script>
<canvas id="c"  ></canvas>

【讨论】:

以上是关于Fabricjs Textbox 使文本缩小以适应的主要内容,如果未能解决你的问题,请参考以下文章

使 JQuery UI Dialog 自动增长或缩小以适应其内容

如何使 HTML 表格中的一列缩小以适应?

FabricJS 缩放图像以适应宽度/大小

R:ggplot2,我可以将情节标题设置为环绕并缩小文本以适应情节吗?

如何缩小字体以适应 Android 中视图的内部宽度?

缩小以适应 div 和段落,基于图像?