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

Fabric.js中图片第二次点击无法重复左移动效问题排查

问题原因分析

你的代码里每次点击图片时,都是让它的left属性动画到固定值50。第一次点击时,图片初始left是0,所以会从0移动到50,能看到明显效果;但第一次动画结束后,图片的left已经变成50了,第二次点击时,目标值还是50——和当前值完全一致,Fabric.js会判断这种情况不需要执行动画,所以你看不到任何移动效果。

解决方案

根据不同的需求场景,这里提供几种实用的解决思路:

思路1:每次点击移动固定距离

如果希望每次点击都让图片向某个方向移动一段固定距离(比如每次向右移动50px),可以把目标值改成当前位置加上固定偏移量:

var canvas = new fabric.Canvas('canvas');
canvas.on({
 'object:selected': function(e) {
  // 每次点击让left增加50px,可根据需求改成减少(-50)
  e.target.animate('left', e.target.left + 50, {
   onChange: canvas.renderAll.bind(canvas),
   duration: 100
  });
 }
});
fabric.Image.fromURL('imag/pziiif.gif', function(img) {
 img.set({ left:0, top: 0 });
 canvas.add(img);
});

思路2:在固定位置间来回切换

如果就是希望图片在left:0和left:50两个位置间来回切换,每次点击触发一次位置切换,可以通过判断当前位置来设置目标值:

var canvas = new fabric.Canvas('canvas');
canvas.on({
 'object:selected': function(e) {
  // 判断当前left值,切换目标位置
  var targetLeft = e.target.left === 50 ? 0 : 50;
  e.target.animate('left', targetLeft, {
   onChange: canvas.renderAll.bind(canvas),
   duration: 100
  });
 }
});
fabric.Image.fromURL('imag/pziiif.gif', function(img) {
 img.set({ left:0, top: 0 });
 canvas.add(img);
});

思路3:强制重复初始动画

如果你的场景需要不管当前位置,每次点击都执行从初始位置(left:0)到50的动画,可以在点击时先重置图片的left到初始值,再启动动画:

var canvas = new fabric.Canvas('canvas');
canvas.on({
 'object:selected': function(e) {
  // 先重置left到0,再动画到50
  e.target.set('left', 0);
  e.target.animate('left', 50, {
   onChange: canvas.renderAll.bind(canvas),
   duration: 100
  });
 }
});
fabric.Image.fromURL('imag/pziiif.gif', function(img) {
 img.set({ left:0, top: 0 });
 canvas.add(img);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:52:20