Fabric.js 复制粘贴元素

news2024/12/27 12:01:50

theme: smartblue

本文简介

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

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

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

这次就讲讲这个 demo。

01.gif

实现思路

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

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

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

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

动手编码

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

复制单个元素

02.gif

```html

```

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

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

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

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

复制组

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

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

03.gif

```js // 省略部分代码

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) ```

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

复制框选的元素

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

04.gif

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

```js // 省略部分代码

// 粘贴 function paste() { // 如果克隆对象不存在的话就终止粘贴执行 if (!_clipboard) return

_clipboard.clone(function(clonedObj) { // 适当的位移 clonedObj.set({ left: clonedObj.left + 10, top: clonedObj.top + 10, evented: true })

// 遍历粘贴所有选中的元素
clonedObj.canvas = canvas
clonedObj.forEachObject(function(obj) {
  canvas.add(obj)
})
clonedObj.setCoords()

// 适当的位移
_clipboard.top += 10
_clipboard.left += 10

// 将新粘贴出来的元素全部选中
canvas.setActiveObject(clonedObj)

}) } ```

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

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

```js // 省略部分代码

// 粘贴 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 = canvas
  clonedObj.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://www.coloradmin.cn/o/601042.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动驾驶赛道回暖?传统Tier1加速入场,真正赢家正在浮出水面

自动驾驶赛道,在经历过去三年的持续降温之后,正在迎来新一轮上升势头。整合、并购、协作,正在成为新一轮产业周期的关键词。 本周,滴滴自动驾驶与法雷奥签署战略合作及投资意向书,法雷奥将对滴滴自动驾驶进行战略投资…

【VMware】局域网里机器A访问机器B内部的vm虚拟机

一、机器B配置 1、打开机器B上面的VMware,在菜单里找到编辑,在编辑里找到“虚拟网络编辑器” 2、选择 net 项,点击NET设置 3、填写主机端口8090,主机端口不要和其它端口冲突就行,这个端口后面会在机器A上面用到 3.1、…

111.(cesium篇)cesium地球自转

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <html lang="en">

电脑病毒怎么彻底清理?这3个方法可以解决!

案例&#xff1a;电脑中毒无法正常使用怎么办&#xff1f;怎么清理电脑病毒&#xff1f;如何彻底清除病毒&#xff1f;有没有小伙伴知道解决的方法&#xff1f; 在使用电脑的过程中&#xff0c;我们经常会遇到电脑中病毒的情况&#xff0c;它们能够通过各种渠道感染你的计算机…

搭建服务器环境

如果是刚安装好的操作系统 先安装源里的gcc cmake make 等 apt-get install gcc g make cmake autoconf automake libtool 1.gcc 4.8.2 (1)上传gcc 源码在source/下 把gcc-4.8.2.tar.gz放在/home/download/ cd /home/download/ tar -xzvf gcc-4.8.2.tar.gz cd gcc-4.8.2 (2)安…

[POJO]POJO的设计规范Lombok框架

POJO的设计规范 所有用于声明属性的类&#xff0c;都应该遵循以下规范&#xff1a; 存在无参数构造方法 所有属性都是私有权限&#xff08;private&#xff09;的 添加每个属性对应的Setters & Getters 添加基于所有属性的hashCode()与equals() 必须保证&#xff1a;如…

unity | 动画模块之滚动选项框

一、效果动画 如果不是你们想要的&#xff0c;就省的你们继续往下看了 二、作者的话 对于我来说&#xff0c;计算一大堆数据简直太难了&#xff0c;所以自己想了点方法 三、基本功的要求 需要会使用Scroll View 四、进入正题 1.先做一个scrollView把自己想做的东西放进去…

Ubuntu22.04 VirtualBox

Ubuntu22.04 VirtualBox 通常三种虚拟机网络连入模式 桥接网卡 虚拟网卡连入宿主机所在的路由器&#xff0c;公用一个网关地址&#xff0c;自动分配路由器ip到虚拟网卡上&#xff0c;相当于和物理机一样的地址&#xff0c;在同一网段&#xff0c;其他物理机和这个虚拟机一样…

作为一个前端Leader,当你接到一个项目时,应该如何初始化您的项目

1、分析需求 拿到需求后&#xff0c;不是立马动工&#xff0c;我们需要先了解项目的业务需求和用户需求&#xff0c;并明确项目的范围&#xff0c;包括功能点、时间和预算等&#xff0c;来确定项目需求和范围。 2、技术栈选择 根据项目的需求和范围以及团队成员的技术栈&…

aosp12 framework重大bug:contentprovider获取低概率偶现延时10s问题修复经验分享

问题背景&#xff1a; 在android12的版本上&#xff0c;陆陆续续发现一个低概率偶现的问题&#xff0c;那就是桌面第一次启动会存在显示空白10s以上&#xff0c;正常空白一般在1-2s&#xff0c;在个空白10s以上确实就属于非常严重的问题&#xff0c;但这个是一个低概率偶现问题…

Linux - 第21节 - 网络基础(数据链路层)

1.数据链路层 数据链路层解决的问题&#xff1a; • IP拥有将数据跨网络从一台主机送到另一台主机的能力&#xff0c;但IP并不能保证每次都能够将数据可靠的送到对端主机&#xff0c;因此IP需要上层TCP为其提供可靠性保证&#xff0c;比如数据丢包后TCP可以让IP重新发送数据&am…

SpringBoot使用用户输入的自定义数据源启动【附源码】

一、项目背景 不知道小伙伴们有没有遇到过这样的需求&#xff0c;就是一个项目启动时不知道数据源&#xff0c;需要项目无数据源启动后&#xff0c;用户在画面自定义录入数据源信息&#xff0c;然后项目再初始化数据库链接&#xff0c;初始化管理员用户。最后项目进入正常使用…

cuda2 向量加法

向量加法 向量加法程序解读 #include<stdio.h> #include<cuda.h>typedef float FLOAT; #define USE_UNIX 1 区别不同系统 get thread id 1D block and 2D grid #define get_tid() (block)get block id&#xff0c; 2D gridwarm up 可选的&#xff0c;让gpu先运作…

2023年湖北住建厅八大员怎么考取施工员质量员资料员等岗位???

2023年湖北住建厅八大员怎么考取施工员质量员资料员等岗位&#xff1f;&#xff1f;&#xff1f; 2023年湖北住建厅八大员具体包含哪些岗位呢&#xff0c;可以选择的有施工员&#xff0c;质量员&#xff0c;资料员&#xff0c;材料员&#xff0c;机械员&#xff0c;标准员&…

用python进行办公自动化都需要学习什么知识呢?

本文先来分享Python实现自动化办公需要学什么&#xff0c;从哪里学&#xff01;以及自动化办公技巧的资源整理… 很多非IT职场人&#xff0c;想要把Python用到工作中&#xff0c;却不知道如何下手。其实自动化办公无非就是Excel、PPT、Word、邮件、文件处理、数据分析处理、爬虫…

chatgpt赋能python:Python写模拟器脚本

Python写模拟器脚本 Python是一种强大的编程语言&#xff0c;适用于各种任务&#xff0c;包括模拟器编写。模拟器是一种软件程序&#xff0c;能够模拟硬件或软件系统的行为。这篇文章将介绍Python编写模拟器脚本时需要关注的一些关键点。 为什么选择Python编写模拟器脚本 Py…

Vue+springboot个人博客网站系统的设计与实现3virm

本课题采用Java Web技术来设计开发一个可以发表文章、浏览文章的博客系统。课题主要包括前台博客系统以及后台管理系统&#xff1a;前台博客系统应该具备浏览文章&#xff08;能够实现分类查找、关键字查找、首页推荐等&#xff09;、评论文章&#xff08;用户能够对自己喜爱的…

chatgpt赋能python:Python的几次幂

Python的几次幂 Python是一种适用于多种任务的高级编程语言&#xff0c;可以用于网站开发&#xff0c;数据分析&#xff0c;机器学习以及人工智能等。其优越的设计和灵活的语法使其成为程序员众所周知和喜爱的语言。其中&#xff0c;Python中的乘方运算是其中一个非常常用的算…

OA系统开发设计

项目介绍 基于开源流程引擎camunda开发的办公自动化系统。采用前后端分离架构&#xff0c;基于可视化的表单建模、流程建模工具&#xff0c;零代码快速构建业务OA应用。 项目演示 演示地址请私信作者。 技术栈 后端&#xff1a;SpringBootJWTShiromybatis-plus 流程引擎&a…

mysql多级分类设计

简介 在数据库设计中&#xff0c;经常会遇到需要存储多级分类信息的情况&#xff0c;如商品分类、地区分类等。本文将详细介绍如何在MySQL中设计和管理多级分类数据 解决方案 一. 层级字段&#xff08;Hierarchy Field&#xff09;方法 层级字段方法是最常见和简单的多级分…