fabric.js 翻转,复制粘贴,隐藏, 删除,历史记录,撤销, 剪切, 图层,组合打散,锁定等功能
用vue写的 显示,隐藏
hide(){
this.canvas.getActiveObject().set('opacity', 0).setCoords();
this.canvas.requestRenderAll()
},
display(){
this.canvas.getActiveObject().set('opacity', 1).setCoords();
this.canvas.requestRenderAll()
}, 翻转 水平 垂直用scaleY
flip(){
this.canvas.getActiveObject().set('scaleX', -1).setCoords();
this.canvas.requestRenderAll();
}, 克隆(复制粘贴) paste(_clipboard){
// clone again, so you can do multiple copies.
let canvas = this.canvas;
_clipboard.clone(function(clonedObj) {
canvas.discardActiveObject();
clonedObj.set({
left: clonedObj.left + 20,
top: clonedObj.top + 20,
evented: true,
});
if (clonedObj.type === 'activeSelection') {
// active selection needs a reference to the canvas.
clonedObj.canvas = canvas;
clonedObj.forEachObject(function(obj) {
canvas.add(obj);
});
// this should solve the unselectability
clonedObj.setCoords();
} else {
canvas.add(clonedObj);
}
_clipboard.top += 20;
_clipboard.left += 20;
canvas.setActiveObject(clonedObj);
// canvas.requestRenderAll();
});
},
copy(){
let canvas = this.canvas;
var _self = this;
canvas.getActiveObject().clone(function(cloned){
// let _clipboard = cloned;
_self.paste(cloned); })
}, 历史记录,回退撤销 data 初始化
config : {
canvasState : [],
currentStateIndex : -1,
redoStatus : false, //撤销状态
undoStatus : false, // 重做状态
undoFinishedStatus : 1,
redoFinishedStatus : 1,
undoButton : this.$refs.undo, //得不到 在 mounted 得到
redoButton : this.$refs.redo,
} 记录事件
canvasDataChange(){
let _self = this;
this.canvas.on('object:modified', function(){
_self.updateCanvasState();
});
this.canvas.on('object:added', function(){
_self.updateCanvasState()
});
this.canvas.on('object:removed', function(){
_self.updateCanvasState()
});
this.canvas.on('object:rotating', function(){
_self.updateCanvasState()
});
}, undo() {
let _self =this;
if(this.config.undoFinishedStatus){
if(this.config.currentStateIndex == -1){
this.config.undoStatus = false;
}
else{
if (this.config.canvasState.length >= 1) {
this.config.undoFinishedStatus = 0;
if(this.config.currentStateIndex != 0){
this.config.undoStatus = true;
this.canvas.loadFromJSON(this.config.canvasState[this.config.currentStateIndex-1],function(){
var jsonData = JSON.parse(_self.config.canvasState[_self.config.currentStateIndex-1]);
_self.canvas.renderAll();
_self.config.undoStatus = false;
_self.config.currentStateIndex -= 1;
// _self.config.undoButton.removeAttribute("disabled");
// _self.config.undoButton.disabled = false;
if(_self.config.currentStateIndex !== _self.config.canvasState.length-1){
// _self.config.redoButton.removeAttribute('disabled');
// _self.config.redoButton.disabled = false;
}
_self.config.undoFinishedStatus = 1;
});
}
else if(_self.config.currentStateIndex == 0){
_self.canvas.clear();
_self.config.undoFinishedStatus = 1;
// _self.config.undoButton.disabled= "disabled";
// _self.config.redoButton.removeAttribute('disabled');
// _self.config.redoButton.disabled = false;
_self.config.currentStateIndex -= 1;
}
}
}
}
},
redo() {
let _self = this;
if(this.config.redoFinishedStatus){
if((this.config.currentStateIndex == this.config.canvasState.length-1) && this.config.currentStateIndex != -1){
// this.config.redoButton.disabled= true;
}else{
if(this.config.canvasState.length > this.config.currentStateIndex && this.config.canvasState.length != 0){
this.config.redoFinishedStatus = 0;
this.config.redoStatus = true;
this.canvas.loadFromJSON(this.config.canvasState[this.config.currentStateIndex+1],function(){
var jsonData = JSON.parse(_self.config.canvasState[_self.config.currentStateIndex+1]);
_self.canvas.renderAll();
_self.config.redoStatus = false;
_self.config.currentStateIndex += 1;
if(_self.config.currentStateIndex != -1){
// _self.config.redoButton.disabled = false;
}
_self.config.redoFinishedStatus = 1;
if((_self.config.currentStateIndex == _self.config.canvasState.length-1) && _self.config.currentStateIndex != -1){
// _self.config.redoButton.disabled= true;
}
});
}
}
}
}, 删除
del() {
var el = this.canvas.getActiveObject();
this.canvas.remove(el);
}, 格式化 数据
toJson(){ console.log(JSON.stringify(this.canvas.toJSON()));
},
toSVG(){
// return this.canvas.toSVG()
console.log(this.canvas.toSVG());
}, canvas导出为图片并下载 canvasToImage(){
var MIME_TYPE = "image/png";
//转换成base64
var imgURL = this.canvas.toDataURL(MIME_TYPE);
//创建一个a链接,模拟点击下载
var dlLink = document.createElement('a');
var filename = '个人画板_' + (new Date()).getTime() + '.png';
dlLink.download = filename;
dlLink.href = imgURL;
dlLink.dataset.downloadurl = [MIME_TYPE, dlLink.download, dlLink.href].join(':');
document.body.appendChild(dlLink);
dlLink.click();
document.body.removeChild(dlLink);
}, 或者
downloadimage(event){
// 图片导出为 png 格式
var type = 'png';
// 返回一个包含JPG图片的<img>元素
var img_png_src = this.canvas.toDataURL("image/png"); //将画板保存为图片格式的函数
var imgData = img_png_src.replace(this._fixType(type),'image/octet-stream'); var filename = '个人画板_' + (new Date()).getTime() + '.' + type; this.saveFile(imgData,filename);
}, saveFile(data, filename){
var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
save_link.href = data;
save_link.download = filename;
var event = document.createEvent('MouseEvents');
event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
save_link.dispatchEvent(event);
}, _fixType(type) {
type = type.toLowerCase().replace(/jpg/i, 'jpeg');
var r = type.match(/png|jpeg|bmp|gif/)[0];
return 'image/' + r;
}, 组合 打散
group() {
this.fabricAction.fabricObjGroup(this);
},
ungroup() {
this.fabricAction.fabricObjUnGroup(this);
}, 锁定
lock() {
this.fabricAction.lockOption(this);
},
fabric.js 翻转,复制粘贴,隐藏, 删除,历史记录,撤销, 剪切, 图层,组合打散,锁定等功能的更多相关文章
- js实现复制粘贴功能
在项目中使用到复制粘贴功能,虽然网上有很多大牛封装了很多的插件,但是还是想不去使用插件,就像自己来实现这个功能. 另一篇是禁止复制粘贴 前端er怎样操作剪切复制以及禁止复制+破解等 初步想法: 1. ...
- js 实现复制粘贴
js 实现复制粘贴 <!DOCTYPE html> <html><head> <meta http-equiv="Content-Type" ...
- 通过如何通过js实现复制粘贴功能
在ie中window.clipboardData(剪切板对象)是可以被获取,所以利用这个方法我们可以实现在IE当中复制粘贴的功能,demo如下! <html> <head> & ...
- vi--文本编辑常用快捷键之复制-粘贴-替换-删除
这几天刚开始接触vi编辑器,慢慢开始熟悉vi,但是还是感觉诸多不便,比如说复制粘贴删除操作不能用鼠标总是感觉不自在,而且我一般习惯用方向键移动光标,更增加了操作的复杂度,今天在网上搜索了一下,vim编 ...
- js 实现复制粘贴文本过滤(保留文字和图片)
实现复制粘贴文本过滤(保留文字和图片) demo如下: <head> <meta http-equiv="Content-Type" content=" ...
- JS ----实现复制粘贴功能 (剪切板应用clipboardData)
注意:ie7,与ie8 对网页有个复制的权限,需在“安全”中的“自定义级别”的脚本中设置 clipboardData 对象 提供了对剪贴板的访问. 三个方法 :1.clearData(sDataFor ...
- 在html页面通过js实现复制粘贴功能
前言:要实现这个功能,常用的方式大概分为两类,第一种就是上插件,这个网上有大把,第二种就是直接用几行JS来实现. 这次说第二种实现方式,这方式有很大的局限性,只能用表单元素,并且不能设置disable ...
- js实现复制粘贴
项目中经常会遇到点击按钮复制订单号.订单id等内容到粘贴板中的需求.可是通常我们都是用Ctrl + c或右击复制的,别操心,js也是有复制命令的,那就是document.execCommand('co ...
- vim 学习日志(1):剪切,复制,粘贴,删除,撤销
一:光标命令 左h 上j 下k 右l :goto n 表示跳转到文本的第n个字符 :n 表示跳到第n行 nG n为行数,该命令立即使光标跳到指定行:n为空,光标跳到文件最后一行. Ctrl+G ...
随机推荐
- java线程启动原理分析
一.前言不知道哪位古人说:人生三大境界.第一境界是:看山是山看水是水:第二境界是看山不是山看水不是水:第三境界:看山还是山看水还是水.其实我想对于任何一门技术的学习都是这样.形而上下者为之器,形而上者 ...
- SSO 单点登录解决方案
转自:http://www.blogjava.net/Jack2007/archive/2014/03/11/191795.html 1 什么是单点登陆 单点登录(Single Sign O ...
- 39.exact value and full text
主要知识点 1.exact value 2.full text 在es中有两种搜索方式,exact value(精确匹配),full text(全文检索) 一.exact value 比如有一 ...
- python第十一周:RabbitMQ、Redis
Rabbit Mq消息队列 RabbitMQ能为你做些什么? 消息系统允许软件.应用相互连接和扩展.这些应用可以相互链接起来组成一个更大的应用,或者将用户设备和数据进行连接.消息系统通过将消息的发送和 ...
- 【*2000】【2018-2019 ICPC, NEERC, Southern Subregional Contest C 】Cloud Computing
[链接] 我是链接,点我呀:) [题意] [题解] 我们可以很容易知道区间的每个位置有哪些安排可以用. 显然 我们优先用那些花费的钱比较少的租用cpu方案. 但一个方案可供租用的cpu有限. 我们可以 ...
- redis-linux上安装redis
单机版本 因为redis是c++写的,我们首先需要安装c++环境 1.在linux安装c++源码编译器 需要联网 linux输入yum -y install gcc gcc-c++ 2.官网下载red ...
- 小记——Grub Rescue恢复
下面我要讲的是一个悲伤的故事 引子 电脑状况简介:两块硬盘(1HHD.1SSD),SSD上装了LINUX(40G)+WIN10(50G)的双系统,SSD剩余部分在WIN下使用装程序,HHD做仓库.LI ...
- ubuntu-kill命令-杀死进程
显示进程pid ps -A 杀进程的命令 kill -s 9 xxx(进程pid)
- Ext.TabPanel中的items具体解释
Ext.TabPanel中的items: (来自项目源代码中的items条目代码) items:{ id:"opt1", title:"默认页面", tabTi ...
- 从编程的角度理解gradle脚本﹘﹘Android Studio脚本构建和编程[魅族Degao]
本篇文章由嵌入式企鹅圈原创团队.魅族资深project师degao撰写. 随着Android 开发环境从Eclipse转向Android Studio,我们每一个人都開始或多或少要接触gradle脚本 ...