1.安装 vue-Cropper
1 | yarn add -S vue-Cropper |
2.main 全局引入或者局部引入vue-Cropper
1 2 | import VueCropper from 'vue-cropper' Vue.use(VueCropper) |
3.直接上干货
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 | <template> <div style="min-width: 540px;width:600px;"> <div class="eleme"> <el-upload class="upload-demo" ref="upload" action="https://jsonplaceholder.typicode.com/posts/" :before-upload="beforeUpload" :on-preview="handlePreview" :on-remove="handleRemove" :auto-upload="true" :show-file-list="false" > <el-button slot="trigger" size="small" type="primary">选择图片</el-button> <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">上传头像</el-button> </el-upload> </div> <div> <br /> <el-button type="primary" icon="el-icon-refresh-right" circle @click="rotateRight"></el-button> <el-button type="success" icon="el-icon-refresh-left" circle @click="rotateLeft"></el-button> <el-button type="danger" icon="el-icon-plus" circle @click="changeScale(1)"></el-button> <el-button type="warning" icon="el-icon-minus" circle @click="changeScale(-1)"></el-button> </div> <div class="cropper"> <div class="cropper-content" style="margin-top:60px;margin-left:60px;"> <div class="cropper"> <vueCropper ref="cropper" :img="option.img" :outputSize="option.size" :outputType="option.outputType" :info="true" :full="option.full" :canMove="option.canMove" :canMoveBox="option.canMoveBox" :original="option.original" :autoCrop="option.autoCrop" :autoCropWidth="option.autoCropWidth" :autoCropHeight="option.autoCropHeight" :fixedBox="option.fixedBox" @realTime="realTime" @imgLoad="imgLoad" ></vueCropper> </div> <div style="margin-left:20px;"> <div class="show-preview" :style="{'width': '150px', 'height':'155px', 'overflow': 'hidden', 'margin': '5px'}" ></div> </div> </div> </div> </div> </template> <script> export default { data() { return { headImg: '', //剪切图片上传 crap: false, previews: {}, option: { img: '', outputSize: 1, //剪切后的图片质量(0.1-1) full: false, //输出原图比例截图 props名full outputType: 'png', canMove: true, original: false, canMoveBox: true, autoCrop: true, autoCropWidth: 150, autoCropHeight: 150, fixedBox: false }, fileName: '', //本机文件地址 downImg: '#', imgFile: '', uploadImgRelaPath: '' //上传后的图片的地址(不带服务器域名) } }, methods: { submitUpload(file) { // this.$refs.upload.submit(); this.finish('blob') }, handleRemove(file, fileList) { console.log(file, fileList) }, handlePreview(file) { console.log(file) // let data = window.URL.createObjectURL(new Blob([file])); // this.option.img = data; }, beforeUpload(file) { console.log('上传文件') console.log(file) let data = window.URL.createObjectURL(new Blob([file])) this.fileName = file.name this.option.img = data }, //放大/缩小 changeScale(num) { console.log('changeScale') num = num || 1 this.$refs.cropper.changeScale(num) }, //坐旋转 rotateLeft() { console.log('rotateLeft') this.$refs.cropper.rotateLeft() }, //右旋转 rotateRight() { console.log('rotateRight') this.$refs.cropper.rotateRight() }, //上传图片(点击上传按钮) finish(type) { console.log('finish') let _this = this let formData = new FormData() // 输出 if (type === 'blob') { this.$refs.cropper.getCropBlob(data => { let img = window.URL.createObjectURL(data) this.model = true this.modelSrc = img formData.append('file', data, this.fileName) this.$axios .post(config.upLoadFileURL, formData, { contentType: false, processData: false, headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }) .then(response => { var res = response.data if (res == 'success') { console.log('上传成功!') } }) }) } else { this.$refs.cropper.getCropData(data => { this.model = true this.modelSrc = data }) } }, // 实时预览函数 realTime(data) { console.log('realTime') this.previews = data }, imgLoad(msg) { console.log('imgLoad') console.log(msg) } } } </script> <style lang="scss"> .cropper-content { min-width: 540px; display: flex; .cropper { width: 260px; height: 260px; } .show-preview { flex: 1; -webkit-flex: 1; display: flex; display: -webkit-flex; justify-content: center; -webkit-justify-content: center; .preview { overflow: hidden; border-radius: 50%; border: 1px solid #cccccc; background: #cccccc; margin-left: 40px; } } } .cropper-content .show-preview .preview { margin-left: 0; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; -khtml-user-select: none; user-select: none; } </style> |