之前使用这个框架写过一个卡片DIY的项目,中间遇到很多问题都只能通过google或github issues才能解决,国内资料较少,所以才想写这篇文章来简单的做下总结,希望可以帮到其他人哈。
附上个人项目地址:
vue-card-diy
欢迎star~ ✨
什么是Fabric.js?
Fabric.js
是一个强大的H5 canvas框架,在原生canvas之上提供了交互式对象模型,通过简洁的api就可以在画布上进行丰富的操作。
该框架是个开源项目,项目地址:
github
Fabric.js有什么功能?
使用Fabric.js,你可以在画布上创建和填充对象; 比如简单的几何形状 - 矩形,圆形,椭圆形,多边形,自定义图片或由数百或数千个简单路径组成的更复杂的形状。 另外,还可以使用鼠标缩放,移动和旋转这些对象; 修改它们的属性 - 颜色,透明度,z-index等。也可以将画布上的对象进行组合。下面我将会介绍我常用的功能以及场景,更多功能可以参考
官方文档
npm安装
npm install fabric --save
通过cdn引用
<script src="http://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.4.6/fabric.min.js"></script>
首先在html页面中写一个350 x 200的canvas标签, 这里不写宽高也行,后面可以通过js来设置宽高
<canvas id="canvas" width="350" height="200"></canvas>
初始化fabric的canvas对象,创建一个卡片(后面都用card
表示画布对象)
const card = new fabric.Canvas('canvas')
card.setWidth(350)
card.setHeight(200)
就是这么简单,这样就创建了一个基本的画布。
开始花样操作
监听画布上的事件
官方提供了很多事件,以下为常用的事件:
object:added
添加图层
object:modified
编辑图层
object:removed
移除图层
selection:created
初次选中图层
selection:updated
图层选择变化
selection:cleared
清空图层选中
card.on('object:modified', (e) => {
console.log(e.target)
设置画布背景
fabric.Image.fromURL('xx/xx/bg.jpg', (img) => {
img.set({
scaleX: card.width / img.width,
scaleY: card.height / img.height,
card.setBackgroundImage(img, card.renderAll.bind(card));
card.renderAll();
如果要设置画布的背景颜色,可以在canvas初始化时设置
const card = new fabric.Canvas('canvas', {
backgroundColor: 'blue'
card.backgroundColor = 'blue';
card.setBackgroundColor('blue');
向画布添加图层对象
fabric.js提供了很多对象,除了基本的 Rect
,Circle
,Line
,Ellipse
,Polygon
,Polyline
,Triangle
对象外,还有如 Image
,Textbox
,Group
等更高级的对象,这些都是继承自Fabric的Object对象。
下面我就介绍如何添加图片和文字,其他对象大同小异
* 如何向画布添加一个Image对象?
const imgElement = document.getElementById('my-image');
const imgInstance = new fabric.Image(imgElement, {
left: 100,
top: 100,
angle: 30,
opacity: 0.85,
scaleX: 0.5,
scaleY: 0.5
card.add(imgInstance);
fabric.Image.fromURL('xx/xx/vue-logo.png', (img) => {
img.set({
hasControls: false,
borderColor: 'orange',
canvas.add(img);
* 如何向画布添加一个Textbox对象?
const textbox = new fabric.Textbox('这是一段文字', {
left: 50,
top: 50,
width: 150,
fontSize: 20,
fontWeight: 800,
hasControls: false,
borderColor: 'orange',
editingBorderColor: 'blue'
card.add(textbox);
获取当前选中的图层对象
this.selectedObj = card.getActiveObject();
card.on('selection:created', (e) => {
this.selectedObj = e.target
const currAngle = this.selectedObj.angle;
const angle = currAngle === 360 ? 90 :currAngle + 90;
this.selectedObj.rotate(angle);
card.renderAll()
this.selectedObj.set({
scaleX: -this.selectedObj.scaleX,
card.renderAll()
card.remove(this.selectedObj)
card.renderAll()
控制画布上的图层层级
向画布添加图层,默认是依次往上叠加,但是当你选中一个图层进入active
状态时,该图层会默认置于顶层,如果像禁止选中图层时指定,可以:
card.preserveObjectStacking = true
设置之后,我选中vue logo就是这个样子,不会置顶。
如何上移和下移图层?
this.selectedObj.bringForward();
this.selectedObj.sendBackwards();
card.moveTo(object, index);
画布状态记录
框架提供了如 toJSON
和 loadFromJSON
方法,作用分别为导出当前画布的json信息,加载json画布信息来还原画布状态。
const currState = card.toJSON();
card.loadFromJSON(lastState, () => {
card.renderAll();
将画布导出成图片
const dataURL = card.toDataURL({
format: 'jpeg',
quality: 0.8
Fabric.js的基本介绍就到这里,这个框架很强大,还有很多功能可以去试试,欢迎大家评论交流哈!