vue移动端裁剪图片结合插件Cropper的使用实例代码


Posted in Javascript onJuly 10, 2017

之前写了一个上传头像的功能模块,以下的内容是描述上传头像过程中裁剪图片插件结合vue的一个使用。

当然,使用就安装 npm install cropperjs

接着再引入 import Cropper from 'cropperjs'

下面是源码

<template> 
 <div id="demo"> 
 <!-- 遮罩层 --> 
 <div class="container" v-show="panel"> 
  <div> 
  <img id="image" :src="url" alt="Picture"> 
  </div> 
 
  <button type="button" id="button" @click="crop">确定</button> 
   
 </div> 
 
 <div style="padding:20px;"> 
  <div class="show"> 
   <div class="picture" :style="'backgroundImage:url('+headerImage+')'"> 
   </div> 
  </div> 
  <div style="margin-top:20px;"> 
   <input type="file" id="change" accept="image" @change="change"> 
   <label for="change"></label> 
  </div> 
   
 </div> 
 </div> 
</template> 
 
<script> 
import Cropper from 'cropperjs' 
export default { 
 components: { 
  
 }, 
 data () { 
 return { 
  headerImage:'', 
  picValue:'', 
  cropper:'', 
  croppable:false, 
  panel:false, 
  url:'' 
 } 
 }, 
 mounted () { 
 //初始化这个裁剪框 
 var self = this; 
 var image = document.getElementById('image'); 
 this.cropper = new Cropper(image, { 
  aspectRatio: 1, 
  viewMode: 1, 
  background:false, 
  zoomable:false, 
  ready: function () { 
  self.croppable = true; 
  } 
 }); 
 }, 
 methods: { 
 getObjectURL (file) { 
  var url = null ; 
  if (window.createObjectURL!=undefined) { // basic 
  url = window.createObjectURL(file) ; 
  } else if (window.URL!=undefined) { // mozilla(firefox) 
  url = window.URL.createObjectURL(file) ; 
  } else if (window.webkitURL!=undefined) { // webkit or chrome 
  url = window.webkitURL.createObjectURL(file) ; 
  } 
  return url ; 
 }, 
 change (e) { 
  let files = e.target.files || e.dataTransfer.files; 
  if (!files.length) return; 
  this.panel = true; 
  this.picValue = files[0]; 
  
  this.url = this.getObjectURL(this.picValue); 
  //每次替换图片要重新得到新的url 
  if(this.cropper){ 
  this.cropper.replace(this.url); 
  } 
  this.panel = true; 
 
 }, 
 crop () { 
  this.panel = false; 
  var croppedCanvas; 
  var roundedCanvas; 
 
  if (!this.croppable) { 
   return; 
  } 
  // Crop 
  croppedCanvas = this.cropper.getCroppedCanvas(); 
  console.log(this.cropper) 
  // Round 
  roundedCanvas = this.getRoundedCanvas(croppedCanvas); 
 
  this.headerImage = roundedCanvas.toDataURL(); 
  this.postImg() 
   
 }, 
 getRoundedCanvas (sourceCanvas) { 
  
  var canvas = document.createElement('canvas'); 
  var context = canvas.getContext('2d'); 
  var width = sourceCanvas.width; 
  var height = sourceCanvas.height; 
  
  canvas.width = width; 
  canvas.height = height; 
 
  context.imageSmoothingEnabled = true; 
  context.drawImage(sourceCanvas, 0, 0, width, height); 
  context.globalCompositeOperation = 'destination-in'; 
  context.beginPath(); 
  context.arc(width / 2, height / 2, Math.min(width, height) / 2, 0, 2 * Math.PI, true); 
  context.fill(); 
 
  return canvas; 
 }, 
 postImg () { 
  //这边写图片的上传 
 } 
 } 
} 
</script> 
 
<style> 
*{ 
 margin: 0; 
 padding: 0; 
} 
#demo #button { 
 position: absolute; 
 right: 10px; 
 top: 10px; 
 width: 80px; 
 height: 40px; 
 border:none; 
 border-radius: 5px; 
 background:white; 
} 
#demo .show { 
 width: 100px; 
 height: 100px; 
 overflow: hidden; 
 position: relative; 
 border-radius: 50%; 
 border: 1px solid #d5d5d5; 
} 
#demo .picture { 
 width: 100%; 
 height: 100%; 
 overflow: hidden; 
 background-position: center center; 
 background-repeat: no-repeat; 
 background-size: cover; 
} 
#demo .container { 
 z-index: 99; 
 position: fixed; 
 padding-top: 60px; 
 left: 0; 
 top: 0; 
 right: 0; 
 bottom: 0; 
 background:rgba(0,0,0,1); 
} 
 
#demo #image { 
 max-width: 100%; 
} 
 
.cropper-view-box,.cropper-face { 
 border-radius: 50%; 
} 
/*! 
 * Cropper.js v1.0.0-rc 
 * https://github.com/fengyuanchen/cropperjs 
 * 
 * Copyright (c) 2017 Fengyuan Chen 
 * Released under the MIT license 
 * 
 * Date: 2017-03-25T12:02:21.062Z 
 */ 
 
