HTML5 拖拽 & fabric 插件
### 拖拽
//html
<div ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<img id="id" draggable="true" ondragstart="drag(event)" src="1.jpg">
//js
function allowDrop(ev)
{
//调用 preventDefault() 来避免浏览器对数据的默认处理
(drop 事件的默认行为是以链接形式打开)
ev.preventDefault();
}
function drag(ev)
{
//img 对象的ID属性
ev.dataTransfer.setData("Text",ev.target.id);
}
//放
function drop(ev) {
var id = ev.dataTransfer.getData("Text");
ev.preventDefault();
}
### fabric
> 导入JS,地址 https://github.com/kangax/fabric.js
官方资料:http://fabricjs.com/
创建canvas, `<canvas id="C" ></canvas>`
获取:` var canvas = new fabric.Canvas('C');`
* 添加背景:
fabric.Image.fromURL('bg_03.png', function(img) {
canvas.backgroundImage = img;
canvas.backgroundImage.width = 600;
canvas.backgroundImage.height = 600;
canvas.add(img).renderAll();
});
* 添加图片,不能跨域
fabric.Image.fromURL('10db473f-8cc3-4c61-b6b0-cea3eabafed8.jpg',function (img){
img.scale(0.3);//缩放比例
var top = clientY - (img.currentHeight/2); //设置位置
var left = clientX - (img.currentWidth/2);
img.set({top:top, left:left,borderColor: 'gray', cornerColor: '#000',});
/*img.filters.push(
new fabric.Image.filters.RemoveWhite({threshold: 60, distance: 60})
);
img.applyFilters(canvas.renderAll.bind(canvas));*/
//添加到画布
canvas.add(img);
//设置为当前选中
canvas.setActiveObject(img);
})
// 绘制在画布上
canvas..renderAll();
* 去白底过滤器
//获取当前选中对象,
var act_obj = canvas.getActiveObject();
//设置里面的filters属性
act_obj.filters.push(
new fabric.Image.filters.RemoveWhite({threshold: 60, distance: 60})
);
$("#remove-white").click(function (){
applyFilter(1, this.checked && new fabric.Image.filters.RemoveWhite({
threshold: 60,
distance: 60
}));
})
* 点击canvas对象事件
canvas.on({
//选中
'object:selected': function() {
},
//失去焦点
'selection:cleared': function() {
}
});
* 添加过滤器,并将图像对象绑定到画布
function applyFilter(index, filter) {
var obj = canvas.getActiveObject();
obj.filters[index] = filter;
obj.applyFilters(canvas.renderAll.bind(canvas));
}
* 删除
ca = canvas.getActiveObject();
canvas.remove(ca);
canvas.renderAll();
* 裁剪
//获取当前选中对象
var act_obj = canvas.getActiveObject();
//定位信息
var act_width = act_obj.currentWidth;
var act_height = act_obj.currentHeight;
var act_left = act_obj.left;
var act_top = act_obj.top;
var cur_img = act_obj._element.currentSrc;
var image_name = act_obj._element.currentSrc;
//加入到裁剪框
$(".img_box_clip_div").html('');
var html = '<img id="cropTestImg" width="'+ act_width +'" height="'+act_height+'" src="'+ image_name + '" />';
$(".img_box_clip_div").append(html);
//调用裁剪功能
var oImg = document.getElementById("cropTestImg");
var oEndBtn = document.getElementById("cropEndBtn");
fnImageCropRot(oImg);
//复制一份
var copy_obj = fabric.util.object.clone(act_obj);
//等比例放置
copy_obj.scale(1).set({
left: act_left,
top: act_top,
width:act_width,
height:act_height,
//裁剪,原位置在中心,要定位在左上
clipTo: function (ctx) {
ctx.rect(-(act_width/2)+parseInt(x),-(act_height/2)+parseInt(y),w,h);
}
});
* 图片导出及发布
原理:通过toDataURL获取到地址,模拟一个链接并点击
//这段要通过点击事件获取,start
//获取canvas元素
var canvasElement = document.getElementById(id);
//图片类型
var MIME_TYPE = "image/png";
//转换成base64
var imgURL = canvasElement.toDataURL(MIME_TYPE);
//end
//创建一个a链接,模拟点击下载
var dlLink = document.createElement('a');
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);
//发布将解码出来的Url传到接口里
### 拖拽
//html
<div ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<img id="id" draggable="true" ondragstart="drag(event)" src="1.jpg">
//js
function allowDrop(ev)
{
//调用 preventDefault() 来避免浏览器对数据的默认处理
(drop 事件的默认行为是以链接形式打开)
ev.preventDefault();
}
function drag(ev)
{
//img 对象的ID属性
ev.dataTransfer.setData("Text",ev.target.id);
}
//放
function drop(ev) {
var id = ev.dataTransfer.getData("Text");
ev.preventDefault();
}
### fabric
> 导入JS,地址 https://github.com/kangax/fabric.js
官方资料:http://fabricjs.com/
创建canvas, `<canvas id="C" ></canvas>`
获取:` var canvas = new fabric.Canvas('C');`
* 添加背景:
fabric.Image.fromURL('bg_03.png', function(img) {
canvas.backgroundImage = img;
canvas.backgroundImage.width = 600;
canvas.backgroundImage.height = 600;
canvas.add(img).renderAll();
});
* 添加图片,不能跨域
fabric.Image.fromURL('10db473f-8cc3-4c61-b6b0-cea3eabafed8.jpg',function (img){
img.scale(0.3);//缩放比例
var top = clientY - (img.currentHeight/2); //设置位置
var left = clientX - (img.currentWidth/2);
img.set({top:top, left:left,borderColor: 'gray', cornerColor: '#000',});
/*img.filters.push(
new fabric.Image.filters.RemoveWhite({threshold: 60, distance: 60})
);
img.applyFilters(canvas.renderAll.bind(canvas));*/
//添加到画布
canvas.add(img);
//设置为当前选中
canvas.setActiveObject(img);
})
// 绘制在画布上
canvas..renderAll();
* 去白底过滤器
//获取当前选中对象,
var act_obj = canvas.getActiveObject();
//设置里面的filters属性
act_obj.filters.push(
new fabric.Image.filters.RemoveWhite({threshold: 60, distance: 60})
);
$("#remove-white").click(function (){
applyFilter(1, this.checked && new fabric.Image.filters.RemoveWhite({
threshold: 60,
distance: 60
}));
})
* 点击canvas对象事件
canvas.on({
//选中
'object:selected': function() {
},
//失去焦点
'selection:cleared': function() {
}
});
* 添加过滤器,并将图像对象绑定到画布
function applyFilter(index, filter) {
var obj = canvas.getActiveObject();
obj.filters[index] = filter;
obj.applyFilters(canvas.renderAll.bind(canvas));
}
* 删除
ca = canvas.getActiveObject();
canvas.remove(ca);
canvas.renderAll();
* 裁剪
//获取当前选中对象
var act_obj = canvas.getActiveObject();
//定位信息
var act_width = act_obj.currentWidth;
var act_height = act_obj.currentHeight;
var act_left = act_obj.left;
var act_top = act_obj.top;
var cur_img = act_obj._element.currentSrc;
var image_name = act_obj._element.currentSrc;
//加入到裁剪框
$(".img_box_clip_div").html('');
var html = '<img id="cropTestImg" width="'+ act_width +'" height="'+act_height+'" src="'+ image_name + '" />';
$(".img_box_clip_div").append(html);
//调用裁剪功能
var oImg = document.getElementById("cropTestImg");
var oEndBtn = document.getElementById("cropEndBtn");
fnImageCropRot(oImg);
//复制一份
var copy_obj = fabric.util.object.clone(act_obj);
//等比例放置
copy_obj.scale(1).set({
left: act_left,
top: act_top,
width:act_width,
height:act_height,
//裁剪,原位置在中心,要定位在左上
clipTo: function (ctx) {
ctx.rect(-(act_width/2)+parseInt(x),-(act_height/2)+parseInt(y),w,h);
}
});
* 图片导出及发布
原理:通过toDataURL获取到地址,模拟一个链接并点击
//这段要通过点击事件获取,start
//获取canvas元素
var canvasElement = document.getElementById(id);
//图片类型
var MIME_TYPE = "image/png";
//转换成base64
var imgURL = canvasElement.toDataURL(MIME_TYPE);
//end
//创建一个a链接,模拟点击下载
var dlLink = document.createElement('a');
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);
//发布将解码出来的Url传到接口里
HTML5 拖拽 & fabric 插件的更多相关文章
- Html5拖拽复制
拖拽是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖拽是标准的一部分,任何元素都能够拖拽. Html5拖拽非常常见的一个功能,但是大部分拖拽的案例都是一个剪切的过程, 项目中需 ...
- html5拖拽
html5拖拽一 <!DOCTYPE html> <html> <head lang="en"> <meta charset=" ...
- HTML5 拖拽复制功能的实现方法
Internet Explorer 9FirefoxOpera 12ChromeSafari 5 v1.0代码部分 <!DOCTYPE html><html><head& ...
- 11个好用的jQuery拖拽拖放插件
这次我们整理一些拖拽播放类型的jQuery插件,这些可能不是很常用,但偶尔会有网站设计项目用到,特别是后台相关的开发项目,这个拖放排序功能一般都会有,所以适合大家收藏起来,方便日后使用.接下来一起看盾 ...
- 每天一个JavaScript实例-html5拖拽
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- HTML5拖拽功能中 dataTransfer对象详解
有了HTML5,老板再也不用担心我们的上传了,再加上有拖拽上传是不是很酷.百度一下,有关HTML5拖拽上传的文章和实例不少,都缺不了一个至关重要的东东DataTransfer.但是详细介绍的不多,尤其 ...
- 基于html5拖拽api实现列表的拖拽排序
基于html5拖拽api实现列表的拖拽排序 html代码: <ul ondrop="drop_handler(event);" ondragover="dragov ...
- HTML5 拖拽实现
简介: 最早在网页中引入JavaScript拖放功能是IE4.当时,网页中只有两种对象可以拖放:图像和某些文本.拖放图像时,把鼠标放到图像上,按住鼠标不放就可以拖放它.拖放文本时,要先选中文本,然后可 ...
- html5拖拽事件 xhr2 实现文件上传 含进度条
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
随机推荐
- Using Apache2 with JBoss AS7 on Ubuntu
大体思路同<Using Apache Web Server with Jboss AS 7>一致,但在Ubuntu上的操作与之前有些区别. 这里仍然演示mod_proxy的配置. 首先加载 ...
- MySQL生僻字(不常用字)的完整解决方案
查看 MySQL 数据库服务器和数据库字符集 show variables like '%char%'; 查看 MySQL 数据表(table) 的字符集 show table status from ...
- content
http://www.cnblogs.com/lrysjtu/p/4474900.html lexus - 博客园 http://www.cnblogs.com/rio2607/p/4472456.h ...
- Java Bean 获取properties文件的读取
实际的开发过程中,将一些配置属性从java代码中提取到properties文件中是个很好的选择,降低了代码的耦合度.下面介绍两种通过spring读取properties文件的方法,以ip地址配置为例. ...
- first blog编程之美-----计算1的个数
根据以下总结写出以下程序,总结来源于网上 感想:得硬着头皮找规律 #include int count1(int n) { int i=1; int count=0 ...
- intellij安装 配置 创建项目
使用intellij创建项目的整个过程如下: 首先,点击intllij的.exe文件,如果是第一次安装,选择第二个选项即可 Intellij需要license key,可以使用注册机生成相应的name ...
- winform datagridview如何获取索引 分类: DataGridView 2014-04-11 13:42 216人阅读 评论(0) 收藏
datagridview.CurrentCell.RowIndex; 是当前活动的单元格的行的索引 datagridview.SelectedRows ; ...
- 【Android - V】之Toolbar的使用
Toolbar是Android V7包中的一个控件,用来代替Action Bar作为界面的头部标题栏布局.Toolbar相对于Action Bar的特点是更加灵活,可以显示在任何位置. 首先先来看To ...
- PDO方法连接数据库(怕忘记,记起来)
PDO方法连接数据库更加安全! [完整代码,只需要添上对应的数据库即可以运行] <?php include "init.inc.php"; //--------------- ...
- 织梦CMS后台卡死的解决办法
[复制来于网上]原文地址:http://www.sjyhome.com/dedecms-6.html 改过一次第二次忘记怎么改,还是转一下,下次忘记了翻翻文章就可以知道了.好记忆不如烂笔头 一.原因分 ...