当前位置:   article > 正文

cropperjs裁剪上传头像使用方法_js 头像裁剪显示

js 头像裁剪显示

头像的更新流程

1-创建表单的隐藏域

2-监听隐藏域的change事件

3-利用domElement.files方法获取到用户所选择的文件

4-如果是单选,则直接files[0]

5-得到的files[0] 可以利用URL.createObjectUrl(files[0])方法获取到blob对象

6-这个blob表示图片的原始数据,以url的形式进行展示

7-img标签可以直接展示这个url

黑马头条的更换头像的实现

1-html标签结构

  1. <!-- 头像 -->
  2. <van-cell title="头像" is-link @click="avatorClickFn">
  3. <img :src="$store.state.userInfo.photo" class="avator">
  4. </van-cell>
  5. <!-- 隐藏的input表单域 -->
  6. <input type="file" v-show="false" ref="FileEleRef" accept="image/png, image/jpeg" @change="SelectPhoto">

2-点击触发隐藏表单的click事件,监听input的change事件

  1. avatorClickFn() {
  2. // 触发input的点击事件
  3. this.$refs.FileEleRef.click()
  4. },
  5. SelectPhoto() {
  6. // 触发了表单的change事件 可以通过files 拿到当前选择的值
  7. // 判断用户当前有没有选择图片 (是确定按钮还是取消那妞)
  8. if (this.$refs.FileEleRef.files) {
  9. // 点击了确定
  10. // 拿到当前选择的图片 利用URL.createObjectURL()
  11. this.SelectAvator = URL.createObjectURL(this.$refs.FileEleRef.files[0])
  12. // 触发popup弹层弹出
  13. this.AvatorShow = true
  14. }
  15. }

3-弹层

  • 1-下载并导入cropperjs 创建裁剪区域

  • 2-new 一个 cropper 实例 new Cropper(element[, options]) 第一个参数是img / canvs 实例 第二个是配置项

  • 3-取消行为 点击取消后,让popup隐藏即将value值广播为false

  • 4-完成行为 点击完成 使用cropper.getCroppedCanvas().toBlob 拿到当前裁剪区域的图片 发起更换头像请求 调用取消

  • 5-利用formData发请求

  1. <template>
  2. <van-popup
  3. position="bottom" :style="{ height: '100%' }"
  4. :value="value" @input="$emit('input',$event)">
  5. <img :src="photo" alt="" class="avator" ref="ImgAvator">
  6. <div class="bottom">
  7. <span class="close" @click="closeFn">取消</span>
  8. <span class="finished" @click="finishedFn">完成</span>
  9. </div>
  10. </van-popup>
  11. </template>
  12. <script>
  13. /**
  14. * 1-下载并导入cropperjs 创建裁剪区域
  15. * 2-new 一个 cropper 实例 new Cropper(element[, options]) 第一个参数是img / canvs 实例 第二个是配置项
  16. * 3-取消行为 点击取消后,让popup隐藏即将value值广播为false
  17. * 4-完成行为 点击完成 使用cropper.getCroppedCanvas().toBlob 拿到当前裁剪区域的图片 发起更换头像请求 调用取消行为
  18. */
  19. //导入样式,必须要导入
  20. import 'cropperjs/dist/cropper.css'
  21. import Cropper from 'cropperjs'
  22. // 导入接口
  23. import { ChangeUserAvator } from '@/api/user'
  24. // vant 组件
  25. import { Toast } from 'vant'
  26. export default {
  27. name: 'AvatorVue',
  28. props: {
  29. value: Boolean,
  30. photo: String
  31. },
  32. data () {
  33. return {
  34. cropper: null
  35. }
  36. },
  37. mounted() {
  38. const ImgRef = this.$refs.ImgAvator
  39. this.cropper = new Cropper(ImgRef, {
  40. viewMode: 1, // 只能在裁剪的图片范围内移动
  41. dragMode: 'move', // 画布和图片都可以移动
  42. aspectRatio: 1, // 裁剪区默认正方形
  43. autoCropArea: 1, // 自动调整裁剪图片
  44. cropBoxMovable: false, // 禁止裁剪区移动
  45. cropBoxResizable: false, // 禁止裁剪区缩放
  46. background: false // 关闭默认背景
  47. })
  48. },
  49. methods: {
  50. closeFn() {
  51. this.$emit('input', false)
  52. },
  53. finishedFn() {
  54. this.cropper.getCroppedCanvas().toBlob(async(blob) => {
  55. // 创建formData实例对象 向formData中新增一个属性名为photo 属性值为我们刚裁剪出来的blob对象
  56. const formData = new FormData()
  57. formData.append('photo', blob)
  58. Toast.loading({
  59. message: '加载中...',
  60. forbidClick: true
  61. })
  62. await ChangeUserAvator(formData)
  63. this.closeFn()
  64. Toast.success('头像更新成功')
  65. this.$store.dispatch('profile')
  66. })
  67. }
  68. }
  69. }
  70. </script>
  71. <style scoped lang="scss">
  72. .avator {
  73. width: 100vw;
  74. position: absolute;
  75. top: 50%;
  76. left: 0;
  77. transform: translateY(-50%);
  78. }
  79. .bottom {
  80. display: flex;
  81. position: absolute;
  82. bottom: 0;
  83. left: 0;
  84. width: 100vw;
  85. justify-content: space-between;
  86. span {
  87. z-index: 999;
  88. padding: 25px;
  89. font-size: 16px;
  90. }
  91. }
  92. </style>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/565279
推荐阅读
相关标签
  

闽ICP备14008679号