.cropper-container { 
 font-size: 0; 
 line-height: 0; 
 
 position: relative; 
 
 -webkit-user-select: none; 
 
  -moz-user-select: none; 
 
  -ms-user-select: none; 
 
   user-select: none; 
 
 direction: ltr; 
 -ms-touch-action: none; 
  touch-action: none 
} 
 
.cropper-container img { 
 /* Avoid margin top issue (Occur only when margin-top <= -height) */ 
 display: block; 
 min-width: 0 !important; 
 max-width: none !important; 
 min-height: 0 !important; 
 max-height: none !important; 
 width: 100%; 
 height: 100%; 
 image-orientation: 0deg 
} 
 
.cropper-wrap-box, 
.cropper-canvas, 
.cropper-drag-box, 
.cropper-crop-box, 
.cropper-modal { 
 position: absolute; 
 top: 0; 
 right: 0; 
 bottom: 0; 
 left: 0; 
} 
 
.cropper-wrap-box { 
 overflow: hidden; 
} 
 
.cropper-drag-box { 
 opacity: 0; 
 background-color: #fff; 
} 
 
.cropper-modal { 
 opacity: .5; 
 background-color: #000; 
} 
 
.cropper-view-box { 
 display: block; 
 overflow: hidden; 
 
 width: 100%; 
 height: 100%; 
 
 outline: 1px solid #39f; 
 outline-color: rgba(51, 153, 255, 0.75); 
} 
 
.cropper-dashed { 
 position: absolute; 
 
 display: block; 
 
 opacity: .5; 
 border: 0 dashed #eee 
} 
 
.cropper-dashed.dashed-h { 
 top: 33.33333%; 
 left: 0; 
 width: 100%; 
 height: 33.33333%; 
 border-top-width: 1px; 
 border-bottom-width: 1px 
} 
 
.cropper-dashed.dashed-v { 
 top: 0; 
 left: 33.33333%; 
 width: 33.33333%; 
 height: 100%; 
 border-right-width: 1px; 
 border-left-width: 1px 
} 
 
.cropper-center { 
 position: absolute; 
 top: 50%; 
 left: 50%; 
 
 display: block; 
 
 width: 0; 
 height: 0; 
 
 opacity: .75 
} 
 
.cropper-center:before, 
 .cropper-center:after { 
 position: absolute; 
 display: block; 
 content: ' '; 
 background-color: #eee 
} 
 
.cropper-center:before { 
 top: 0; 
 left: -3px; 
 width: 7px; 
 height: 1px 
} 
 
.cropper-center:after { 
 top: -3px; 
 left: 0; 
 width: 1px; 
 height: 7px 
} 
 
.cropper-face, 
.cropper-line, 
.cropper-point { 
 position: absolute; 
 
 display: block; 
 
 width: 100%; 
 height: 100%; 
 
 opacity: .1; 
} 
 
.cropper-face { 
 top: 0; 
 left: 0; 
 
 background-color: #fff; 
} 
 
.cropper-line { 
 background-color: #39f 
} 
 
.cropper-line.line-e { 
 top: 0; 
 right: -3px; 
 width: 5px; 
 cursor: e-resize 
} 
 
.cropper-line.line-n { 
 top: -3px; 
 left: 0; 
 height: 5px; 
 cursor: n-resize 
} 
 
.cropper-line.line-w { 
 top: 0; 
 left: -3px; 
 width: 5px; 
 cursor: w-resize 
} 
 
.cropper-line.line-s { 
 bottom: -3px; 
 left: 0; 
 height: 5px; 
 cursor: s-resize 
} 
 
.cropper-point { 
 width: 5px; 
 height: 5px; 
 
 opacity: .75; 
 background-color: #39f 
} 
 
.cropper-point.point-e { 
 top: 50%; 
 right: -3px; 
 margin-top: -3px; 
 cursor: e-resize 
} 
 
.cropper-point.point-n { 
 top: -3px; 
 left: 50%; 
 margin-left: -3px; 
 cursor: n-resize 
} 
 
.cropper-point.point-w { 
 top: 50%; 
 left: -3px; 
 margin-top: -3px; 
 cursor: w-resize 
} 
 
.cropper-point.point-s { 
 bottom: -3px; 
 left: 50%; 
 margin-left: -3px; 
 cursor: s-resize 
} 
 
.cropper-point.point-ne { 
 top: -3px; 
 right: -3px; 
 cursor: ne-resize 
} 
 
.cropper-point.point-nw { 
 top: -3px; 
 left: -3px; 
 cursor: nw-resize 
} 
 
.cropper-point.point-sw { 
 bottom: -3px; 
 left: -3px; 
 cursor: sw-resize 
} 
 
.cropper-point.point-se { 
 right: -3px; 
 bottom: -3px; 
 width: 20px; 
 height: 20px; 
 cursor: se-resize; 
 opacity: 1 
} 
 
