用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 翻转,复制粘贴,隐藏, 删除,历史记录,撤销, 剪切, 图层,组合打散,锁定等功能的更多相关文章

  1. js实现复制粘贴功能

    在项目中使用到复制粘贴功能,虽然网上有很多大牛封装了很多的插件,但是还是想不去使用插件,就像自己来实现这个功能. 另一篇是禁止复制粘贴 前端er怎样操作剪切复制以及禁止复制+破解等 初步想法: 1. ...

  2. js 实现复制粘贴

    js 实现复制粘贴 <!DOCTYPE html> <html><head> <meta http-equiv="Content-Type" ...

  3. 通过如何通过js实现复制粘贴功能

    在ie中window.clipboardData(剪切板对象)是可以被获取,所以利用这个方法我们可以实现在IE当中复制粘贴的功能,demo如下! <html> <head> & ...

  4. vi--文本编辑常用快捷键之复制-粘贴-替换-删除

    这几天刚开始接触vi编辑器,慢慢开始熟悉vi,但是还是感觉诸多不便,比如说复制粘贴删除操作不能用鼠标总是感觉不自在,而且我一般习惯用方向键移动光标,更增加了操作的复杂度,今天在网上搜索了一下,vim编 ...

  5. js 实现复制粘贴文本过滤(保留文字和图片)

    实现复制粘贴文本过滤(保留文字和图片) demo如下: <head> <meta http-equiv="Content-Type" content=" ...

  6. JS ----实现复制粘贴功能 (剪切板应用clipboardData)

    注意:ie7,与ie8 对网页有个复制的权限,需在“安全”中的“自定义级别”的脚本中设置 clipboardData 对象 提供了对剪贴板的访问. 三个方法 :1.clearData(sDataFor ...

  7. 在html页面通过js实现复制粘贴功能

    前言:要实现这个功能,常用的方式大概分为两类,第一种就是上插件,这个网上有大把,第二种就是直接用几行JS来实现. 这次说第二种实现方式,这方式有很大的局限性,只能用表单元素,并且不能设置disable ...

  8. js实现复制粘贴

    项目中经常会遇到点击按钮复制订单号.订单id等内容到粘贴板中的需求.可是通常我们都是用Ctrl + c或右击复制的,别操心,js也是有复制命令的,那就是document.execCommand('co ...

  9. vim 学习日志(1):剪切,复制,粘贴,删除,撤销

    一:光标命令     左h 上j 下k 右l :goto n 表示跳转到文本的第n个字符 :n 表示跳到第n行 nG n为行数,该命令立即使光标跳到指定行:n为空,光标跳到文件最后一行. Ctrl+G ...

随机推荐

  1. 获取url

    首先要知道Location这个对象以及这个对象中的一些属性: href:设置或返回完整的url.如本博客首页返回http://www.cnblogs.com/wymninja/ host:设置或返回主 ...

  2. P1125 笨小猴

    P1125 笨小猴 标签:NOIp提高组 2008 云端 难度:普及- 时空限制:1s / 128MB 题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证 ...

  3. UDP、线程、mutex锁(day15)

    一.基于UDP的网络编程模型 服务器端 .创建socket. .将fd和服务器的ip地址和端口号绑定 .recvfrom阻塞等待接收客户端数据 .业务处理 .响应客户端 客户端: .创建socket ...

  4. CSS学习笔记之选择器

    目录 1.元素选择器 2.继承 3.选择器分组 4.声明分组 5.后代选择器 6.子元素选择器 7.相邻兄弟选择器 8.类选择器 9.ID 选择器 10.属性选择器 11.伪类 12.伪元素 1.元素 ...

  5. ecshop中{$lang.}标签的修改

    {$lang.}之类的文字都是在语言包里边定义的,所以要修改这些文字的话,我们只需要修改语言包里的文件.首先需要看一下你使用的语言是哪种,如果是中文的话,修改  languages/zh_cn/com ...

  6. Problem 48

    Problem 48 The series, 11 + 22 + 33 + ... + 1010 = 10405071317. Find the last ten digits of the seri ...

  7. Java设计模式之 — 策略(Strategy)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8986285 今天你的leader兴致冲冲地找到你,希望你可以帮他一个小忙,他现在急 ...

  8. 域名和ip、端口的关系

    背景:新建一个项目,属于RPC服务,调用时需要ip+端口. 在工单系统里走流程,强制填写域名.之前也操作过,感觉域名不重要.我本来需要填写ip+端口,你给整个域名,那我端口往哪写?(一直以为域名=ip ...

  9. hdu 4704 Sum (整数和分解+高速幂+费马小定理降幂)

    题意: 给n(1<n<),求(s1+s2+s3+...+sn)mod(1e9+7). 当中si表示n由i个数相加而成的种数,如n=4,则s1=1,s2=3.                 ...

  10. C++管理指针成员

    1.C++中一般採用以下三种方法之中的一个管理指针成员: (1)指针成员採取常规行为. 这种类具有指针的全部缺陷:具有指针成员且使用默认复制构造函数和赋值操作符,无法避免悬垂指针(两个对象的指针成员指 ...