【问题标题】:Adjust fabricjs text box size to match the text selection调整fabricjs文本框大小以匹配文本选择
【发布时间】:2020-06-10 03:44:46
【问题描述】:

我有一段代码可以这样创建一个新的Textbox

new fabric.Textbox('Ajouter du texte')

问题是文本框与其内容相比太小了:

如果我设置一个固定的宽度,我会得到一些填充:

new fabric.Textbox('Ajouter du texte', {width: 350})

如何调整文本框大小以匹配文本选择大小?我找不到有关如何获取选择尺寸的任何信息。

我使用的是织物版本4.0.0-beta.5

【问题讨论】:

  • 你使用的是什么版本的 FaricJS?您还可以提供最小的代码示例吗?我在最新的 3.6.2 上测试过,找不到这个“填充”。
  • 好的,我会尽快更新我的答案。

标签: javascript typescript fabricjs


【解决方案1】:

我现在保留的解决方案是逐渐增加宽度,直到我得到不超过 1 行:

const text = new fabric.Textbox("Ajouter du texte")

while (text.textLines.length > 1) {
  text.set({width: text.getScaledWidth() + 1})
}

请随意提出更好的解决方案,以便我可以更新已接受的答案。

[编辑]

要使其在文本编辑期间工作:

function adjustTextWidth(evt: fabric.IEvent) {
  if (evt.target instanceof fabric.IText) {
    const text = evt.target.text || ""
    while (evt.target.textLines.length > text.split("\n").length) {
      evt.target.set({width: evt.target.getScaledWidth() + 1})
    }
  }
}

canvas.on("text:changed", adjustTextWidth)

[EDIT2]

我找到了实现目标的更好方法:

fabric.Textbox.prototype._wordJoiners = /[]/;

这样,空格不会被视为单词连接符,并且仅当用户键入 Enter 时文本才会中断。我还添加了这个函数来在删除文本时调整文本框的宽度:

function fitTextboxToContent(text: fabric.IText) {
  const textLinesMaxWidth = text.textLines.reduce((max, _, i) => Math.max(max, text.getLineWidth(i)), 0);
  text.set({width: textLinesMaxWidth});
}

【讨论】:

  • 我们能否以某种方式限制宽度并将其后的单词换行而不是按 Enter 键?如果我们不按 Enter 键,它会一直这样继续下去并跨越画布边界。
  • 我猜你可以在while中添加一个条件,比如evt.target.getScaledWidth() < MAX_WIDTH
【解决方案2】:

我在TextBox 文档中进行了搜索,但没有找到任何自动将容器调整为文本大小的内容。

您可以做的最好的事情是获取每行的大小,如果宽度总和小于最大所需值,则将宽度设置为文本框。出于某种原因,您还需要为其添加一个小宽度。

var canvas = new fabric.Canvas("canvas");
var text = new fabric.Textbox("Ajouter du texte");

var textSize = 0;
for (var i = 0; i < text._textLines.length; i++) {
  textSize += text.measureLine(i).width;
}

var augmentedTextSize = textSize + 25;
if (augmentedTextSize < 500) {
  text.set({ width: augmentedTextSize });
}

canvas.add(text);
canvas.renderAll();

检查这个例子:https://codesandbox.io/s/stackoverflow-60411035-fabric-js-400-beta5-7s7id

最好在 TextBox 上设置某种属性,例如“max_width”,如果文本小于该值,则自动将大小调整为文本大小。

【讨论】:

  • 感谢您的回复。但是当文本更大时,框宽度会减少太多。它应该伸展到最大以避免跳线。
猜你喜欢
  • 2016-05-27
  • 1970-01-01
  • 2011-03-04
  • 2012-02-29
  • 2020-06-13
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多