FabricJS 自由绘图模式在触摸屏设备上失效的解决方案

13次阅读

FabricJS 自由绘图模式在触摸屏设备上失效的解决方案

fabricjs 的 `freedrawingbrush` 在桌面端正常,但在 ios/android 触摸设备上无法响应绘图操作,根本原因在于默认构建版本未启用触摸交互模块(如 `interaction` 和 `Event.js`),需使用支持手势控制的定制化构建或升级至 v5.0+ 版本。

FabricJS 默认的 cdn 构建(如 4.0.0-beta.12)为精简体积,默认不包含触摸事件支持模块(Interaction、pointerEvents 和 Gesture 相关逻辑),导致 isDrawingMode = true 在移动端仅触发原生页面滚动,而非画布绘图。这不是代码错误,而是构建配置缺失。

✅ 正确解决方案

1. 升级至 FabricJS v5.0.0 或更高版本(推荐)

v5.0+ 已重构事件系统,原生增强对移动端 touch/mouse/pointer 事件的统一处理,并默认启用触摸支持:

并在初始化后显式启用触摸兼容性(v5+ 中已更健壮,但仍建议):

const canvas = new fabric.Canvas('c', {   // 启用多点触控与手势支持(v5+ 默认开启,显式声明更稳妥)   enableRetinascaling: true,   controlsAboveOverlay: true,   // 确保 touch 事件被正确捕获   preventDefault: true, // 阻止默认滚动行为 });  canvas.freeDrawingBrush.width = 5; canvas.isDrawingMode = true;

2. 若必须使用 v4.x,请使用自定义构建版本

访问 FabricJS Build Tool,勾选以下关键模块:

  • ✅ Interaction(核心触摸交互)
  • ✅ Event.js(事件分发器)
  • ✅ PointerEvents(指针事件抽象层)
  • ✅ Gesture(可选,用于缩放/旋转等高级操作)

生成后替换原有 CDN 链接,即可恢复触摸绘图功能。

3. 补充移动端适配要点

即使使用正确构建,也需确保 html 层级阻止误触发:

同时在 JS 中添加防滚动:

document.getElementById('c').addEventListener('touchstart', (e) => e.preventDefault(), { passive: false });

⚠️ 注意:passive: false 是必需的,否则 preventDefault() 在现代浏览器中无效;touch-action: none css 规则能从根本上禁用画布区域的原生手势,是移动端 FabricJS 绘图稳定运行的前提。

总结

FabricJS 触摸绘图失效本质是构建时模块缺失,而非 API 使用问题。优先升级至 v5.3+ 并配合 touch-action: none 和 preventDefault 即可开箱即用;若受限于旧版本,则务必通过官方构建工具启用 Interaction 模块。切勿依赖未启用触摸支持的精简版 CDN。

text=ZqhQzanResources