用cropper插件写上传头像(可头像截图)

该篇博客主要介绍以下使用cropper插件来写一个完整的上传头像功能,带头像截图以及可预览。

<!-- more -->

目录

  • cropper插件
  • html部分
  • js部分
  • 完整代码

cropper插件

这个功能主要基于cropper插件<br> 下载cropper:github地址<br> 直接使用npm下载

1
npm install cropper jquery

引入文件

1
2
<link href="路径/cropper.css" rel="stylesheet">
<script src="路径/cropper.js"><script>

html部分

1
2
3
4
5
<!-- 文件选择框 -->
<input id="imgPicker" type="file" accept="image/" />
<!-- 用来预览图片的img标签 -->
<img id="preview" />
<button id="btn">上传</button>

js部分

预览效果的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$('#imgPicker').bind('change',function(){
//当没选中图片时,清除预览
if(this.files.length === 0){
$('#preview').attr('src','');
return;
}
//实例化一个FileReader
var reader = new FileReader();
reader.onload = function(e){
//当reader加载时,把图片的内容赋值给preview的src
$('#preview').attr("src",e.target.result);
}
reader.readAsDataURL(this.files[0]);
})

cropper的使用:

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
//将#preview的图片加上cropper剪裁效果
var $image = $('#preview');
$image.cropper({
aspectRatio: 1 / 1,
preview: "#preview",
dragMode: "none",
modal: true,
guides: true,
background: true,
autoCrop: true,
autoCropArea: 0.5,
movable: true,
scalable: true,
zoomable: true,
wheelZoomRatio: 0.1,
cropBoxMovable: true,
cropBoxResizable: false,
})
$("#btn").on("click", function() {
console.log($image.cropper('getCroppedCanvas'));;
var cas = $image.cropper('getCroppedCanvas');
cas.toBlob(function(e) {
console.log(e); //生成Blob的图片格式
var formData = new FormData();
formData.append('croppedImage', e);
$.ajax('/path/to/upload', {
method: "POST",
data: formData,
processData: false,
contentType: false,
success: function(data) {
console.log('Upload success');
$(".headImage").attr("src", data);
},
error: function() {
console.log('Upload error');
}
});
})
})

完整代码

上述的js代码,分别实现了预览和图片裁剪效果,下面看看完整代码: <br> 简要说明一下如何写好看的选择文件按钮,让选择文件的默认按钮与自己写好的按钮重叠,且默认按钮需在自定义按钮的上方,可以使用相对定位和绝对定位实现。然后让默认按钮的透明值为0,这样表面看是在点击自定义按钮,实际上点击的是默认按钮。

1
2
3
4
5
6
<!-- 使用了bootstrap的按钮样式,也可以自己写样式 -->
<div class="box">
<button class="btn btn-primary selectImg">选择图片</button>
<input id="imgPicker" type="file" accept="image/" />
</div>
<!-- accept="image/"表明只接受图片 -->

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.box{
position: relative;
display: inline-block;
overflow: hidden;
/* 让超出的内容隐藏 */
}
#imgPicker{
position: absolute;
left: 0;
top: 0;
/* 宽度和高度为自定义按钮的高度和宽度 */
width: 82px;
height: 34px;
opacity: 0;
}

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
$('#imgPicker').bind('change', function() {
//当没选中图片时,清除预览
if (this.files.length === 0) {
$('#preview').attr("src", "");
return;
}

//实例化一个FileReader
var reader = new FileReader();
reader.onload = function(e) {
$('#preview').attr("src", e.target.result);
var $image = $('#preview');
console.log($image.attr("src"));
$image.cropper({
aspectRatio: 1 / 1,
preview: "#preview",
dragMode: "none",
modal: true,
guides: true,
background: true,
autoCrop: true,
autoCropArea: 0.5,
movable: true,
scalable: true,
zoomable: true,
wheelZoomRatio: 0.1,
cropBoxMovable: true,
cropBoxResizable: false,
})
// 重选图片时重绘
$image.cropper('replace', $image.attr("src"), false);
$(".comBtn").on("click", function() {
var cas = $image.cropper('getCroppedCanvas');
cas.toBlob(function(e) {
console.log(e); //生成Blob的图片格式
var formData = new FormData();
formData.append('croppedImage', e);
$.ajax('/path/to/upload', {
method: "POST",
data: formData,
processData: false,
contentType: false,
success: function(data) {
console.log('Upload success');
$(".headImage").attr("src", data);
},
error: function() {
console.log('Upload error');
}
});
})
})
};
reader.readAsDataURL(this.files[0]);
});

该博客的头像裁剪效果为:裁剪框可移动不可以拉伸,所选图可通过鼠标滚轮进行放大缩小。更多关于cropper.js插件的参数及方法可参看 cropper.js 裁剪图片并上传(文档翻译+demo)

本文标题:用cropper插件写上传头像(可头像截图)

文章作者:AHRL

发布时间:2018年05月01日 - 19:05

最后更新:2018年05月01日 - 21:05

原始链接:http://ahrler.xyz/2018/05/01/用cropper插件写上传头像(可头像截图)/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------