相关文章推荐
有腹肌的卡布奇诺  ·  js ...·  1 月前    · 
绅士的洋葱  ·  A glimpse of ...·  1 月前    · 
英俊的刺猬  ·  Prettier, ESLint and ...·  6 月前    · 
严肃的熊猫  ·  Spring ...·  1 年前    · 
本文介绍了Fabric.js中关键的操作技巧,包括获取与设置画布对象属性、对象的层级管理、对象移动与放大的边界限制、图片加载及缩放、背景图片处理、蒙版设置等,帮助开发者更好地掌握此Canvas插件。 摘要生成于 ,由 DeepSeek-R1 满血版支持, //5: 设置画布中的对象的某个属性值,比如第 0 个对象的 id var items = canvas.getObjects(); tems[ 0 ].id = "items_id0" 或 items[ 0 ].set( "id" , "items_id0" ) //6:获得画布中对象的某个属性,比如 第0 个对象的 id var items = canvas.getObjects(); items[ 0 ].id; items[ 0 ].get( "id" ); //7: 重新渲染一遍画布,当画布中的对象有变更,在最后显示的时候,需要执行一次该操作 canvas.renderAll() //8: 清除画布中所有对象: canvas.clear(); //9:清除画布中的活动对象: var t = canvas.getActiveObject(); t && canvas.remove(t); //10: 设置活动对象在画布中的层级 var t = canvas.getActiveObject(); canvas.sendBackwards(t) //向下跳一层 canvas.sendToBack(t) //向下跳底层: canvas.bringForward(t) //向上跳一层: canvas.bringToFront(t) //向上跳顶层: //或者: t.sendBackwards(); t.sendToBack(); t.bringForward(); t.bringToFront(); //10:加载图片时图片缩放到指定的大小。 fabric.Image.fromURL(image_src, function (oImg) { oImg.set({ left:tmp_left, top:tmp_top, centeredScaling: true , cornerSize: 7 , cornerColor: "#9cb8ee" , transparentCorners: false , oImg.scaleToWidth(image_width); oImg.scaleToHeight(image_height); canvas.add(oImg).setActiveObject(oImg); //11:当选择画布中的对象时,该对象不出现在顶层。 canvas.preserveObjectStacking = true ; // 12:为画布通过URL方式添加背景图片 var bg_url = "http://www.xxxx.com/...../bg.png" fabric.Image.fromURL( bg_url , function (oImg) { oImg.set({ width: canvas_obj.width, height: canvas_obj.height, originX: 'left' , originY: 'top' canvas_obj.setBackgroundImage(oImg, canvas_obj.renderAll.bind(canvas_obj)); //13: originx: originy:代表坐标系。 function objectMoving (e) { var obj = e.target; if (obj.currentHeight > obj.canvas.height || obj.currentWidth > obj.canvas.width){ return ; obj.setCoords(); // top-left corner if (obj.getBoundingRect().top < 0 || obj.getBoundingRect().left < 0 ){ obj.top = Math .max(obj.top, obj.top-obj.getBoundingRect().top); obj.left = Math .max(obj.left, obj.left-obj.getBoundingRect().left); // bot-right corner if (obj.getBoundingRect().top+obj.getBoundingRect().height > obj.canvas.height || obj.getBoundingRect().left+obj.getBoundingRect().width > obj.canvas.width){ obj.top = Math .min(obj.top, obj.canvas.height-obj.getBoundingRect().height+obj.top-obj.getBoundingRect().top); obj.left = Math .min(obj.left, obj.canvas.width-obj.getBoundingRect().width+obj.left-obj.getBoundingRect().left); //16:当画布对象放大时限制其操出边界: //注意当创建对象到画布上时必须先加上: obj.saveState(); //在对象修改时方法里就可以调用了。 function objectModified (e) { let obj = e.target; let boundingRect = obj.getBoundingRect( true ); if (boundingRect.left < 0 || boundingRect.top < 0 || boundingRect.left + boundingRect.width > obj.canvas.getWidth() || boundingRect.top + boundingRect.height > obj.canvas.getHeight()) { obj.top = obj._stateProperties.top; obj.left = obj._stateProperties.left; obj.angle = obj._stateProperties.angle; obj.scaleX = obj._stateProperties.scaleX; obj.scaleY = obj._stateProperties.scaleY; obj.setCoords(); obj.saveState(); } else { obj.saveState(); //17:当生成json对象时,背景图片显示出来。 fabric.Image.fromURL( bgImg, function (oImg) { oImg.set({ width: 400 , height: 400 , left: 0 , top: 0 , originX: 'left' , originY: 'top' , opacity: 0 //当toObject方法时显示背景图片。 oImg.toObject = ( function (toObject) { return function () { return fabric.util.object.extend(toObject.call( this ), { opacity: 1 })(oImg.toObject); canvas_obj.setBackgroundImage(oImg, canvas_obj.renderAll.bind(canvas_obj)); }, { crossOrigin: 'Anonymous' }); //18:创建蒙版层 //获取蒙版位置属性(非必要): var maskLayerTop = parseInt ($( this ).attr( "data-top" )); var maskLayerLeft = parseInt ($( this ).attr( "data-left" )); var maskLayerWidth = parseInt ($( this ).attr( "data-width" )); var maskLayerHeight = parseInt ($( this ).attr( "data-height" )); //创建蒙版 var clipMask = new fabric.Rect({ originX: 'left' , originY: 'top' , left: maskLayerLeft, top: maskLayerTop, width: maskLayerWidth, height: maskLayerHeight, fill: 'rgba(0,0,0,0)' , strokeWidth: 0 , selectable: false clipMask.set({ clipFor: 'pug' canvas_obj.add(clipMask); function degToRad (degrees) { return degrees * ( Math .PI / 180 ); function findByClipName (name) { return _(canvas_obj.getObjects()).where({ clipFor: name }).first() canvas_obj.clipByName = function (ctx) { this .setCoords(); var clipObj = findByClipName( this .clipName); var scaleXTo1 = ( 1 / this .scaleX); var scaleYTo1 = ( 1 / this .scaleY); var skewXReverse = - this .skewX; var skewYReverse = - this .skewY; ctx.save(); var ctxLeft = -( this .width / 2 ) + clipObj.strokeWidth; var ctxTop = -( this .height / 2 ) + clipObj.strokeWidth; var ctxWidth = clipObj.width - clipObj.strokeWidth; var ctxHeight = clipObj.height - clipObj.strokeWidth; ctx.translate( ctxLeft, ctxTop ); ctx.scale(scaleXTo1, scaleYTo1); ctx.transform( 1 , skewXReverse, skewYReverse, 1 , 0 , 0 ); ctx.rotate(degToRad( this .angle * - 1 )); ctx.beginPath(); ctx.rect( clipObj.left - this .oCoords.tl.x, clipObj.top - this .oCoords.tl.y, clipObj.width, clipObj.height ctx.closePath(); ctx.restore(); //调用的地方: //文字层设置蒙版 var t = new fabric.Text( "Your Text" , { id: first_level+ "-text-input" +unique_id, cornerSize: 7 , cornerColor: "#9cb8ee" , transparentCorners: false , textAlign: "center" , clipName: 'pug' , clipTo: function (ctx) { return _.bind(tmp_canvas_obj.clipByName, t)(ctx) // 图片层设置蒙版: // add the forntimage to the canvas fabric.Image.fromURL(image_src, function (oImg) { oImg.set({ id:first_level+ "-image-input" +unique_id, left:tmp_left, top:tmp_top, centeredScaling: true , cornerSize: 7 , cornerColor: "#9cb8ee" , transparentCorners: false , clipName: 'pug' , clipTo: function (ctx) { return _.bind(tmp_canvas_obj.clipByName, oImg)(ctx) //19:生成的图片缩放到指定的尺寸。 oImg.scaleToWidth(image_width); oImg.scaleToHeight(image_height); //20:to object 时添加 id属性。 oImg.toObject = ( function (toObject) { return function () { return fabric.util.object.extend(toObject.call( this ), { id: this .id, })(oImg.toObject); oImg.id = first_level+ "-image-input" +unique_id; oImg.saveState(); tmp_canvas_obj.add(oImg).setActiveObject(oImg); }, { crossOrigin: 'Anonymous' }); tmp_canvas_obj.renderAll();
Fabric . js Fabric . js 是一个易于使用HTML5 canvas元素的框架。 它是画布元素顶部的交互式对象模型。 它也是SVG画布解析器。 使用 Fabric . js ,您可以在画布上创建和填充对象。 对象,例如简单的几何形状-矩形,圆形,椭圆形,多边形,或更复杂的形状,包含数百或数千个简单路径。 然后,您可以使用鼠标缩放,移动和旋转这些对象。 修改它们的属性-颜色,透明度,z-index等。您还可以一起操纵这些对象-通过简单的鼠标选择将它们分组。 面料非技术介绍 Fabric . js 允许您使用JavaScript在网页上HTML <canvas>元素上轻松创建简单的形状,例如矩形,圆形,三角形和其他多边形,或者由许多路径组成的更复杂的形状。 然后, Fabric . js 将允许您使用鼠标来操纵这些对象的大小,位置和旋转。 也可以使用 Fabric . js 库更改这些对象的某些属性,例如它们的
Fabric . js 是什么 Fabric . js 是一个简化HTML5 Canvas开发的Javascript库, Fabric . js 提供了HTML5 Canvas本身缺失的对象模型、交互层、SVG解析器以及其他一整套工具。它是一个完全开源的项目,在MIT下获得授权,多年来一直在维护,近期要发布4 . 0版本,支持自定义controls。 Fabric . js 能做什么 在Canvas画布上创建、填充图形(包括图片、文字、规则图形和复杂路径组成图形)。 给图形填充渐变颜色。 组合图形(包括组合图形、图形文字、图片等)。
Fabric . js 是一个可以简化 Canvas 程序编写的库。 Fabric . js 为 Canvas 提供所缺少的对象模型,svg parser,交互和一整套其他不可或缺的工具。由于 Fabric . js 为国外框架,官方 API 杂乱繁多,相关文档大多为英文文档,而且数量不多,所以本文旨在帮助新手在项目中快速上手 Fabric . js ,享受绘制Canvas的过程。 为什么要使用 Fabric . js ? Canvas 提供一个好的画布能力,但是 Api 不够友好。绘制简单图形其实还可以,不过做一些复杂的图形绘
Fabric . js : 动态和可交互的HTML5 Canvas库 Fabric . js 是一个强大的、动态的、基于对象的JavaScript库,专为在HTML5画布上构建富交互式应用而设计。它提供了一个灵活的API和友好的编程模型,使开发人员可以轻松地在Canvas上创建、操作和管理各种图形元素。 什么是 Fabric . js Fabric . js 是一个轻量级的JavaScript库,用于在HTML5 &l . . .
官网地址:http:// fabric js . com/ git https://github . com/kangax/ fabric . js / <!DOCTYPE html> <html lang="en"> <meta charset="UTF-8"> <meta name="viewport" . . .
最近项目有一个绘制的功能,搜了一圈发现 fabric . js 口碑不错,但是文档稀缺,于是东看看西搜搜的把项目的需求都给实现了,想分享一下。 篇幅有点长,但看完后可以轻松驾驭 fabric 。我的项目是基于VUE+webpack的。 先来看一下整体效果 1 . 安装 fabric 在node环境下安装 fabric . js 需要先安装 js dom 和canvas ①安装 js dom依赖 . . .
function objectMoving(e){ var obj = e.target; // mask 是限制区域, 实例化 canvas 的时候,挂载为 canvas 对象的一个属性 // mask 的属性包括{left:'',top:'',width:'',height:''} 四个值。 // 区域计算的时候还要考虑坐标系的设置:这个例子是 originX = 'center',originY = 'center',挂载在原型上。 // fabric.Object.prototype.originX = 'center'; // fabric.Object.prototype.originY = 'center'; // 移动的时候判断 并修改相应的坐标。 // 小于横坐标最小值。 if(obj.top-obj.height*obj.scaleY/2 < obj.canvas.mask.top-obj.canvas.mask.height/2+obj.height*obj.scaleY/2){ obj.top = Math.max(obj.top, obj.canvas.mask.top-obj.canvas.mask.height/2+obj.height*obj.scaleY/2); fabric.js 知识点整理 daicooper: //小于纵坐标最小值 if(obj.left-obj.width*obj.scaleX/2 < obj.canvas.mask.left-obj.canvas.mask.width/2+obj.width*obj.scaleX/2){ obj.left = Math.max(obj.left, obj.canvas.mask.left-obj.canvas.mask.width/2+obj.width*obj.scaleX/2); // 大于横坐标最大值。 if(obj.top+obj.height*obj.scaleY/2 > obj.canvas.mask.top+obj.canvas.mask.height/2){ obj.top = Math.min(obj.top, obj.canvas.mask.top+obj.canvas.mask.height/2-obj.height*obj.scaleY/2); // 大于纵坐标最大值。 if(obj.left+obj.width*obj.scaleX/2 > obj.canvas.mask.left+obj.canvas.mask.width/2){ obj.left = Math.min(obj.left, obj.canvas.mask.left+obj.canvas.mask.width/2-obj.width*obj.scaleX/2); fabric.js 知识点整理 daicooper: 这个很简单。在对象的moving 事件里判断对象的 x y 坐标。其中 x 坐标大于区域的 横坐标的最小值并且小于区域横坐标的最大值。同理:选中对象的 Y坐标 大于区域的纵坐标的最小值并且要小于区域纵坐标的最大值。最多 4个 判断语句。 fabric.js 知识点整理 king_wsjking_wsj: fabric.js怎么阻止对象移动到画布内的限制区域之外,我看别的示例有个用到globalCompositeOperation: 'source-atop',但加过背景后就不生效了 mysql复制--主从复制配置 ForeverAnt: 能解释下那些配置啥意思嘛?