当前位置:网站首页>Fabric. JS background is not affected by viewport transformation
Fabric. JS background is not affected by viewport transformation
2022-07-02 05:18:00 【Director of Moral Education Department】
Brief introduction
give the thumbs-up + Focus on + Collection = Learned to
<br>
If your project has canvas drag 、 Zoom and other functions , And you don't want the background image to be dragged or zoomed , Then read on .
This article mainly explains how to lock the background image , To lock the background image, you only need to set 1 Only attributes .
This article will add a wheel to zoom the canvas 、 Drag and drop the canvas and other functions to test “ Lock background image ” The effect of .

It should be clear that , No matter how you drag and zoom the canvas , The background is still .
<br> <br>
Hands on coding
start
<canvas id="canvasBox" width="600" height="600" style="border: 1px solid #ccc;"></canvas><!-- introduce Fabric.js --><script src="https://cdn.bootcdn.net/ajax/libs/fabric.js/521/fabric.js"></script><script> // Initialize canvas const canvas = new fabric.Canvas('canvasBox', { backgroundVpt: false // Not affected by viewport transformations ( That is, whether you drag or zoom the canvas , The background image is not affected ) })</script>**backgroundVpt Set to false This is the key .** Set this , The background image will no longer move , Not affected by viewport changes .
<br>
Add background 、 Rectangles and circles
For the convenience of demonstration , I want to set up a background image and two graphic elements , Only graphic elements are modified when zooming , The background image is motionless .
// Omitted code fabric.Image.fromURL('../../images/bg.jpg', img => { canvas.setBackgroundImage(img) canvas.renderAll()})// circular circle = new fabric.Circle({ name: 'circle', top: 60, left: 60, radius: 30, // The radius of the circle 30 fill: 'yellowgreen'})// rectangular rect = new fabric.Rect({ name: 'rect', top: 30, // From the top of the container 60px left: 100, // To the left of the container 200px fill: 'orange', // fill a Orange width: 60, // Width 60px height: 60 // Height 60px})// Add rectangle to canvas canvas.add(circle, rect) Execute after setting the background image canvas.renderAll() It will be re rendered , Otherwise, the picture looks useless .
<br>
Add wheel zoom
Use the scroll wheel to zoom the canvas , Need to monitor mouse:wheel .
// Omitted code canvas.on('mouse:wheel', opt => { const delta = opt.e.deltaY // Roller , Rolling up is -100, Rolling down is 100 let zoom = canvas.getZoom() // Gets the current zoom value of the canvas zoom *= 0.999 ** delta if (zoom > 20) zoom = 20 if (zoom < 0.01) zoom = 0.01 canvas.zoomToPoint( { // Key points x: opt.e.offsetX, y: opt.e.offsetY }, zoom ) opt.e.preventDefault() opt.e.stopPropagation()})<br>
Add drag and drop canvas event
Finally, add the drag and drop canvas event . Drag and drop includes mouse clicking , Mouse movement , Release the mouse 3 Events :
- Click the mouse :
mouse:down - Mouse movement :
mouse:move - Loosen the mouse :
mouse:up
canvas.on('mouse:down', opt => { // Trigger when the mouse is pressed let evt = opt.e canvas.isDragging = true // isDragging Is custom canvas.lastPosX = evt.clientX // lastPosX Is custom canvas.lastPosY = evt.clientY // lastPosY Is custom })canvas.on('mouse:move', opt => { // Trigger when mouse moves if (canvas.isDragging) { let evt = opt.e let vpt = canvas.viewportTransform // Focus view conversion 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 => { // Trigger when the mouse is released canvas.setViewportTransform(canvas.viewportTransform) // Set the viewport conversion for this canvas instance canvas.isDragging = false})<br>
<br>
summary
The functions explained in this article are not difficult , Just say when initializing the canvas backgroundVpt Set to false that will do .
The application scenario I can think of for the time being is the background of repeated patterns , Secure it .
<br>
<br>
Source warehouse
The background is unaffected by viewport transformations
<br>
<br>
Recommended reading
《Fabric.js The use of superscripts and subscripts 》
《Fabric.js Draw a rectangle freely ( Analyze one by one 4 Impact of three operation directions )》
《Fabric.js take off 》 give the thumbs-up + Focus on + Collection = Learned to
边栏推荐
- Thread pool batch processing data
- 删除排序数组中的重复项go语言实现
- Latest: the list of universities and disciplines for the second round of "double first-class" construction was announced
- Fabric.js IText 手动设置斜体
- The underlying principle of go map (storage and capacity expansion)
- 2022 Alibaba global mathematics competition, question 4, huhushengwei (blind box problem, truck problem) solution ideas
- Leetcode basic programming: array
- Basic differences between Oracle and MySQL (entry level)
- Mysql基础---查询(1天学会mysql基础)
- 6. Network - Foundation
猜你喜欢

Gee series: Unit 4 data import and export in Google Earth engine

The underlying principle of go map (storage and capacity expansion)

Mathematical knowledge -- understanding and examples of fast power

No logic is executed after the El form is validated successfully

Disable access to external entities in XML parsing

Disable access to external entities in XML parsing

黑马笔记---Map集合体系

黑马笔记---Set系列集合

Fabric.js 右键菜单

Fabric.js 将本地图像上传到画布背景
随机推荐
Fabric.js 3个api设置画布宽高
leetcode存在重复元素go实现
Php/js cookie sharing across domains
About PROFIBUS: communication backbone network of production plant
Gee: explore the characteristics of precipitation change in the Yellow River Basin in the past 10 years [pixel by pixel analysis]
js中的Map(含leetcode例题)
Gee series: Unit 3 raster remote sensing image band characteristics and rendering visualization
函数栈帧的创建和销毁
Fasttext text text classification
Summary of MySQL key challenges (2)
6.网络-基础
7.1模擬賽總結
6. Network - Foundation
Super detailed pycharm tutorial
go实现leetcode旋转数组
Gee: explore the change of water area in the North Canal basin over the past 30 years [year by year]
[common error] the DDR type of FPGA device is selected incorrectly
Two implementation methods of delay queue
Splice characters in {{}}
Gee: create a new feature and set corresponding attributes