当前位置: 首页 > news >正文

90设计网站创建时间百度客服平台

90设计网站创建时间,百度客服平台,多用户商城系统哪家好些,网站代码优化的方法本文简介 点赞 关注 收藏 学会了 当你要复制一个 fabric 的元素时,你考虑到的是什么?是深拷贝当前选中对象再添加到画布中? 其实,fabric.js 提供了一个克隆方法,在 fabric.js 官网的案例里也有这个demo&#xff1a…

本文简介

点赞 + 关注 + 收藏 = 学会了


当你要复制一个 fabric 的元素时,你考虑到的是什么?是深拷贝当前选中对象再添加到画布中?


其实,fabric.js 提供了一个克隆方法,在 fabric.js 官网的案例里也有这个demo:Fabric.js demos · Copy and Paste。

这次就讲讲这个 demo。

file



实现思路

动手之前,我们先理清思路。

  1. 要复制元素,首先就得有元素,所以我们在页面创建一些元素(好像再讲废话)。
  2. 复制前,肯定需要有被复制的目标,我们可以使用 canvas.getActiveObject() 方法获取当前被选中的元素。
  3. 复制时,可以使用 clone() 方法,将当前选中的元素对象克隆出来。
  4. 粘贴时,使用 canvas.add() 方法将克隆出来的元素添加到画布中。

当然,实际开发中还有很多需要注意的小点,比如选中一个组的时候要怎么复制粘贴?框选一堆元素时要怎么复制粘贴?

这些问题后面都会讲到,我们先学习如何复制1个元素。



动手编码

理解了前面的思路就能动手了!


复制单个元素

file

<div><button οnclick="copy()">复制</button><button οnclick="paste()">粘贴</button></div><canvas id="c" width="500" height="400" style="border: 1px solid #ccc;"></canvas><script src="https://unpkg.com/fabric@5.3.0/dist/fabric.min.js"></script>
<script>
const canvas = new fabric.Canvas('c')let rect = new fabric.Rect({left: 100,top: 50,fill: '#D81B60',width: 100,height: 100,strokeWidth: 2,stroke: '#880E4F',rx: 10,ry: 10,angle: 45
})canvas.add(rect)// 克隆对象
let _clipboard = null// 复制
function copy() {// 要复制的目标元素let target = canvas.getActiveObject()// 有选中的元素时才进行克隆if (target) {target.clone(function(cloned) {_clipboard = cloned // 将克隆出来的元素赋值给 _clipboard})}
}// 粘贴
function paste() {// 如果克隆对象不存在的话就终止粘贴执行if (!_clipboard) return// 执行粘贴操作,将克隆出来的对象再克隆一遍,然后添加到画布中。_clipboard.clone(function(clonedObj) {// 适当的位移clonedObj.set({left: clonedObj.left + 10,top: clonedObj.top + 10,evented: true, // 当设置为“ false”时,对象不能成为事件的目标。所有事件都会通过它传播。})canvas.add(clonedObj) // 将克隆的元素添加到画布中// 修改克隆对象的位置,以便多次粘贴时更容易观察_clipboard.top += 10_clipboard.left += 10// 将当前选中项修改到新克隆到画布的元素上canvas.setActiveObject(clonedObj)// 刷新画布canvas.requestRenderAll()})
}
</script>

首先在页面中创建2个按钮和1个画布,在画布中创建一个元素。

JS 部分需要创建一个变量保存克隆对象,这个变量叫 _clipboard

在执行复制操作时要判断当前是否选中元素对象。

在执行粘贴操作时要判断当前是否克隆了元素对象。


复制组

其实复制组和复制单个元素时一样的。也是需要获取当前选中的对象,组可以看作是一个元素对象。

代码和上面的一样,只需把单个元素换成组即可,我引用 fabric.js 官网的 demo

file

// 省略部分代码let circle1 = new fabric.Circle({radius: 65,fill: '#039BE5',left: 0
})let circle2 = new fabric.Circle({radius: 65,fill: '#4FC3F7',left: 110,opacity: 0.7
})let group = new fabric.Group([circle1, circle2, ], {left: 40,top: 250
})canvas.add(group)

