index.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. <template>
  2. <div>
  3. <el-dialog title="更换头像" v-model="state.isShowDialog" width="769px">
  4. <div class="cropper-warp">
  5. <div class="cropper-warp-left">
  6. <img :src="state.cropperImg" class="cropper-warp-left-img" />
  7. </div>
  8. <div class="cropper-warp-right">
  9. <div class="cropper-warp-right-title">预览</div>
  10. <div class="cropper-warp-right-item">
  11. <div class="cropper-warp-right-value">
  12. <img :src="state.cropperImgBase64" class="cropper-warp-right-value-img" />
  13. </div>
  14. <div class="cropper-warp-right-label">100 x 100</div>
  15. </div>
  16. <div class="cropper-warp-right-item">
  17. <div class="cropper-warp-right-value">
  18. <img :src="state.cropperImgBase64" class="cropper-warp-right-value-img cropper-size" />
  19. </div>
  20. <div class="cropper-warp-right-label">50 x 50</div>
  21. </div>
  22. </div>
  23. </div>
  24. <template #footer>
  25. <span class="dialog-footer">
  26. <el-button @click="onCancel" size="default">取 消</el-button>
  27. <el-button type="primary" @click="onSubmit" size="default">更 换</el-button>
  28. </span>
  29. </template>
  30. </el-dialog>
  31. </div>
  32. </template>
  33. <script setup lang="ts" name="cropper">
  34. import { reactive, nextTick } from 'vue';
  35. import Cropper from 'cropperjs';
  36. import 'cropperjs/dist/cropper.css';
  37. // 定义变量内容
  38. const state = reactive({
  39. isShowDialog: false,
  40. cropperImg: '',
  41. cropperImgBase64: '',
  42. cropper: '' as RefType,
  43. });
  44. // 打开弹窗
  45. const openDialog = (imgs: string) => {
  46. state.cropperImg = imgs;
  47. state.isShowDialog = true;
  48. nextTick(() => {
  49. initCropper();
  50. });
  51. };
  52. // 关闭弹窗
  53. const closeDialog = () => {
  54. state.isShowDialog = false;
  55. };
  56. // 取消
  57. const onCancel = () => {
  58. closeDialog();
  59. };
  60. // 更换
  61. const onSubmit = () => {
  62. // state.cropperImgBase64 = state.cropper.getCroppedCanvas().toDataURL('image/jpeg');
  63. };
  64. // 初始化cropperjs图片裁剪
  65. const initCropper = () => {
  66. const letImg = <HTMLImageElement>document.querySelector('.cropper-warp-left-img');
  67. state.cropper = new Cropper(letImg, {
  68. viewMode: 1,
  69. dragMode: 'none',
  70. initialAspectRatio: 1,
  71. aspectRatio: 1,
  72. preview: '.before',
  73. background: false,
  74. autoCropArea: 0.6,
  75. zoomOnWheel: false,
  76. crop: () => {
  77. state.cropperImgBase64 = state.cropper.getCroppedCanvas().toDataURL('image/jpeg');
  78. },
  79. });
  80. };
  81. // 暴露变量
  82. defineExpose({
  83. openDialog,
  84. });
  85. </script>
  86. <style scoped lang="scss">
  87. .cropper-warp {
  88. display: flex;
  89. .cropper-warp-left {
  90. position: relative;
  91. display: inline-block;
  92. height: 350px;
  93. flex: 1;
  94. border: 1px solid var(--el-border-color);
  95. background: var(--el-color-white);
  96. overflow: hidden;
  97. background-repeat: no-repeat;
  98. cursor: move;
  99. border-radius: var(--el-border-radius-base);
  100. .cropper-warp-left-img {
  101. width: 100%;
  102. height: 100%;
  103. }
  104. }
  105. .cropper-warp-right {
  106. width: 150px;
  107. height: 350px;
  108. .cropper-warp-right-title {
  109. text-align: center;
  110. height: 20px;
  111. line-height: 20px;
  112. }
  113. .cropper-warp-right-item {
  114. margin: 15px 0;
  115. .cropper-warp-right-value {
  116. display: flex;
  117. .cropper-warp-right-value-img {
  118. width: 100px;
  119. height: 100px;
  120. border-radius: var(--el-border-radius-circle);
  121. margin: auto;
  122. }
  123. .cropper-size {
  124. width: 50px;
  125. height: 50px;
  126. }
  127. }
  128. .cropper-warp-right-label {
  129. text-align: center;
  130. font-size: 12px;
  131. color: var(--el-text-color-primary);
  132. height: 30px;
  133. line-height: 30px;
  134. }
  135. }
  136. }
  137. }
  138. </style>