HTML5 canvas实现移动端上传头像拖拽裁剪效果


Posted in HTML / CSS onMarch 14, 2016

本示例使用HTML5 canvas,简单的编写了上传头像的裁剪效果,移动端支持拖拽后裁剪, 虽然样式不好看,但是功能还算全:

下图为裁剪后的效果:

HTML5 canvas实现移动端上传头像拖拽裁剪效果

html部分:

XML/HTML Code复制内容到剪贴板
  1. <!DOCTYPE html>  
  2. <html lang="en">  
  3. <head>  
  4.     <meta charset="UTF-8">  
  5.     <title>上传头像</title>  
  6.     <meta name="renderer" content="webkit">  
  7.     <meta name="viewport" content="width=device-width, initial-scale=1.0">  
  8. </head>  
  9. <body>  
  10. <div id="imgCrop" style="width:200px;height:200px;border:1px solid #ccc;overflow:hidden;">  
  11.     <img src="img/test.jpg" alt="">  
  12. </div>  
  13. <input type="file" accept="image/*" />  
  14. <button id="save">保存</button>  
  15. <p>下面为剪切的图片:</p>  
  16. <div id="imgShow"></div>  
  17. </body>  
  18. </html>  

JavaScript部分:

JavaScript Code复制内容到剪贴板
  1. var $imgCrop = $("#imgCrop");   
  2. var $img = $imgCrop.find("img");   
  3. var img = $img[0];   
  4. var width = parseInt($imgCrop.css("width"));   
  5. var height = parseInt($imgCrop.css("height"));   
  6. var startX,startY,scale = 1;   
  7. var x = 0,y = 0;   
  8. $("input").on("change",function(){   
  9.     var fr = new FileReader();   
  10.     var file = this.files[0]   
  11.     //console.log(file);   
  12.     if(!/image\/\w+/.test(file.type)){   
  13.         alert(file.name + "不是图片文件!");   
  14.         return;   
  15.     }   
  16.     console.log(file);   
  17.     $img.removeAttr("height width");   
  18.     fr.readAsDataURL(file);   
  19.   
  20.     fr.onload = function(){   
  21.         img.src = fr.result;   
  22.         var widthInit = img.width;   
  23.         if(img.width>img.height){   
  24.             img.height = height;   
  25.             x = (width - img.width)/2;   
  26.             y = 0;   
  27.         }else{   
  28.             img.width = width;   
  29.             x = 0;   
  30.             y = (height - img.height)/2;   
  31.         }   
  32.         scale = widthInit/img.width;   
  33.         move($img, x, y);   
  34.            
  35.     };   
  36.        
  37. });   
  38.   
  39. img.addEventListener("touchstart",function(e){     
  40.     startX = e.targetTouches[0].pageX;   
  41.     startY = e.targetTouches[0].pageY;   
  42.     
  43.     return;     
  44.   
  45. });    
  46. img.addEventListener("touchmove",function(e){     
  47.     e.preventDefault();     
  48.     e.stopPropagation();     
  49.   
  50.     var changeX = e.changedTouches[0].pageX - startX + x;   
  51.     var changeY = e.changedTouches[0].pageY - startY + y;   
  52.   
  53.     move($(this), changeX, changeY);   
  54.     return;     
  55.      
  56. });    
  57. img.addEventListener("touchend",function(e){      
  58.    var changeX = e.changedTouches[0].pageX - startX + x;   
  59.     var changeY = e.changedTouches[0].pageY - startY + y;   
  60.   
  61.     x = x + e.changedTouches[0].pageX - startX;   
  62.     y = y + e.changedTouches[0].pageY - startY;   
  63.   
  64.     move($(this), changeX, changeY);   
  65.     return;     
  66.      
  67. });     
  68. //确定目标图片的样式   
  69. function move(ele, x, y){   
  70.     ele.css({   
  71.         '-webkit-transform' : 'translate3d(' + x + 'px, ' + y + 'px, 0)',   
  72.         'transform' : 'translate3d(' + x + 'px, ' + y + 'px, 0)'  
  73.     });   
  74. }   
  75.   
  76. $("#save").on("click",function(){   
  77.     var url = imageData($img);   
  78.     console.log(url);   
  79.   
  80.     $("#imgShow").html("<img src="+url+" />");;   
  81. });   
  82. //裁剪图片   
  83. function imageData($img) {   
  84.         var canvas = document.createElement('canvas');   
  85.         var ctx = canvas.getContext('2d');   
  86.         canvas.width = width ;   
  87.         canvas.height = height;   
  88.         ctx.drawImage(img, -x*scale, -y*scale, width*scale, height*scale, 0, 0, width, height);   
  89.         return canvas.toDataURL();   
  90.     }   
  91.   

