Fabric.js - 一个强大的 Javascript 库,它让使用 HTML5 画布变得轻而易举。Fabric 为画布提供了一个缺失的对象模型,以及一个 SVG 解析器、交互层和一整套其他不可或缺的工具。它是一个完全开源的项目。
如今, Canvas使我们能够在网络上创建一些绝对 令人惊叹的 图形。但它提供的 API令人失望地低级。如果我们只是想在画布上绘制一些基本形状而忘记它们,那是一回事。但是,一旦需要进行任何类型的交互、随时更改图片或绘制更复杂的形状,情况就会发生巨大变化。
Fabric旨在解决这个问题。
官网 Fabric.js
npm install fabric --save
npm方式引入
import { fabric } from 'fabric'
<script src="http://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.4.6/fabric.min.js"></script>
cdn方式引入全局就有了fabric对象
- fabric.Circle //圆形
- fabric.Ellipse //椭圆
- fabric.Line //线
- fabric.Polygon //多边形
- fabric.Polyline //交叉线 折线
- fabric.Rect //矩形
- fabric.Triangle//三角形
- mouse:down 鼠标按下
- mouse:move 鼠标移动
- mouse:dblclick 鼠标双击
- object:added 添加图层
- object:modified 编辑图层
- object:removed 移除图层
- selection:created 初次选中图层
- selection:updated 图层选择变化
- selection:cleared 清空图层选中
<canvas id="canvas" width="400" height="400"></canvas>
// 样式
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
width: 100vw;
height: 100vh;
}
#canvas {
border: 1px solid red;
}
</style>
// 实例化
let fabricObj = new fabric.Canvas('canvas')
// 设置画布宽高 可以动态设置画布宽高,如果在标签上也设置了宽高,则会将其覆盖掉
fabricObj.setWidth(650)
fabricObj.setHeight(650)
// 设置背景图
// 读取图片地址,设置画布背景
fabric.Image.fromURL('./image/4.jpg', (img) => {
img.set({
// 通过scale来设置图片大小,这里设置和画布一样大
scaleX: fabricObj.width / img.width, // 这里也可以写0 - 1
scaleY: fabricObj.height / img.height, // 这里也可以写0 - 1
});
// 设置背景
fabricObj.setBackgroundImage(img, fabricObj.renderAll.bind(fabricObj));
fabricObj.renderAll();
})
// 画个矩形
let rect = new fabric.Rect({
left: 100,
top: 50,
fill: '#ccc',
width: 30,
height: 30,
strokeWidth: 5,//笔触宽度
hasControls: true, //选中时是否可以放大缩小
hasRotatingPoint: true,//选中时是否可以旋转
hasBorders:true,//选中时是否有边框
transparentCorners:true,
perPixelTargetFind:true,//默认false。当设置为true,对象的检测会以像互点为基础,而不是以边界的盒模型为基础。
selectable:true,//是否可被选中
lockMovementX: true,//X轴是否可被移动(true为不可,因为前缀是lock)
lockMovementY: true,//Y轴是否可被移动(true为不可,因为前缀是lock)
})
fabricObj.add(rect)
// 画个圆
let circle = new fabric.Circle({
left: 100,
top: 100,
fill: '#007acc',
radius: 50 // 半径
})
fabricObj.add(circle)
// 画个三角形
let triangle = new fabric.Triangle({
left: 100,
top: 250,
fill: '#ffcd43',
width: 100,
height: 50
})
fabricObj.add(triangle)
// 画线
let line = new fabric.Line([200, 300, 200, 150], {//终止位置,线长,起始位置,top,这里是从项目中截下来的我用了变量代替,你要用的话lineheight和lineleft用自己的变量或者数字代替。如果两个终止位置和起始位置的数值一样那么这个线条会垂直,这个应该很好理解。
fill: '#5E2300',//填充颜色
stroke: '#5E2300',//笔触颜色
strokeWidth: 5,//笔触宽度
hasControls: false, //选中时是否可以放大缩小
hasRotatingPoint: false,//选中时是否可以旋转
hasBorders:false,//选中时是否有边框
transparentCorners:true,
perPixelTargetFind:true,//默认false。当设置为true,对象的检测会以像互点为基础,而不是以边界的盒模型为基础。
selectable:true,//是否可被选中
lockMovementX: true,//X轴是否可被移动(true为不可,因为前缀是lock)
lockMovementY: true,//Y轴是否可被移动(true为不可,因为前缀是lock)
});
fabricObj.add(line)
// 画个椭圆
let ellipse = new fabric.Ellipse({
rx: 80, // 定义水平半径
ry: 40, // 定义垂直半径
fill: 'blue',
borderDashArray: [10] //定义边框的虚线图案
});
fabricObj.add(ellipse)
用鼠标绘制多边形可以 参考下面这位园友的一篇博客