Fabric
Hello Fabric
安装
bash1pnpm install fabric
或者通过 cdn 引入
html1<script src="https://cdn.jsdelivr.net/npm/fabric"></script>
创建 canvas 元素。
html1<!DOCTYPE html> 2<html> 3 <head> 4 <title>Parcel Sandbox</title> 5 <meta charset="UTF-8" /> 6 <style> 7 #c { 8 border: 1px solid black; 9 } 10 </style> 11 <script src="https://cdn.jsdelivr.net/npm/fabric"></script> 12 </head> 13 14 <body> 15 <div id="app"> 16 <canvas id="c" width="300" height="300"></canvas> 17 </div> 18 </body> 19</html>
画矩形
js1// 这里捕获 canvas 元素,注意直接写 id 而不是#id 2const canvas = new fabric.Canvas('c') 3// 定义矩形的初始坐标、颜色和初始大小 4const rect = new fabric.Rect({ 5 left: 100, 6 top: 100, 7 fill: 'red', 8 width: 50, 9 height: 50, 10}) 11//添加到画板上 12canvas.add(rect)
画圆形
js1// 画圆 2const circle = new fabric.Circle({ 3 radius: 25, 4 left: 0, 5 top: 0, 6 fill: 'blue', 7}) 8canvas.add(circle)
跟矩形类似,圆形需要定义 radius(半径)。
画三角形
js1//画三角形 2const triangle = new fabric.Triangle({ 3 width: 80, 4 height: 80, 5 fill: 'grren', 6 left: 0, 7 top: 150, 8}) 9 10canvas.add(triangle)
小结
从上面的案例可以看出来,画 canvas 的图形需要几个基本要素:
- 画板元素
<canvas> - 坐标 coordinate
- 颜色
- 矩形的大小元素(例如 width、height、radius)
- 添加到 canvas 中
利用这些元素,极大地简化了 canvas 的操作,并且所有元素默认都是可拖拽、移动、伸缩的。
插入图片
fabric 提供 Image.fromURL方法,可以动态加载图片,并且塞到 canvas 元素中。
js1// 插入图片 2fabric.Image.fromURL('https://cdn.wallpapersafari.com/62/31/NA3nl0.jpg', function (oImage) { 3 oImage.scale(0.2) 4 canvas.add(oImage) 5})
其中,第二个参数是 handler 函数,我们在该函数中对加载过来的图片进行一些操作,操作方式很多,例子中是将其缩小到原来的 1/5 大小。
canvas.add 也是在 handler 中处理的。
不规则图形
不规则图形本质上是通过点或者线等基本的绘制元素,将坐标按照绘制元素给串联起来组合而成的。
比如,我们手动绘制不规则图形时,就是将画笔在画布上所走过的路径(path)给描出来。

现在我们就是用代码的方式,将生成不规则图形的过程给写出来。
下面我们利用fabric.Path方法来生成不规则图形,所有不规则图形都有事先的坐标,这些坐标则作为该方法的参数,然后通过线、点等串联起来即可。
js1const path = new fabric.Path('M 0 0 L 200 200 L 160 200 z') 2path.set({ 3 left: 200, 4 top: 200, 5 fill: 'black', 6}) 7canvas.add(path)
Path 方法的入参,这里重点解释一下:
M 0 0表示开始移动,最开始的坐标为0 0L 200 200表示用Line画一条到 (200,200)的线L 160 200从上次所在的坐标点(200,200),画一条到(160,200)的线z表示不规则图形闭合(即从160,200回归到原点)
整个过程用画笔画下来类似这样的效果:

接着就是对该路径的设置:
js1path.set({ 2 left: 200, 3 top: 200, 4 fill: 'black', 5})
这个路径我们将其放置在画布的 200 200 位置,最后将其填充为黑色。
由于这种路径方式可阅读性不高,并且坐标的参数容易出错,所以当遇到比较难的图形时,一般我们会用 svg 替代它。