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

Fabric.js视频流场景下Textbox点击后铺满画布问题解决咨询

解决Fabric.js Textbox铺满画布且无法输入的问题

我一眼就看出问题出在你设置的selectable:false上——这个属性会让Textbox失去可选中状态,而Fabric.js的Textbox组件依赖选中状态来维持自身的尺寸约束和编辑功能,一旦不可选中,它就会出现布局异常(铺满画布),同时自然也无法输入文字了。

下面是针对性的解决方案,分两步帮你搞定:

1. 恢复可选中状态并锁定尺寸

把selectable:false改成selectable:true,然后通过额外属性锁定它的尺寸,防止用户随意调整:

oText = new fabric.Textbox('', {
  width: 150,
  top: 50,
  left: 50,
  fontSize: 16,
  textAlign: 'center',
  fill: brushColor,
  // 必须开启可选中才能触发编辑功能
  selectable: true,
  // 锁定横向/纵向缩放,固定宽度
  lockScalingX: true,
  lockScalingY: true,
  // 可选:限制最小/最大宽度,进一步约束尺寸范围
  minWidth: 150,
  maxWidth: 150,
  // 可选:如果不需要移动Textbox,可以锁定拖拽位置
  // lockMovementX: true,
  // lockMovementY: true
});
canvas.add(oText);

2. 确保Textbox能正常获取焦点编辑

如果还是出现无法输入的情况,可以手动监听画布点击事件,主动触发编辑状态:

canvas.on('mouse:down', function(options) {
  if (options.target && options.target.type === 'textbox') {
    // 触发Textbox的编辑模式
    options.target.enterEditing();
    // 将焦点定位到内部输入框
    options.target.hiddenTextarea.focus();
  } else {
    // 点击外部时退出编辑,避免异常状态
    const activeObj = canvas.getActiveObject();
    if (activeObj && activeObj.type === 'textbox') {
      activeObj.exitEditing();
    }
  }
});

关键原理说明

  • Fabric.js的Textbox在selectable:false时,会跳过内部的尺寸计算逻辑,导致它自动拉伸填满画布。
  • 文字输入功能完全依赖选中状态,只有当Textbox被选中(selectable:true)时,才会渲染内部的输入框,实现文字输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:33:22