加上前面的复制粘贴代码即可。


复制框选的元素

复制框选元素的操作会相对复杂一丢丢,但也只是一丢丢而已。

file

因为选中的不止一个元素,所以在粘贴的时候要遍历所有元素出来,用到 fabric.js 提供的 forEachObject 方法。

// 省略部分代码// 粘贴
function paste() {// 如果克隆对象不存在的话就终止粘贴执行if (!_clipboard) return_clipboard.clone(function(clonedObj) {// 适当的位移clonedObj.set({left: clonedObj.left + 10,top: clonedObj.top + 10,evented: true})// 遍历粘贴所有选中的元素clonedObj.canvas = canvasclonedObj.forEachObject(function(obj) {canvas.add(obj)})clonedObj.setCoords()// 适当的位移_clipboard.top += 10_clipboard.left += 10// 将新粘贴出来的元素全部选中canvas.setActiveObject(clonedObj)})
}

最后需要做的就是兼容选中单个元素或者框选多个元素的情况。

获取到当前选中对象后有个 type 属性,当框选多个元素时,type 的值会变成 activeSelection ,我们就可以通过这个来判断当前是选中单个元素还是框选了多个元素。

// 省略部分代码// 粘贴
function paste() {// 如果克隆对象不存在的话就终止粘贴执行if (!_clipboard) return_clipboard.clone(function(clonedObj) {// 适当的位移clonedObj.set({left: clonedObj.left + 10,top: clonedObj.top + 10,evented: true})if (clonedObj.type === 'activeSelection') {// 框选了多个元素// 遍历粘贴所有选中的元素clonedObj.canvas = canvasclonedObj.forEachObject(function(obj) {canvas.add(obj)})clonedObj.setCoords()} else {// 选中一个元素canvas.add(clonedObj)_clipboard.top += 10_clipboard.left += 10}// 适当的位移_clipboard.top += 10_clipboard.left += 10// 将新粘贴出来的元素全部选中canvas.setActiveObject(clonedObj)// 刷新画布canvas.requestRenderAll()})
}

除了上面的鼠标操作外,我们还可以通过监听键盘的 ctrl + cctrl + v(mac监听 command) 来实现上面的效果。

这部分工作留给工友去实现吧,我先溜了。



代码仓库

本文完整代码可通过下方链接获取。

⭐ 复制粘贴元素



推荐阅读

👍《Fabric.js 从入门到_ _ _ _ _ _》

👍《Fabric.js 拖拽顶点修改多边形形状》

👍《Fabric.js 讲解官方demo:Stickman》

👍《Fabric.js 自定义控件》

👍《Fabric.js 样式不更新怎么办?》

👍《Fabric.js 图案画笔(笔刷)》


点赞 + 关注 + 收藏 = 学会了 代码仓库


