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

React+FabricJS场景下画布左上角对象无法选中点击调整大小问题

问题根因

FabricJS 内部会为每个可交互对象缓存一套用于碰撞检测的坐标值,当你通过代码修改对象的left/top/scale等属性时,这套缓存坐标不会自动更新,导致实际渲染位置和碰撞检测位置不匹配,所以在左上角区域会出现点不中、无法操作的问题。

修正方案

你需要在修改完图片对象的所有属性后、添加到画布前,调用setCoords()方法更新缓存坐标,同时修正原有代码中renderAll调用的错误(bind仅绑定上下文不会执行方法,实际没有触发画布重绘)。

修正后的代码片段

const { state, setState } = React.useContext(Context);
const { canvas } = state;
// ...
const handleElementAdd = (event, image) => {     
    const imageSize = event.target.childNodes[0].getBoundingClientRect();
    const imageUrl = `/storage/${image.src}`;
    // fromURL是静态方法,不需要加new关键字
    fabric.Image.fromURL(imageUrl, img => {
        let scale = 1;      
        if (img.width > 100) {
          scale = 100/img.width;
        }
        const oImg = img.set({
          left:  state.width / 2 - img.width * scale, 
          top:  state.height / 2 - img.height * scale, 
          angle: 0
        }).scale(scale);
        // 新增:更新对象碰撞检测坐标缓存
        oImg.setCoords();
        // 修正renderAll调用,无需bind直接执行
        canvas.add(oImg).renderAll();
        canvas.setActiveObject(oImg);
    });
};
// ...
<div              
    key={img.name}
    onClick={(e) => handleElementAdd(e, img)}
    className={buttonClass}
>

补充说明

如果后续你通过代码动态修改已经添加到画布的对象的位置、缩放、旋转等属性,修改完成后都需要调用一次对应对象的setCoords(),避免出现同样的交互失效问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:45:03