什么是 Fabric.js?
Fabric.js 是一个开源的 JavaScript 库,它为 HTML5 的 <canvas> 元素提供了一个基于对象的图形模型。相比直接使用原生 Canvas API,Fabric.js 让你可以像操作可视对象一样来操作画布上的形状、图像、文字、路径等。
它同时支持 SVG → Canvas 以及 Canvas → SVG 的转换。
Fabric.js 官网:https://fabricjs.com/
Fabric.js GitHub 地址:https://github.com/fabricjs/fabric.js

为什么选择 Fabric.js?
-
原生 Canvas API 的绘制方式偏底层,适合静态绘图,但在需要交互、拖拽、变换、组合等场景下就显得繁琐。Fabric.js 针对此提供了更高层的抽象。
-
Fabric.js 内建了对象管理、选择、缩放、旋转、分组、图像过滤、动画等功能,让开发者可以更专注于业务逻辑而不是重复处理 Canvas 状态管理。
-
它支持浏览器,也支持 Node.js 环境(使用 node-canvas 等库),适用于服务器端图像生成或图形处理。
-
社区活跃,文档完善,是一个成熟可靠的选择。
核心概念一览
1. Canvas 容器
Fabric.js 提供了两类主要容器:StaticCanvas(静态、不可交互)和 Canvas(可交互)对象。这个容器负责:对象管理、渲染、序列化/反序列化、视口变换(如缩放、平移)等。
2. 对象 (Objects)
你在画布上操作的几乎一切都是一个“对象” —— 例如矩形 (Rect)、圆 (Circle)/椭圆 (Ellipse)、文字 (Text/IText)、图片 (Image)、路径 (Path/Polyline/Polygon) 等。对象拥有位置、尺寸、旋转、填充、边框、阴影、渐变、图案、过滤器等属性。
3. 交互与控制
Fabric 支持对对象的选择、多选、拖拽、缩放、旋转、斜切,还提供 Control API 让你自定义控件的外观与行为。绘图模式 (如铅笔刷、喷枪刷) 也被内建。
4. 序列化 / 导出
你可以将 canvas 状态导出为 JSON 格式,以便保存、恢复或与服务器端同步;也可以导出为 SVG 或 PNG/数据 URL 等图像格式。
5. 分组 (Groups)
多个对象可以组合成一个组 (Group),对这个组进行移动、旋转、缩放时,就好像它是一个整体。也可以在组内访问各子对象属性,非常适合复杂布局与交互。
简单使用示例
下面是一个基本的使用流程,适合刚开始体验 Fabric.js 的场景:
<canvas id="c" width="500" height="300" style="border:1px solid #000"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/6.4.3/fabric.min.js"></script>
<script>
// 创建可交互 Canvas
const canvas = new fabric.Canvas('c');
// 创建一个红色矩形
const rect = new fabric.Rect({
left: 100,
top: 50,
width: 80,
height: 60,
fill: 'red'
});
canvas.add(rect);
// 创建一个可拖拽的文字
const text = new fabric.Text('Hello Fabric.js!', {
left: 200,
top: 150,
fontSize: 24,
fill: 'blue'
});
canvas.add(text);
// 加入图片
fabric.Image.fromURL('image.jpg', function(img) {
img.set({ left: 300, top: 50, scaleX: 0.5, scaleY: 0.5 });
canvas.add(img);
});
// 导出 JSON
const json = canvas.toJSON();
console.log('Canvas JSON:', json);
// 导出 SVG
const svg = canvas.toSVG();
console.log('Canvas SVG:', svg);
</script>
你可以看到:
-
首先通过
new fabric.Canvas('c')创建了一个画布实例。 -
然后通过
fabric.Rect、fabric.Text、fabric.Image.fromURL等创建对象并加入。 -
最后可以导出状态或图像。
典型用途场景
-
在线图形或海报编辑器:用户可以拖拽、变换、旋转文字或图片。
-
绘图白板 / 注释工具:支持手绘、喷漆、路径绘制、撤销/重做。
-
图片滤镜应用:利用 Fabric 的图像过滤器对图片进行加工。
-
SVG 导入/导出:例如用户上传 SVG 图标然后在画布中操作,再导出为 PNG。
-
服务器端生成图像:在 Node.js 环境下利用 Fabric.js 生成图片(如电子名片、社交分享图等)。
实用小技巧 & 注意事项
-
确保图像加载完成后再将其加入画布,避免出现空白或位置错误。
-
当需要禁止交互(如只是渲染静态图)时,可以使用
StaticCanvas。 -
在性能上,如果画布对象很多、频繁渲染,可考虑开启对象缓存 (objectCaching),减少重绘成本。
-
对应移动端触控事件也支持,但需测试不同设备的兼容性。
-
虽然 Fabric.js 抽象了很多 Canvas 细节,但理解底层 Canvas API 依然有助于解决复杂场景。
-
如果项目规模非常大、需要超高性能或自定义 WebGL 渲染,可能需要考虑其他库。但对于多数图形编辑场景,Fabric.js 足够且应用广泛。
总结
Fabric.js 是一个功能强大且易于上手的库,适用于需要在 HTML5 Canvas 上实现对象化图形操作、交互编辑和图像导出功能的 Web 应用。无论你是想快速搭建一个可拖拽编辑器、还是在服务器生成图像,它都提供了坚实的基础。建议你实际动手创建一个小 demo,比如拖拽图片+添加文字,然后再深入探索其分组、动画、过滤器、SVG 导入/导出等高级功能。