vue中使用cropperjs的方法

用vue的项目里需要对图片进行裁剪,于是使用了cropperjs,在使用的过程中也踩过一些坑,以下是在.vue文件里cropperjs的使用方法和经验教训总结:

在使用之前,先引入:

在项目里,运行:

npm install cropperjs -save

在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> 

js代码:

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 () {
   //这边写图片的上传
  }
 }
} 

整体效果:

css代码(比较长,本来想不贴上了,但是为了一下童鞋可以直接运行demo,还是贴上了,篇幅过长,望见谅):

*{
 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;
}

整体图:

把以上这些代码放入你的项目,或者单独建个.vue放进项目,就可以实现这样的效果:

总结

以上所述是小编给大家介绍的vue中使用cropperjs的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

您可能感兴趣的文章:

  • cropper js基于vue的图片裁剪上传功能
  • vue移动端裁剪图片结合插件Cropper的使用实例代码
(0)

相关推荐

  • cropper js基于vue的图片裁剪上传功能的实现代码

    前些日子做了一个项目关于vue项目需要头像裁剪上传功能,看了一篇文章,在此基础上做的修改完成了这个功能,与大家分享一下.原文:http://www.jb51.net/article/135719.htm 首先下载引入cropper js, npm install cropper js --save 在需要的页面引入:import Cropper from "cropper js" html的代码如下: <template> <div id="demo&quo

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

    之前写了一个上传头像的功能模块,以下的内容是描述上传头像过程中裁剪图片插件结合vue的一个使用. 当然,使用就安装 npm install cropperjs 接着再引入 import Cropper from 'cropperjs' 下面是源码 <template> <div id="demo"> <!-- 遮罩层 --> <div class="container" v-show="panel">

  • vue中使用cropperjs的方法

    用vue的项目里需要对图片进行裁剪,于是使用了cropperjs,在使用的过程中也踩过一些坑,以下是在.vue文件里cropperjs的使用方法和经验教训总结: 在使用之前,先引入: 在项目里,运行: npm install cropperjs -save 在template里: <div id="demo"> <!-- 遮罩层 --> <div class="container" v-show="panel">

  • 在Vue中使用echarts的方法

    上篇文章给大家介绍了 在 webpack 中使用 ECharts的实例详解,可以点击查看. 1. 使用NPM安装(全局引入) 执行下面的命令: npm install echarts--save 引入echarts模块 在Vue项目的main.js中引入echarts模块,即是写入如下代码: import echarts from 'echarts' Vue.prototype.$echarts = echarts: 2. 按需引入 上面全局引入会将所有的echarts图表打包,导致体积过大,我

  • vue中实现methods一个方法调用另外一个方法

    vue在同一个组件内: methods中的一个方法调用methods中的另外一个方法 可以在调用的时候  this.$options.methods.test2(); this.$options.methods.test2();一个方法调用另外一个方法: new Vue({ el: '#app', data: { test:111, }, methods: { test1:function(){ alert(this.test) }, test2:function(){ alert("this

  • vue中使用mxgraph的方法实例代码详解

    1.npm 引入 npm install mxgraph --save 2.这个模块可以使用require()方法进行加载.它将返回一个接受对象作为选项的工厂函数.必须将mxBasePath选项提供给工厂函数,而不是将其定义为一个全局变量. var mxgraph = require("mxgraph")( { // 以下地址不需要修改 mxImageBasePath: "./src/images", mxBasePath: "./src" })

  • Vue 中使用 typescript的方法详解

    什么是typescript typescript 为 javaScript的超集,这意味着它支持所有都JavaScript都语法.它很像JavaScript都强类型版本,除此之外,它还有一些扩展的语法,如interface/module等. typescript 在编译期会去掉类型和特有语法,生成纯粹的JavaScript. Typescript 5年内的热度随时间变化的趋势,整体呈现一个上升的趋势.也说明ts越来越️受大家的关注了. 安装typescript npm install -g ty

  • vue中使用vue-pdf的方法详解

    需求:简单说~~有两个pdf文件需在h5上展示,通过点击按钮切换不同文件的显示 注: 1.vue-pdf默认展示首页,我这里的需求是通过滑动展示所有页面,这里使用的v-for遍历.有多少页就加载了多少个pdf组件. 2.pdf文件存在跨域问题,这个需要后端同学支持. 3.demo上的pdf文件只有一页,测试多页展示,自己改用多页pdf文件即可 <template> <div class="pdf_wrap"> <div class="pdf_li

  • vue中使用TypeScript的方法

    引言 近几年前端对 TypeScript的呼声越来越高,Typescript也成为了前端必备的技能.TypeScript 是 JS类型的超集,并支持了泛型.类型.命名空间.枚举等特性,弥补了 JS 在大型应用开发中的不足. 在单独学习 TypeScript时,你会感觉很多概念还是比较好理解的,但是和一些框架结合使用的话坑还是比较多的,例如使用 React.Vue 这些框架的时候与 TypeScript 的结合会成为一大障碍,需要去查看框架提供的.d.ts的声明文件中一些复杂类型的定义.组件的书写

  • vue中jsonp的使用方法

    目录 1.前言 2.安装 3.使用 4.vue文件使用 1.前言 最近在做手写输入法时遇到跨域问题,使用的是qq输入法的接口,代理无法实现效果,这里使用jsonp来实现.jsonp原理可以自行百度,这里记录一下vue-jsonp的使用和踩的一点小坑,官方文档请前往npm地址. 2.安装 npm install vue-jsonp -S 或者 yarn add vue-jsonp 3.使用 mian.js引用 // main.js import Vue from 'vue' import { Vu

  • vue中Promise的使用方法详情

    目录 一.使用 1.promise是一种异步解决方案 2.asyncawait 简介: promise是什么,它可以说是异步编程的一种解决方法,就拿传统的ajax发请求来说,单个还好,如果是一个请求回来的数据还要被其他请求调用,不断地嵌套,可想而知,代码看起来是很乱的,promise主要是为了解决这种情景而出现的. 一.使用 1.promise是一种异步解决方案 由于ajax异步方式请求数据时,我们不能知道数据具体回来的事件,所以过去只能将一个callback函数传递给ajax封装的方法,当aj

  • Vue中使用Teleport的方法示例

    目录 正文 Teleport 在 Vue 中的使用 禁用 Teleport 标签 正文 通常,当我们在 Vue 中创建组件时,它们出现在我们期望的 DOM 结构中.但是,有时我们并不希望如此.一个很好的例子就是模态框——通常,模态框应该出现在页面上所有内容的顶部——所以如果我们在逻辑上在具体的组件中创建它,它可能会出现在某些 HTML 元素后面或需要一些奇怪的 CSS 样式让它达到顶部. 幸运的是,在 Vue 中有一种简单的方法可以解决这个问题,称为. 标签允许我们在组件中定义一些东西,然后在代

随机推荐