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

fabricjs如何实现双击图片/矩形与文本组合对象编辑文本并保持组合

Fabric.js 组合对象文本可编辑实现方案

fabric原生Group会默认拦截子元素的交互事件,所以直接组合后IText无法进入编辑状态,LabeledRect内置的文本也没有默认开放编辑能力,按照以下逻辑实现即可满足需求:

核心实现逻辑

  • 给带可编辑文本的组合添加自定义标记,方便事件识别
  • 监听画布双击事件,判断双击目标是否为带文本的组合
  • 触发双击后临时激活组合内的IText对象,进入编辑状态
  • 监听文本编辑退出事件,编辑完成后重新恢复组合状态

完整可运行代码

const canvas = new fabric.Canvas("canvas");

// 矩形对象
const rect = new fabric.Rect({
  stroke: "#000",
  strokeWidth: 1,
  fill: "#ccc",
  left: 170,
  top: 80,
  width: 120,
  height: 60
});

// 描述矩形的IText文本
const text = new fabric.IText("describe rect", {
  fontFamily: "Comic Sans",
  fontSize: 14,
  stroke: "#000",
  strokeWidth: 0.5,
  fill: "#000",
  // 文本相对矩形居中计算,可根据需求自行调整位置
  left: rect.left + (rect.width - (14 * "describe rect".length) / 2) / 2,
  top: rect.top + (rect.height - 14) / 2
});

// 创建带自定义标记的组合,用来区分普通组合和带可编辑文本的组合
const textGroup = new fabric.Group([rect, text], {
  left: rect.left,
  top: rect.top,
  customType: "editableTextGroup"
});
canvas.add(textGroup);

// 监听画布双击事件
canvas.on("mouse:dblclick", (e) => {
  const clickTarget = e.target;
  // 非目标组合直接跳过
  if (!clickTarget || clickTarget.customType !== "editableTextGroup") return;

  // 查找组合内的IText实例
  const innerText = clickTarget.getObjects().find(item => item.type === "i-text");
  if (!innerText) return;

  // 激活文本进入编辑状态
  canvas.discardActiveObject();
  clickTarget.toActiveSelection();
  canvas.setActiveObject(innerText);
  innerText.enterEditing();
  innerText.selectAll();

  // 监听编辑退出事件,恢复组合状态
  const handleEditExit = () => {
    const newGroup = new fabric.Group(canvas.getActiveObjects(), {
      customType: "editableTextGroup",
      left: clickTarget.left,
      top: clickTarget.top
    });
    canvas.remove(clickTarget);
    canvas.add(newGroup);
    canvas.setActiveObject(newGroup);
    // 移除事件监听避免重复触发
    innerText.off("editing:exited", handleEditExit);
  };
  innerText.on("editing:exited", handleEditExit);
});

适配说明

  • 如果需要图片加文本的组合,仅需将上述代码中的矩形对象替换为fabric.Image实例即可,其余逻辑完全一致
  • 可根据业务需求调整组合的属性、文本的位置样式,自定义标记customType也可以自行修改为符合业务规范的字段

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:24:05