啥都不说, 直接先来一张效果图……
![]()
小伙伴们,别急,咱们先来分析一下主要功能点:
- 图片预览
- 图片拖拽
- 图片缩放
- 图片裁剪
图片预览
图片预览的功能技术方案是将用户的图片文件转成Base64编码并设置到<img>标签的src属性,获取图片文件的Base64编码需要通过HTML5的新特性FileReader,具体代码如下:
|
|
图片拖拽
图片拖拽的功能需要借助鼠标事件mousedown, mousemove, mouseup,这里贴出mousemove里的处理:
|
|
代码中可以看出,图片拖拽也是有边界的,计算最小的left和top值。
图片缩放
图片缩放很简单,主要在宽高比固定的条件下,调整图片的宽度和高度。
|
|
图片裁剪
这里的裁剪工作是在前端完成的,需要借助Canvas的一些接口。
|
|
drawImage方法的功能是将图片上的某个点作为锚点,绘制指定的宽度和高度到Canvas标签。
完整的demo代码请移步至brucewar/avatar-upload
有心的读者可能已经发现,知乎的头像上传功能已经换了一种实现方案。不错,这还是之前的方案,通过上下两张图片实现预览时的边界半透明效果。