以上就是本文的全部内容,希望对大家的学习有所帮助。

原文:http://www.cnblogs.com/yifengBlog/p/5265598.html

HTML / CSS 相关文章推荐
CSS3 border-image详解、应用及jQuery插件
Aug 29 HTML / CSS
深入浅析css3 border-image边框图像详解
Nov 24 HTML / CSS
魔幻般冒泡背景的CSS3按钮动画
Feb 27 HTML / CSS
HTML5 MiranaVideo播放器 (代码开源)
Jun 11 HTML / CSS
HTML5实现锚点时请使用id取代name
Sep 06 HTML / CSS
利用html5的websocket实现websocket聊天室
Dec 12 HTML / CSS
HTML5有哪些新特征
Dec 01 HTML / CSS
整理HTML5移动端开发的常用触摸事件
Apr 15 HTML / CSS
h5调用摄像头的实现方法
Jun 01 HTML / CSS
HTML5 表单验证失败的提示语问题
Jul 13 HTML / CSS
html5通过postMessage进行跨域通信的方法
Dec 04 HTML / CSS
HTML+CSS实现导航条下拉菜单的示例代码
Aug 02 HTML / CSS
html5 canvas移动浏览器上实现图片压缩上传
Mar 11 #HTML / CSS
HTML5实现多张图片上传功能
Mar 11 #HTML / CSS
html5+css3进度条倒计时动画特效代码【推荐】
Mar 08 #HTML / CSS
多视角3D逼真HTML5水波动画
Mar 03 #HTML / CSS
HTML5的新特性(1)
Mar 03 #HTML / CSS
HTML5 Canvas实现烟花绽放特效
Mar 02 #HTML / CSS
多视角3D可旋转的HTML5 Logo动画
Mar 02 #HTML / CSS
You might like
业余方法DIY电子管FM收音机
2021/03/02 无线电
php+ajax实时输入自动搜索匹配的方法
2014/12/26 PHP
PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
2015/05/12 PHP
php多线程并发实现方法
2016/09/30 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
2016/10/31 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
php use和include区别总结
2019/10/13 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
推荐一些非常不错的javascript学习资源站点
2007/08/29 Javascript
JQueryiframe页面操作父页面中的元素与方法(实例讲解)
2013/11/19 Javascript
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
JavaScript操作Cookie详解
2015/02/28 Javascript
Javascript实现单例模式
2016/01/24 Javascript
js提交form表单,并传递参数的实现方法
2016/05/25 Javascript
Angular中$cacheFactory的作用和用法实例详解
2016/08/19 Javascript
用vue写一个仿简书的轮播图的示例代码
2018/03/13 Javascript
浅谈VUE-CLI脚手架热更新太慢的原因和解决方法
2018/09/28 Javascript
npm的lock机制解析
2019/06/20 Javascript
js 数组当前行添加数据方法详解
2020/07/28 Javascript
vue2和vue3的v-if与v-for优先级对比学习
2020/10/10 Javascript
[01:23:24]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第三场 2月7日
2021/03/11 DOTA
Python中利用原始套接字进行网络编程的示例
2015/05/04 Python
Python实现的简单hangman游戏实例
2015/06/28 Python
Django ManyToManyField 跨越中间表查询的方法
2018/12/18 Python
解决Python3 控制台输出InsecureRequestWarning问题
2019/07/15 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
2019/08/23 Python
利用CSS的Sass预处理器(框架)来制作居中效果
2016/03/10 HTML / CSS
SVG实现多彩圆环倒计时效果的示例代码
2017/11/21 HTML / CSS
英国百安居装饰建材网上超市:B&Q
2016/09/13 全球购物
万豪国际住宅与别墅集团:Homes & Villas by Marriott International
2020/10/08 全球购物
WebSphere面试题:在WebSphere里面如何部署一个应用
2015/08/02 面试题
优秀党员主要事迹
2014/01/19 职场文书
2015驻村干部工作总结
2015/04/07 职场文书
工作年限证明范本
2015/06/15 职场文书
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
2021/06/18 MySQL
mysql数据库隔离级别详解
2022/06/16 MySQL