Q1:为什么选择Cropper.js和如何安装Cropper.js?
一开始制作这个需求思路有两个,使用canvas原生或者寻找现成的库,对比了一番觉得canvas实现时间耗费较长,且秉承着不重复造轮子的原则(其实是菜),决定使用Cropper.js。官方封装了很多参数、方法、事件,上手容易,文档阅读体验较好、而且便于扩展。
Cropper.js官方仓库+文档:
github.com/fengyuanche…
Installation
npm install cropperjs
复制代码
Q2:如何上传图片?
我们实现上述功能需要的核心HTMl部分只有:
<input
type="file"
accept="image/*"
id="imgReader"
onchange="loadingImg"
<img id="cropImg">
<div class="previewText">裁剪预览</div>
<div class="previewBox"></div>
<div class="previewBoxRound"></div>
复制代码
首先先将用于上传的input隐藏起来,我们并不需要它的样式
.inpuFile{
display: none;
复制代码
然后给你项目中的某个按钮添加一个点击事件,并且调用
function uploadImg(){
document.querySelector('#imgReader').click()
复制代码
即可打开上传文件的窗口,然后选择你需要的图片
Q3:如何将图片读取显示和使用Cropper.js添加裁剪控件?
上传文件成功后,会触发onchange事件,调用loadingImg()
import 'cropperjs/dist/cropper.css';
import Cropper from 'cropperjs';
let CROPPER
function loadingImg(eve){
let reader = new FileReader();
if(event.target.files[0]){
reader.readAsDataURL(eve.target.files[0]);
reader.onload = (e)=>{
let dataURL = reader.result;
document.querySelector('#cropImg').src = dataURL;
const image = document.getElementById('cropImg');
CROPPER = new Cropper(image, {
aspectRatio: 16 / 16,
viewMode:0,
minContainerWidth:500,
minContainerHeight:500,
dragMode:'move',
preview:[ document.querySelector('.previewBox'),
document.querySelector('.previewBoxRound')]
复制代码
new Cropper方法:
new Cropper(element[, options])
第一个参数:element
类型:HTMLImageElement 或 HTMLCanvasElement;
作用:用于显示裁剪功能;
第二个参数(可选):
类型: Object;
作用:用于添加具体参数设置
我们需要用到的参数有:
aspectRatio:
16
/
16
,
minContainerWidth:
500
,
minContainerHeight:
500
,
dragMode:
'move'
,
preview:[
document
.
querySelector
(
'.previewBox'
),
document
.
querySelector
(
'.previewBoxRound'
)]
复制代码
先忽略实时预览,完成到这里我们就可看到我们上传的图片以及裁剪功能:
Q4:如何进行实时预览?
上面创建cropper的时候,我们在选项中添加了
preview:[ document.querySelector('.previewBox'),
document.querySelector('.previewBoxRound')]
复制代码
preview就是用来设置我们需要实时预览的地方,但是设置完成之后要给上述的两个div添加一下样式,才可以正常显示
.previewBox,.previewBoxRound{
box-shadow: 0 0 5px #adadad;
width: 100px;
height: 100px;
margin-top: 30px;
overflow: hidden;
.previewBoxRound{
border-radius: 50%;
Q5:如何获取裁剪数据并发送至后端?
function GetData(){
CROPPER.getCroppedCanvas({
maxWidth: 4096,
maxHeight: 4096,
fillColor: '#fff',
imageSmoothingEnabled: true,
imageSmoothingQuality: 'high',
}).toBlob((blob) => {
const formData = new FormData();
formData.append('croppedImage', blob);
let config = {
headers:{'Content-Type':'multipart/form-data'}
this.$axios.post(flow_mission_UploadFile(),param,config)
.then((response)=>{
console.log(response)
.catch((err)=>{
console.log(err)
复制代码
其他需要注意的地方:
1.裁剪框尺寸问题
裁剪部分默认会根据上传图片的大小进行改变
解决图片过小的问题:
minContainerWidth:500,
minContainerHeight:500,
解决图片过大的问题:
给
添加固定宽度样式
#cropImg{
height: 450px;
width: 450px;
box-shadow: 0 0 5px #adadad;
复制代码
2.重复上传的问题
再次上传不同图片的时候,还是出现原来的图片,只需要在上传文件的时候,对之前存在的CROPPER进行摧毁就可以了
function uploadImg(){
document.querySelector('#imgReader').click()
if(CROPPER){
CROPPER.destroy()
复制代码
3.其他功能的实现
这里列举几个我这里用到的
CROPPER.rotate(90) :旋转图片,单位为数字,90为顺时针旋转90度
CROPPER.zoom(0.1) :缩放图片,单位为数字,0.1为在原缩放基础上增加0.1倍
CROPPER.reset() :重置对图片的所有操作
还有很多其他方法和事件可以自行参照仓库,一个普通的上传头像功能就这样应该够用了!这里就不一一列举啦
如果觉得写得有不好的地方请多多指教,喜欢的话可以点个赞哈!