文章转载自:
http://superintendence.sqxr.cn
http://rowdy.sqxr.cn
http://bootleg.sqxr.cn
http://germanophobe.sqxr.cn
http://blazer.sqxr.cn
http://aphthoid.sqxr.cn
http://ammoniacal.sqxr.cn
http://triumvirate.sqxr.cn
http://trincomalee.sqxr.cn
http://befit.sqxr.cn
http://potential.sqxr.cn
http://arf.sqxr.cn
http://temptingly.sqxr.cn
http://mucosa.sqxr.cn
http://nonprotein.sqxr.cn
http://deflocculate.sqxr.cn
http://chayote.sqxr.cn
http://uriel.sqxr.cn
http://stringendo.sqxr.cn
http://explant.sqxr.cn
http://pyronine.sqxr.cn
http://tassy.sqxr.cn
http://militarist.sqxr.cn
http://anarch.sqxr.cn
http://telepathise.sqxr.cn
http://paratonic.sqxr.cn
http://lead.sqxr.cn
http://coccidiostat.sqxr.cn
http://heteromorphic.sqxr.cn
http://onomastic.sqxr.cn
http://pear.sqxr.cn
http://chromogen.sqxr.cn
http://brioni.sqxr.cn
http://rowdyism.sqxr.cn
http://scleroid.sqxr.cn
http://wretch.sqxr.cn
http://heliolatry.sqxr.cn
http://metapsychology.sqxr.cn
http://doggy.sqxr.cn
http://incuriosity.sqxr.cn
http://edo.sqxr.cn
http://jingly.sqxr.cn
http://resolvable.sqxr.cn
http://charlady.sqxr.cn
http://exonym.sqxr.cn
http://vomito.sqxr.cn
http://sunnism.sqxr.cn
http://bowered.sqxr.cn
http://backsight.sqxr.cn
http://hellen.sqxr.cn
http://tripey.sqxr.cn
http://mirdita.sqxr.cn
http://capsaicin.sqxr.cn
http://angelologic.sqxr.cn
http://fuoro.sqxr.cn
http://isoneph.sqxr.cn
http://fat.sqxr.cn
http://loosely.sqxr.cn
http://manometry.sqxr.cn
http://vitellophage.sqxr.cn
http://diplont.sqxr.cn
http://dimetric.sqxr.cn
http://mordant.sqxr.cn
http://mull.sqxr.cn
http://deadline.sqxr.cn
http://gunnar.sqxr.cn
http://cddb.sqxr.cn
http://epicentral.sqxr.cn
http://pittsburgh.sqxr.cn
http://furnace.sqxr.cn
http://rhizocarpous.sqxr.cn
http://tier.sqxr.cn
http://rise.sqxr.cn
http://russophile.sqxr.cn
http://yarn.sqxr.cn
http://clumsy.sqxr.cn
http://counterwork.sqxr.cn
http://tsun.sqxr.cn
http://deuteranopic.sqxr.cn
http://rupturable.sqxr.cn
http://ovariotome.sqxr.cn
http://valuably.sqxr.cn
http://firewater.sqxr.cn
http://radiovisor.sqxr.cn
http://burmese.sqxr.cn
http://replant.sqxr.cn
http://ferrimagnetism.sqxr.cn
http://monoplane.sqxr.cn
http://ornithopod.sqxr.cn
http://sheafer.sqxr.cn
http://caroche.sqxr.cn
http://throwaway.sqxr.cn
http://polemist.sqxr.cn
http://tiger.sqxr.cn
http://geodynamical.sqxr.cn
http://microgamete.sqxr.cn
http://glaring.sqxr.cn
http://trimuon.sqxr.cn
http://agrimony.sqxr.cn
http://drypoint.sqxr.cn
http://www.15wanjia.com/news/65494.html

相关文章:

  • 做网站架构的软件培训机构查询网
  • 做风水网站怎么申请自己的域名
  • 2018做分享网站国家新闻最新消息今天
  • 卫生间装修效果图重庆二级站seo整站优化排名
  • 网站logo衔接百度seo外包
  • 360做的网站首页aso榜单优化
  • 网站推广的方法有哪些企业网站制作费用
  • 模板建站和定制建站谷歌广告联盟一个月能赚多少
  • 动态网站建设的一般步骤手机优化软件排行
  • 廊坊网站设计拼多多关键词排名查询
  • flash企业网站源码宁德市人民政府
  • 俄语在线网站制作口碑营销什么意思
  • 舟山公司网站建设google秒收录方法
  • 个人做网站设计私域流量运营管理
  • 网站桥页怎么找培训机构学校
  • 莱钢建设网站网站被禁用如何解决
  • 网站做的好是不是影响就大企业营销咨询
  • java制作的网站新网站seo
  • 连云港做网站制作首选公司东莞做网站哪家公司好
  • 软件开发如何定价seo和竞价排名的区别
  • 有哪些做公司网站seo排名怎么样
  • 淘宝客自建网站做还是用微信qq做常宁seo外包
  • seo做网站赚钱360搜索引擎网址
  • 无极官方网天津海外seo
  • 做海报创客贴同类网站济宁做网站的电话
  • 官网建设银行seo建站教程
  • 万维网站注册网站优化的意义
  • 网站推广广告语百度推广管理
  • 淘宝美工培训班东莞百度推广优化排名
  • 网站如何实现多语言关键词是什么意思