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 ...
随机推荐
- jmeter3.1 压测
压测目标:error 为0,线程起到250,服务器配置达到最大 一.Jmeter3.1 压测 JMeter3.1提供一个用于生成HTML页面格式图形化报告的扩展模块.该模块支持通过两种方式生成多维度图 ...
- RF学习使用记录【4】
四 Extending Robot Framework 4.1 Creating test libraries RF的测试能力由测试库支持决定,已经有许多的测试库,有一些随着RF框架安装,但是更多的需 ...
- linux文件的特殊权限及隐藏权限
基础知识 相信大家应该都知道linux的文件基本权限,使用ls -l命令可以显示文件的基本权限,"-rwxrwxrwx.",第一位表示文件的属性(是文件- ,目录d等),后面每隔 ...
- 深入C++的运算符重载
对于简单的运算符,可以参考之前的博文.之后会有一篇关于从等号运算符重载的角度研究深浅拷贝的博文.这里是讲:逗号,取成员运算符,输入输出运算符,下标运算符,括号,new和delete的重载. 逗号运算符 ...
- Python 设置字体样式
# 1.先导入分别可指定单元格字体相关,颜色,和对齐方式的类 from openpyxl.styles import Font, colors, Alignment # 2.配置字体格式为:样式(Ti ...
- Java基础学习总结(39)——Log4j 1使用教程
1. 配置文件 Log4J配置文件的基本格式如下: #配置根Logger log4j.rootLogger = [ level ] , appenderName1 , appenderN ...
- elasticsearch 文档阅读笔记(三)
文档 elasticsearch是通过document的形式存储数据的,个人理解文档就是一条数据一个对象 我们添加索引文档中不仅包含了数据还包含了元数据 比如我们为一个数据添加索引 文档中不仅有jso ...
- find结合rm删除大量文件
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://navarro.blogbus.com/logs/31502374.html 例:删除/home/raven下,包括子目录 ...
- 洛谷——P1094 纪念品分组
https://www.luogu.org/problem/show?pid=1094#sub 题目描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得 的纪念品价 ...
- geos库交叉编译生成ARM平台库
版本号信息: GEOS:geos-3.4.2.tar.bz2(http://trac.osgeo.org/geos/) CPU:ARM 编译器:arm-linux 4.2.2 1. 解压源代码包ge ...