You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fabric.js中如何固定TextBox宽高,避免随文本内容变化?

Fabric.js TextBox手动设置height无效的原因及固定宽高实现

为什么height设置不生效?

Fabric.js的TextBox默认会根据文本内容自动计算高度,你手动传入的height参数会被文本实际渲染的高度覆盖,所以没效果。而width是用来控制文本换行的宽度,因此能正常生效。

实现固定宽高、不受文本内容影响的TextBox

要让TextBox保持固定宽高,不管文本怎么修改都不改变尺寸,需要锁定高度并处理文本溢出,具体操作如下:

  • 明确设置width和height为目标尺寸
  • 开启lockScalingY: true,禁止用户拖动控制点改变高度
  • 可选设置textOverflow处理溢出:'ellipsis'显示省略号,'clip'直接裁剪
  • 监听文本变化事件,每次文本修改后强制重置高度,确保尺寸不会被文本内容覆盖

修改后的代码示例

var canvas = (this.__canvas = new fabric.Canvas("c"));
canvas.uniformScaling = false;

var textBox = new fabric.Textbox("Freedom", {
  left: 100,
  top: 100,
  width: 300,
  height: 200, // 目标固定高度
  fontSize: 20,
  fontWeight: "bold",
  fontStyle: "italic",
  textAlign: "left",
  editable: true,
  hasControls: true,
  editingBorderColor: "red",
  fill: "red",
  objectCaching: false,
  lockScalingFlip: false,
  borderColor: "black",
  lockScalingY: true, // 锁定Y轴缩放,防止高度被拖动改变
  textOverflow: 'ellipsis', // 文本超出时显示省略号
  lineHeight: 1.5 // 调整行高,让文本在固定高度内更合理分布
});

// 监听文本变化事件,强制重置高度
textBox.on('text:changed', function() {
  this.set('height', 200);
  canvas.renderAll();
});

textBox.setControlVisible("mtr", false);
canvas.add(textBox);
canvas.setActiveObject(textBox);
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/5.3.1/fabric.min.js"></script>
<canvas id="c" width="600" height="400" style="border:1px solid #ccc"></canvas>

另一种方案:用裁剪路径固定显示区域

如果不需要文本溢出的省略号,只想直接裁剪超出部分,可以给TextBox添加固定尺寸的裁剪路径:

// 给TextBox添加裁剪路径,限制显示区域为300x200
textBox.clipPath = new fabric.Rect({
  width: 300,
  height: 200,
  left: -textBox.width / 2,
  top: -textBox.height / 2
});

内容的提问来源于stack exchange,提问作者personax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 06:04:55