在真正開始動手做之前先來了解 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 ) |