中文教程
fabric Demo
菜鸟canvas文档
菜鸟参考手册

Fabric.js is a powerful and simpleJavascript HTML5 canvas library

1、什么是 Fabric.js

一个功能强大的 Javascript 库,使使用 HTML5 canvas 变得轻而易举。
Fabric.js 为 Canvas 提供所缺少的对象模型, 交互和一整套其他不可或缺的工具

2、为什么用它而不用其他的

首先,Canvas 提供了一个画布的能力, 但是 api 不够友好。我们在 pc 端的批改是用的原生 canvas,但应用到小程序经过调研发现并不合适。canvas.绘制简单图形其实还可以, 不过做一些复杂的图形绘制, 编写一些复杂的效果,就不是那么方便了。所以,我们决定使用 Fabric.js 来开发
它主要就是用对象的方式去编写代码。

3、对比 canvas

  • a.原生 canvas
  1. // 有一个id是c的canvas元素
  2. var canvasEl = document.getElementById("c");
  3. // 获取2d位图模型
  4. var ctx = canvasEl.getContext("2d");
  5. // 设置填充颜色
  6. ctx.fillStyle = "red";
  7. // 创建一个坐标100,190,尺寸是20,20的矩形
  8. ctx.fillRect(100, 100, 20, 20);
  • b.fabric.js
  1. // 用原生canvas元素创建一个fabric实例
  2. var canvas = new fabric.Canvas("c");
  3. // 创建一个矩形对象
  4. var rect = new fabric.Rect({
  5. left: 100,
  6. top: 100,
  7. fill: "红色",
  8. width: 20,
  9. Height: 20,
  10. });
  11. // 将矩形添加到canvas画布上
  12. canvas.add(rect);

4、使用

1、npm 安装

npm install fabric —save

2、通过 CDN 引入

  1. <script src="http://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.4.6/fabric.min.js"></script>

3、项目中引入使用

import { fabric } from ‘fabric’

  1. js:
  2. canvasCtx = new fabric.Canvas('my-canvas', {
  3. enableRetinaScaling: true,
  4. perPixelTargetFind: true, // 对象基于像素检测
  5. skipTargetFind: true,
  6. selection: false,
  7. selectable: false
  8. });
  9. dom:
  10. <canvas
  11. id="my-canvas"
  12. className="canvas"
  13. width=375
  14. height=650
  15. ></canvas>

创建完实例后,fabric.js 会构建两层 canvas 元素:lower-canvas 和 upper-canvas
lower-canvas: 只负责渲染元素
upper-canvas: 负责所有的事件处理

5、事件绑定

  1. let canvasCtx = new fabric.Canvas("my-canvas", {
  2. enableRetinaScaling: true,
  3. perPixelTargetFind: true, // 对象基于像素检测
  4. skipTargetFind: true,
  5. selection: false,
  6. selectable: false,
  7. });
  8. canvasCtx.on("mouse:down", (options) => {
  9. console.log(options, "mouse:down");
  10. });
  11. canvasCtx.on("mouse:up", (options) => {
  12. console.log(options, "mouse:up");
  13. });
  14. canvasCtx.on("mouse:move", (options) => {
  15. console.log(options, "mouse:move");
  16. });

6、绘制图片

  1. // 创建图片
  2. function creatImg() {
  3. const imageUrl = new Image();
  4. imageUrl.setAttribute("crossOrigin", "Anonymous"); // 图片跨域
  5. imageUrl.src = "./1.jpeg";
  6. imageUrl.onload = () => {
  7. const imageBg = new fabric.Image(imageUrl);
  8. canvas.add(imageBg);
  9. };
  10. }
  11. // 直接引入图片的情况
  12. var canvas = new fabric.Canvas("c");
  13. fabric.Image.fromURL("./1.jpeg", function (oImg) {
  14. canvas.add(oImg);
  15. });

移动

  1. var canvas = new fabric.Canvas("c");
  2. // 创建一个45度的矩形
  3. function creatRect() {
  4. var rect = new fabric.Rect({
  5. left: 100,
  6. top: 100,
  7. fill: "red",
  8. width: 20,
  9. height: 20,
  10. angle: 45,
  11. });
  12. return rect;
  13. }
  14. let rect = creatRect();
  15. canvas.add(rect);
  16. // 移动
  17. function move(x, y) {
  18. rect.set({ left: x, top: y });
  19. canvas.renderAll();
  20. }
  21. move(200, 300);
  1. <a name="cf3a18de"></a>
  2. # 层次和继承
  3. 对于从 fabric.Object 继承的所有 Fabric 对象都是通用的。<br />fabric.Circle 等都继承于 fabric.Object<br />可以给 fabric.Object 添加原型的方式扩展方法和属性
  4. ```javascript
  5. fabric.Object.prototype.getAngleInRadians = function () {
  6. return (this.get("angle") / 180) * Math.PI;
  7. };
  8. var rect = new fabric.Rect({ angle: 45 });
  9. rect.getAngleInRadians(); // 0.785...
  10. var circle = new fabric.Circle({ angle: 30, radius: 10 });
  11. circle.getAngleInRadians(); // 0.523...
  12. circle instanceof fabric.Circle; // true
  13. circle instanceof fabric.Object; // true

Canvas

  1. var canvas = new fabric.Canvas("c");
  2. var rect = new fabric.Rect();
  3. // 添加对象
  4. canvas.add(rect);
  5. // 获取第几个元素的对象信息
  6. canvas.item(0);
  7. // 获取所有对象(只有一个矩形)
  8. canvas.getObjects();
  9. // 移除这个矩形
  10. canvas.remove(rect);

互动

是否禁止互动

  1. var canvas = new fabric.Canvas('c');
  2. ...
  3. canvas.selection = false; // 禁止所有选中
  4. rect.set('selectable', false); // 只是禁止这个矩形选中

完全没有互动的版本

  1. var canvas = new fabric.Canvas('c');
  2. ...
  3. canvas.selection = false; // 禁止所有选中
  4. rect.set('selectable', false); // 只是禁止这个矩形选中

路径

创建路径 M 🈯️画笔移动从0 0 画L 代表直线 到200 100 画直线到170 200 z代表闭合

  1. var canvas = new fabric.Canvas("c");
  2. var path = new fabric.Path("M 0 0 L 200 100 L 170 200 z");
  3. path.set({ left: 120, top: 120 });
  4. canvas.add(path);

加载SVG

abric.loadSVGFromString或fabric.loadSVGFromURL