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

KonvaJS:使用Transformer调整分组大小时如何保持内部文本字号不变

解决方案

Konva.Transformer调整分组尺寸时默认修改分组的scaleX/scaleY属性,分组内所有子元素会继承缩放比例,因此文本字号会同步变化。要固定字号可以使用以下两种方案:


方案1:动态抵消文本的缩放影响

无需修改Transformer默认行为,监听分组的transform事件,用分组的缩放值反向修正文本字号,适合分组内同时存在需要缩放的其他元素的场景。

const group = new Konva.Group({
  x: 100,
  y: 100,
  width: 200,
  height: 100,
  draggable: true
});
// 初始化文本节点,记录初始字号
const originalFontSize = 16;
const text = new Konva.Text({
  text: '固定字号示例',
  fontSize: originalFontSize,
  fill: '#333'
});
group.add(text);
layer.add(group);

const tr = new Konva.Transformer({ nodes: [group] });
layer.add(tr);

// 核心修正逻辑
group.on('transform', () => {
  const scale = Math.min(group.scaleX(), group.scaleY());
  // 遍历分组内所有文本节点修正字号
  group.find('Text').forEach(textNode => {
    textNode.fontSize(originalFontSize / scale);
  });
});

方案2:直接修改分组宽高而非缩放

配置Transformer自定义变换逻辑,让调整大小时直接修改分组宽高、始终保持缩放比例为1,适合分组内所有元素都不需要继承缩放的场景。

const tr = new Konva.Transformer({
  nodes: [group],
  onTransform: (e) => {
    const targetGroup = e.target;
    const scaleX = targetGroup.scaleX();
    const scaleY = targetGroup.scaleY();
    // 用缩放值计算新宽高后重置缩放
    targetGroup.width(targetGroup.width() * scaleX);
    targetGroup.height(targetGroup.height() * scaleY);
    targetGroup.scaleX(1);
    targetGroup.scaleY(1);
  }
});

注意事项

  • 若分组存在多层嵌套,需要递归遍历所有子分组内的Text节点做字号修正
  • 如需文本随分组宽度自动换行,可在修正字号的同时同步修改文本的width属性为分组宽度减去对应边距

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:15:01