vuecli+elementui+cropperjs 在弹窗更改用户头像

vue项目需要头像裁剪上传功能,看了一篇博客,原文:https://blog.csdn.net/leileibrother/article/details/78655371。代码放到初始化组件中可以用,但是放在项目里的组件遮罩层无法显示裁剪框和正常大小的图片,花了一下午时间,发现问题在使用了对话框和scoped。

效果图:

vuecli+elementui+cropperjs 在弹窗更改用户头像_第1张图片vuecli+elementui+cropperjs 在弹窗更改用户头像_第2张图片vuecli+elementui+cropperjs 在弹窗更改用户头像_第3张图片

步骤:

在项目里,运行:

npm install cropperjs -save

在template里:


Picture

js代码:

import Cropper from "cropperjs"

export default {  
  data () {  
    return {       

     headerImage: "../assets/img/logo2.png",
     picValue: "",
     cropper: "",
     croppable: false,
     panel: false,
     url: "",
     imgCropperData: {
     accept: "image/gif, image/jpeg, image/png, image/jpg"
      },
    }  
  },  
  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: {  
     //移入移除效果
       showEnter(){
         $('.show').addClass('infoIconUp')
        this.isEnter=true
       },
       showMove(){
         $('.show').removeClass('infoIconUp')
         this.isEnter=false
        },
    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 ;  
    },  
    //input框change事件,获取到上传的文件
     uploadHeadImg: function () {
     this.$el.querySelector('.hiddenInput').click()
     },
   
change(e) {
  let files = e.target.files || e.dataTransfer.files;
  if (!files.length) return;
  let type = files[0].type; //文件的类型,判断是否是图片
  let size = files[0].size; //文件的大小,判断图片的大小
  if (this.imgCropperData.accept.indexOf(type) == -1) {
    alert("请选择我们支持的图片格式!");
    return false;
  }
  if (size > 5242880) {
    alert("请选择5M以内的图片!");
    return false;
  }
  this.picValue = files[0];
  console.log(files[0])
  console.log(files)
  this.url = this.getObjectURL(this.picValue);
  //每次替换图片要重新得到新的url
  if (this.cropper) {
    this.cropper.replace(this.url);
  }
  this.panel = true;
  $('#change').val('');//取消change事件
},
//确定提交
commit() {
  this.panel = false;
  var croppedCanvas;
  var roundedCanvas;
  if (!this.croppable) {
    return;
  }
  // Crop
  croppedCanvas = this.cropper.getCroppedCanvas();
  // Round
  roundedCanvas = this.getRoundedCanvas(croppedCanvas);
  this.headerImage = roundedCanvas.toDataURL();
  //上传图片
  this.postImg();

},

 

//提交上传函数
postImg() {
  function dataURLtoFile(dataurl, filename) { 
    //将base64转换为文件
    var arr = dataurl.split(','),
      mime = arr[0].match(/:(.*?);/)[1],
      bstr = atob(arr[1]),
      n = bstr.length,
      u8arr = new Uint8Array(n);
    while (n--) {
      u8arr[n] = bstr.charCodeAt(n);
    }
    return new File([u8arr], filename, {
      type: mime
    });
  }
  const formData = new FormData();
  const file = dataURLtoFile(this.headerImage, '');
  formData.append('file',file);
  console.log(file);
  $.ajax({
    url:'',
    type:'POST',
    data:formData,//formData本身就是对象
    processData:false,
    contentType:false,
    dataType:'json',
    async:false,
    success:function(result){
   
    }
  })
},
//取消上传
cancel() {
  this.panel = false;
  $('#change').val('');//取消change事件
},
//canvas画图
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;
},

  }  
}  

style:

cropper.css不写在scoped里就不会影响样式了

 

cropper.css:

.imgButton{
  display: flex;
  justify-content: space-around;
  align-items: center;
  width:100%;
  height:40px;
  position: absolute;
  bottom: 60px;
}
#button,#cancel {
  width: 120px;
  height: 40px;
  border: none;
  border-radius: 5px;
  background: white;
  cursor: pointer;
}
#cancel{left:10px;}
#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;
}
.container {
  z-index: 9999;
  position: fixed;
  padding-top: 28px;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
  background: rgba(0, 0, 0, 1);
  width: 70%;
  height: 70%;
  margin: 140px auto;
}
#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 {
  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: 0.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: 0.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: 0.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: 0.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: 0.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: 0.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/gAAAABlBMVEXMzMzTjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+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;
}

你可能感兴趣的:(vuecli+elementui+cropperjs 在弹窗更改用户头像)