在真正開始動手做之前先來了解 fabric.js 有哪些面向吧!
就算功能沒學起來至少知道未來可以朝什麼方向下關鍵字XD
分為這幾個區塊:
以下介紹個別區塊可以達成、負責的事,以及列出常見的 api
畫布本體:Canvas 模塊是 Fabric.js 的核心部分,負責管理整個畫布。
以下做簡單的舉例:
add)
const canvas = new fabric.Canvas('c');
const rect = new fabric.Rect({
left: 100,
top: 100,
fill: 'red',
width: 50,
height: 50,
});
canvas.add(rect);
remove)
canvas.remove(rect);
clear)
canvas.clear();
zoomToPoint)
const zoomPoint = new fabric.Point(100, 100);
canvas.zoomToPoint(zoomPoint, 2); // 將畫布縮放到2倍
relativePan)
const panPoint = new fabric.Point(50, 50);
canvas.relativePan(panPoint); // 將畫布平移50像素
on, off)
// 添加事件監聽器
canvas.on('mouse:down', function(event) {
console.log('Mouse down at', event.pointer);
});
// 移除事件監聽器
canvas.off('mouse:down');
畫布上的物件:所有的物件(例如 fabric.Rect, fabric.Circle, fabric.Text 等)都繼承自 fabric.Object,是所有可繪製物件的基礎。它提供了通用的屬性和方法,如位置、大小、旋轉等。
left, top)、大小(width, height)、顏色(color)等。scale())、旋轉(rotate())、傾斜(skewX() 和 skewY())等。fabric.Object 屬性位置和尺寸
left: 物件的左邊位置top: 物件的頂部位置width: 物件的寬度height: 物件的高度scaleX: 物件的水平縮放比例scaleY: 物件的垂直縮放比例angle: 物件的旋轉角度外觀
fill: 填充顏色stroke: 邊框顏色strokeWidth: 邊框寬度opacity: 透明度shadow: 陰影效果行為
selectable: 是否可選擇evented: 是否觸發事件visible: 是否可見hasControls: 是否顯示控制點hasBorders: 是否顯示邊框其他
clipPath: 剪裁路徑globalCompositeOperation: 全局合成操作(例如 source-over, destination-over 等)fabric.Object 詳細官方文件:http://fabricjs.com/docs/fabric.Object.html
屬性的設置使用起來像這樣:
const canvas = new fabric.Canvas('c');
const rect = new fabric.Rect({
left: 100,
top: 100,
width: 50,
height: 50,
fill: 'red',
opacity: 0.7,
stroke: 'blue',
strokeWidth: 2,
angle: 45,
selectable: true,
});
canvas.add(rect);
或是事後再使用 set 設置或更改也可以
rect.set({
left: 100,
top: 100,
fill: 'blue',
strokeWidth: 10,
});
物件的集合:Group 模塊允許將多個物件組合成一個單元,從而可以對這些物件進行群組級別的變換和操作。
同樣可以做跟單一 object 類似的事:
除此之外可以做 group 的其他動作:
讓物件動起來的腳本:Animation 模塊處理物件的動畫效果,提供緩動函數和動畫控制。
object.animate(property, toValue, options);
property:要動畫的屬性名稱。toValue:動畫結束時的屬性值。options:動畫選項,包括 duration(持續時間)、easing(緩動函數)、onChange(每次屬性變更時的回調函數)等。animate):方法允許你對物件的屬性進行動畫處理。你可以指定開始值和結束值,以及動畫的持續時間和緩動函數。其實跟 css 的動畫設置很像,只是多了可以新增想在 onChange 當下一邊執行的 functionrect.animate('toLeftAnimate', 200, {
onChange: canvas.renderAll.bind(canvas),
duration: 1000,
easing: fabric.util.ease.easeInOutQuad,
onComplete: function() {
console.log('Animation completed');
}
});
pathAnimation):沿著指定的路徑對物件進行動畫處理const path = new fabric.Path('M 0 0 Q 100 100 200 0 T 400 0');
// 對物件進行路徑動畫
circle.animate('pathAnimate', path, {
onChange: canvas.renderAll.bind(canvas),
duration: 2000,
easing: fabric.util.ease.easeInOutQuad,
});
其他檔案的輸入與輸出:Parser 模塊負責解析 SVG 和 JSON 格式的文件,將這些格式轉換為 Fabric.js 的物件。
// 將畫布轉換為 JSON 字符串
const json = canvas.toJSON();
console.log(JSON.stringify(json));
const canvas = new fabric.Canvas('c');
const json = '{"objects":[{"type":"rect","left":100,"top":100,"width":50,"height":50,"fill":"red"}]}';
// 從 JSON 字符串恢復畫布
canvas.loadFromJSON(json, canvas.renderAll.bind(canvas));
// 將畫布轉換為 SVG 字符串
const svg = canvas.toSVG();
console.log(svg);
const svg = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200"><circle cx="130" cy="130" r="30" fill="blue"/></svg>';
// 從 SVG 字符串恢復畫布
fabric.loadSVGFromString(svg, function(objects, options) {
const obj = fabric.util.groupSVGElements(objects, options);
canvas.add(obj).renderAll();
});
object:added, object:removed, object:modified)mouse:down, mouse:up, mouse:move)freeDrawingBrush)eraser)fill)select)以上這些模塊共同構成了 Fabric.js 的核心功能,提供了強大的畫布管理、物件操作、動畫效果和文件解析能力。
把這些基礎元素排列組合互相加成之後,就是我們所知道的圖像編輯器基礎了。
再將今天的內容做統整成表格:
| 模塊 | 描述 | 常見 API |
|---|---|---|
| 畫布管理(Canvas Management) | Canvas 模塊是 Fabric.js 的核心部分,負責管理整個畫布。 | 添加物件 (add), 移除物件 (remove), 清除畫布 (clear), 縮放 (zoomToPoint), 平移 (relativePan), 事件處理 (on, off) |
| 物件操作(Object Manipulation) | 所有的物件(例如 fabric.Rect, fabric.Circle, fabric.Text 等)都繼承自 fabric.Object,是所有可繪製物件的基礎。 |
位置和尺寸:left, top, width, height, scaleX, scaleY, angle;外觀:fill, stroke, strokeWidth, opacity, shadow;行為:selectable, evented, visible, hasControls, hasBorders;其他:clipPath, globalCompositeOperation |
| 群組管理(Group Management) | Group 模塊允許將多個物件組合成一個單元,從而可以對這些物件進行群組級別的變換和操作。 | 同上物件操作 |
| 動畫效果(Animation) | Animation 模塊處理物件的動畫效果,提供緩動函數和動畫控制。 | animate(property, toValue, options) |
| Parser 格式轉換 | Parser 模塊負責解析 SVG 和 JSON 格式的文件,將這些格式轉換為 Fabric.js 的物件。 | JSON 解析和格式轉換 SVG 解析和格式轉換 |
| 事件系統(Event System) | 提供物件事件和畫布事件的處理。 | 物件事件:object:added, object:removed, object:modified;畫布事件:mouse:down, mouse:up, mouse:move |
| 繪圖工具(Drawing Tools) | 提供自由繪製、形狀繪製、路徑創建和編輯的工具。 | 自由繪圖 (freeDrawingBrush), 橡皮擦 (eraser), 填充 (fill), 選擇 (select) |