vue项目中,修改fabric默认操作

场景:fabricjs绘制的元素,默认点击鼠标左键即可自由移动元素。需要把操作改为,点击鼠标左键先选中元素,只有选中的元素,按住鼠标左键后才能移动

javascript 复制代码
// 初始化canvas
var canvas = new fabric.Canvas('c');

// 添加一个矩形元素
var rect = new fabric.Rect({
  left: 100,
  top: 100,
  fill: 'red',
  width: 60,
  height: 70,
  selectable: false // 初始时不可选中
});

canvas.add(rect);

// 监听对象的选中事件
canvas.on('mouse:down', function(options) {
  if (options.target) {
    var object = options.target;
    object.set({
      selectable: true, // 设置对象为可选中
      evented: false // 设置对象为不可触发事件,防止直接移动
    });
    canvas.setActiveObject(object); // 手动设置为选中状态
    canvas.renderAll();
  }
});

// 监听鼠标按下事件,用于启用移动
canvas.on('mouse:move', function(options) {
  if (canvas.getActiveObject()) {
    var object = canvas.getActiveObject();
    object.set({
      evented: true // 当对象被选中时,设置为可触发事件,允许移动
    });
  }
});

// 监听鼠标释放事件,用于禁用直接的移动
canvas.on('mouse:up', function(options) {
  if (canvas.getActiveObject()) {
    var object = canvas.getActiveObject();
    object.set({
      selectable: false, // 移动后设置对象为不可选中
      evented: true // 保持对象可触发事件状态
    });
    canvas.discardActiveObject(); // 取消对象的选中状态
    canvas.renderAll();
  }
});

原理,通过修改参数,实现。

selectable: true, // 设置对象为可选中

evented: false // 设置对象为不可触发事件,防止直接移动

相关推荐
cyclv42 分钟前
无网络地图展示轨迹,地图瓦片下载,绘制管线
前端·javascript
土豆12501 小时前
Tauri 入门与实践:用 Rust 构建你的下一个桌面应用
前端·rust
惜茶2 小时前
vue+SpringBoot(前后端交互)
java·vue.js·spring boot
小陈工3 小时前
2026年4月2日技术资讯洞察:数据库融合革命、端侧AI突破与脑机接口产业化
开发语言·前端·数据库·人工智能·python·安全
IT_陈寒3 小时前
Vue的这个响应式问题,坑了我整整两小时
前端·人工智能·后端
C澒3 小时前
AI 生码:A 类生码方案架构升级
前端·ai编程
前端Hardy4 小时前
前端必看!LocalStorage这么用,再也不踩坑(多框架通用,直接复制)
前端·javascript·面试
前端Hardy4 小时前
前端必看!前端路由守卫这么写,再也不担心权限混乱(Vue/React通用)
前端·javascript·面试
Lee川4 小时前
从零构建现代化登录界面:React + Tailwind CSS 前端工程实践
前端·react.js
Awu12274 小时前
⚡精通 Claude 第 1 课:掌握 Slash Commands
前端·人工智能·ai编程