如果你的项目有画布拖拽、缩放等功能,而且你不希望背景图跟随拖拽或缩放,那一定要往下读。
本文主要讲解如何锁定背景图,锁定背景图其实只需设置1个属性即可。
本文会添加滚轮缩放画布、拖拽画布等功能来测试 “锁定背景图” 的效果。
应该可以清晰看出,不管如何拖拽和缩放画布,背景图都纹丝不动。
<canvas id="canvasBox" width="600" height="600" style="border: 1px solid #ccc;"></canvas>
<script src="https://cdn.bootcdn.net/ajax/libs/fabric.js/521/fabric.js"></script>
<script>
const canvas = new fabric.Canvas('canvasBox', {
backgroundVpt: false
</script>
**backgroundVpt
设为 false
这个是关键。**设置了这个,背景图就不会再移动了,不受视口的变化影响。
添加背景图、矩形和圆形
为了方便演示,我要设置一个背景图和两个图形元素,缩放时只会修改图形元素,背景图是一动不动的。
fabric.Image.fromURL('../../images/bg.jpg', img => {
canvas.setBackgroundImage(img)
canvas.renderAll()
circle = new fabric.Circle({
name: 'circle',
top: 60,
left: 60,
radius: 30,
fill: 'yellowgreen'
rect = new fabric.Rect({
name: 'rect',
top: 30,
left: 100,
fill: 'orange',
width: 60,
height: 60
canvas.add(circle, rect)
设置完背景图再执行 canvas.renderAll()
才会重新渲染,不然画面看上去是没效果的。
添加滚轮缩放
使用滚轮缩放画布,需要监听 mouse:wheel
。
canvas.on('mouse:wheel', opt => {
const delta = opt.e.deltaY
let zoom = canvas.getZoom()
zoom *= 0.999 ** delta
if (zoom > 20) zoom = 20
if (zoom < 0.01) zoom = 0.01
canvas.zoomToPoint(
{
x: opt.e.offsetX,
y: opt.e.offsetY
opt.e.preventDefault()
opt.e.stopPropagation()
添加拖拽画布事件
最后添加拖拽画布事件。拖拽包括鼠标点下,鼠标移动,松开鼠标这3个事件:
鼠标点下:mouse:down
鼠标移动:mouse:move
松开鼠标:mouse:up
canvas.on('mouse:down', opt => {
let evt = opt.e
canvas.isDragging = true
canvas.lastPosX = evt.clientX
canvas.lastPosY = evt.clientY
canvas.on('mouse:move', opt => {
if (canvas.isDragging) {
let evt = opt.e
let vpt = canvas.viewportTransform
vpt[4] += evt.clientX - canvas.lastPosX
vpt[5] += evt.clientY - canvas.lastPosY
canvas.requestRenderAll()
canvas.lastPosX = evt.clientX
canvas.lastPosY = evt.clientY
canvas.on('mouse:up', opt => {
canvas.setViewportTransform(canvas.viewportTransform)
canvas.isDragging = false
本文讲解的功能不难的,只要在初始化画布时讲 backgroundVpt
设为 false
即可。
我暂时能想到的应用场景是重复花纹的背景,将其固定住。
《backgroundVpt 文档》
⭐背景不受视口变换影响
👍《Fabric.js 上标和下标的使用偏方》
👍《Fabric.js 圆形笔刷》
👍《Fabric.js 自由绘制矩形(逐一分析4种操作方向带来的影响)》
👍《Fabric.js 起飞》