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

如何调整Konva.js缩放逻辑使可视区中心对象缩放后保持居中

Konva.js 缩放保持可视区中心对象位置的修正方案

原代码的偏移计算仅以初始画布中心为固定缩放锚点,未考虑用户平移画布后,当前可视区中心对应的画布内实际坐标,因此平移画布后缩放会出现中心对象偏移的问题。

修正逻辑

  • 计算当前可视区的中心视口坐标,即Stage宽高的1/2
  • 将该视口中心坐标转换为缩放前的画布内部绝对坐标,作为固定缩放锚点
  • 根据新的缩放比例,反向计算新的Stage偏移量,保证上述锚点缩放后仍落在视口中心位置

修正后代码

// 注意需提前维护好scalePrev变量,存储当前生效的缩放比例
const zoom = (isZoomIn) => {
  const oldScale = scalePrev;
  const scaleToSet = getScale(isZoomIn);

  const stage = konvaStage.current;
  const stageWidth = stage.width();
  const stageHeight = stage.height();

  // 1. 计算可视区中心的视口坐标
  const viewportCenterX = stageWidth / 2;
  const viewportCenterY = stageHeight / 2;

  // 2. 转换为缩放前的画布内部绝对坐标(固定锚点)
  const anchorCanvasX = (viewportCenterX - stage.x()) / oldScale;
  const anchorCanvasY = (viewportCenterY - stage.y()) / oldScale;

  // 3. 计算新的偏移量,保证锚点缩放后仍在视口中心
  const newX = viewportCenterX - anchorCanvasX * scaleToSet;
  const newY = viewportCenterY - anchorCanvasY * scaleToSet;

  stage.setAttrs({
    position: { x: newX, y: newY },
    scale: { x: scaleToSet, y: scaleToSet }
  });

  // 更新全局存储的当前缩放比例
  scalePrev = scaleToSet;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:15:03