@media (min-width: 768px) { 
 
 .cropper-point.point-se { 
 width: 15px; 
 height: 15px 
 } 
} 
 
@media (min-width: 992px) { 
 
 .cropper-point.point-se { 
 width: 10px; 
 height: 10px 
 } 
} 
 
@media (min-width: 1200px) { 
 
 .cropper-point.point-se { 
 width: 5px; 
 height: 5px; 
 opacity: .75 
 } 
} 
 
.cropper-point.point-se:before { 
 position: absolute; 
 right: -50%; 
 bottom: -50%; 
 display: block; 
 width: 200%; 
 height: 200%; 
 content: ' '; 
 opacity: 0; 
 background-color: #39f 
} 
 
.cropper-invisible { 
 opacity: 0; 
} 
 
.cropper-bg { 
 background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC'); 
} 
 
.cropper-hide { 
 position: absolute; 
 
 display: block; 
 
 width: 0; 
 height: 0; 
} 
 
.cropper-hidden { 
 display: none !important; 
} 
 
.cropper-move { 
 cursor: move; 
} 
 
.cropper-crop { 
 cursor: crosshair; 
} 
 
.cropper-disabled .cropper-drag-box, 
.cropper-disabled .cropper-face, 
.cropper-disabled .cropper-line, 
.cropper-disabled .cropper-point { 
 cursor: not-allowed; 
} 
 
 
</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
一段批量给页面上的控件赋值js
Jun 19 Javascript
jtable列中自定义button示例代码
Nov 21 Javascript
超链接的禁用属性Disabled使用示例
Jul 31 Javascript
JavaScript焦点事件、鼠标事件和滚轮事件使用详解
Jan 15 Javascript
node.js插件nodeclipse安装图文教程
Oct 19 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
Oct 26 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
Nov 28 Javascript
JavaScript实现水平进度条拖拽效果
Jan 18 Javascript
vue解决跨域路由冲突问题思路解析
Nov 03 Javascript
详解Vue2 SSR 缓存 Api 数据
Nov 20 Javascript
vue中eslintrc.js配置最详细介绍
Dec 21 Javascript
vue element 生成无线级左侧菜单的实现代码
Aug 21 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
Jul 10 #Javascript
Javascript调试之console对象——你不知道的一些小技巧
Jul 10 #Javascript
vue实现表格数据的增删改查
Jul 10 #Javascript
激动人心的 Angular HttpClient的源码解析
Jul 10 #Javascript
基于JS实现仿京东搜索栏随滑动透明度渐变效果
Jul 10 #Javascript
jQuery实现QQ空间汉字转拼音功能示例
Jul 10 #jQuery
Underscore之Array_动力节点Java学院整理
Jul 10 #Javascript
You might like
超外差式晶体管收音机的组装与统调
2021/03/01 无线电
PHP基于SMTP协议实现邮件发送实例代码
2017/04/27 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
window.open的功能全解析
2006/10/10 Javascript
javascript 实现父窗口引用弹出窗口的值的脚本
2007/08/07 Javascript
jQuery实现异步获取json数据的2种方式
2014/08/29 Javascript
jQuery实现的超酷苹果风格图标滑出菜单效果代码
2015/09/16 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
javascript 数组的定义和数组的长度
2016/06/07 Javascript
jQuery基于BootStrap样式实现无限极地区联动
2016/08/26 Javascript
vue单页应用中如何使用jquery的方法示例
2017/07/27 jQuery
bootstrap modal+gridview实现弹出框效果
2017/08/15 Javascript
nodejs async异步常用函数总结(推荐)
2017/11/17 NodeJs
JavaScript中创建原子的方法总结
2018/08/26 Javascript
Vue组件Draggable实现拖拽功能
2018/12/01 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
2019/02/12 Javascript
详解jQuery设置内容和属性
2019/04/11 jQuery
vue设置一开始进入的页面教程
2019/10/28 Javascript
JS如何实现手机端输入验证码效果
2020/05/13 Javascript
vue添加自定义右键菜单的完整实例
2020/12/08 Vue.js
复习Python中的字符串知识点
2015/04/14 Python
Python 记录日志的灵活性和可配置性介绍
2018/02/27 Python
用 Python 连接 MySQL 的几种方式详解
2018/04/04 Python
python安装模块如何通过setup.py安装(超简单)
2018/05/05 Python
python 从csv读数据到mysql的实例
2018/06/21 Python
python 字符串追加实例
2019/07/20 Python
python 函数的缺省参数使用注意事项分析
2019/09/17 Python
Python命令行click参数用法解析
2019/12/19 Python
Python 改变数组类型为uint8的实现
2020/04/09 Python
如何基于Django实现上下文章跳转
2020/09/16 Python
艺术系应届生的自我评价
2013/10/19 职场文书
党的群众路线教育实践活动公开承诺书
2014/03/28 职场文书
健康家庭事迹材料
2014/05/02 职场文书
英文慰问信
2015/02/14 职场文书
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js
windows server2012 R2下安装PaddleOCR服务的的详细步骤
2022/09/23 Servers