<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      vue2圖片裁剪(vue-cropper插件)

      文檔地址:https://github.com/xyxiao001/vue-cropper

      安裝:

      npm install vue-cropper

       

      子組件

      <template>
        <el-dialog
          title="裁剪頭像"
          :visible.sync="dialogVisible"
          :show-close="false"
          :close-on-click-modal="false"
          :close-on-press-escape="false"
          width="600px"
          append-to-body
          @close="closeDialog"
        >
          <div class="avatar-container">
            <!-- 待上傳圖片 -->
            <div v-show="!options.img">
              <el-upload
                ref="upload"
                class="upload"
                action=""
                :on-change="upload"
                accept="image/png, image/jpeg, image/jpg"
                :show-file-list="false"
                :auto-upload="false"
              >
                <el-button slot="trigger" ref="uploadBtn" size="small" type="primary">
                  選擇圖片
                </el-button>
              </el-upload>
              <div>支持jpg、png格式的圖片,大小不超過5M</div>
            </div>
            <!-- 已上傳圖片 -->
            <div v-show="options.img" class="avatar-crop">
              <vueCropper
                v-if="dialogVisible"
                ref="cropper"
                class="crop-box"
                :img="options.img"
                :auto-crop="options.autoCrop"
                :fixed-box="options.fixedBox"
                :can-move-box="options.canMoveBox"
                :auto-crop-width="options.autoCropWidth"
                :auto-crop-height="options.autoCropHeight"
                :center-box="options.centerBox"
                :fixed="options.fixed"
                :fixed-number="options.fixedNumber"
                :can-move="options.canMove"
                :can-scale="options.canScale"
              />
            </div>
          </div>
          <span slot="footer" class="dialog-footer">
            <div class="reupload" @click="reupload">
              <span v-show="options.img">重新上傳</span>
            </div>
            <div>
              <el-button @click="closeDialog">取 消</el-button>
              <el-button type="primary" @click="getCrop">確 定</el-button>
            </div>
          </span>
          <!-- </el-dialog> -->
        </el-dialog>
      </template>
      <script>
      import { VueCropper } from 'vue-cropper'
      export default {
        name: 'AvatarCropper',
        components: {
          VueCropper
        },
        props: {
          dialogVisible: {
            type: Boolean,
            default: false
          }
        },
        data() {
          return {
            // vueCropper組件 裁剪配置信息
            options: {
              name: '',
              img: '', // 原圖文件
              autoCrop: true, // 默認生成截圖框
              fixedBox: false, // 固定截圖框大小
              canMoveBox: true, // 截圖框可以拖動
              autoCropWidth: 200, // 截圖框寬度
              autoCropHeight: 200, // 截圖框高度
              fixed: false, // 截圖框寬高固定比例
              fixedNumber: [1, 1], // 截圖框的寬高比例
              centerBox: true, // 截圖框被限制在圖片里面
              canMove: false, // 上傳圖片不允許拖動
              canScale: true // 上傳圖片不允許滾輪縮放
            }
          }
        },
      
        methods: {
          // 讀取原圖
          upload(file) {
            const isIMAGE = file.raw.type === 'image/jpeg' || file.raw.type === 'image/png'
            const isLt5M = file.raw.size / 1024 / 1024 < 5
            if (!isIMAGE) {
              this.$message({
                showClose: true,
                message: '請選擇 jpg、png 格式的圖片',
                type: 'warning'
              })
              return false
            }
            if (!isLt5M) {
              this.$message({
                showClose: true,
                message: '圖片大小不能超過 5MB',
                type: 'warning'
              })
              return false
            }
            const reader = new FileReader()
            reader.readAsDataURL(file.raw)
            reader.onload = e => {
              this.options.name = file.name
              this.options.img = e.target.result // base64
            }
          },
          // 獲取截圖信息
          getCrop() {
            // 獲取截圖的 blob 數據
            this.$refs.cropper.getCropBlob((data) => {
              this.$emit('closeAvatarDialog', data, this.options.name)
              this.closeDialog()
            })
          },
          // 重新上傳
          reupload() {
            this.$refs.uploadBtn.$el.click()
          },
          // 關閉彈框
          closeDialog() {
            this.$emit('update:dialogVisible', false)
            this.options.img = ''
          }
        }
      }
      </script>
      
      <style lang="scss" scoped>
      .dialog-footer {
        display: flex;
        justify-content: space-between;
        align-items: center;
        font-size: 14px;
        .reupload {
          color: #409eff;
          cursor: pointer;
        }
      }
      .avatar-container {
        display: flex;
        justify-content: center;
        align-items: center;
        width: 560px;
        height: 400px;
        background-color: #f0f2f5;
        margin-right: 10px;
        border-radius: 4px;
        .upload {
          text-align: center;
          margin-bottom: 24px;
        }
        .avatar-crop {
          width: 560px;
          height: 400px;
          position: relative;
          .crop-box {
            width: 100%;
            height: 100%;
            border-radius: 4px;
            overflow: hidden;
          }
        }
      }
      </style>

      父組件

      <template>
        <div>
          <el-button @click="dialogVisible = true">上傳頭像</el-button>
          <avatar-cropper :dialogVisible.sync="dialogVisible" @closeAvatarDialog="closeAvatarDialog"></avatar-cropper>
        </div>
      </template>
      
      <script>
        import avatarCropper from '@/components/avatarCropper'
        export default {
          components: {
            avatarCropper
          },
          data() {
            return {
              dialogVisible: false
            }
          },
          methods: {
            closeAvatarDialog(data) {
              console.log(data)
              this.dialogVisible = false
            }
          }
        }
      </script>

       

      posted @ 2024-11-06 09:48  larry-wang  閱讀(361)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 四虎永久精品免费视频| 国内极度色诱视频网站| 亚洲一区二区色情苍井空| 亚洲肥熟女一区二区三区| 精品久久久久无码| 人人玩人人添人人澡超碰| 久久亚洲精品成人av秋霞| 免费99视频| 欧美乱大交aaaa片if| 亚洲一区二区av免费| 成年女人免费毛片视频永久| 久久亚洲精品11p| 欧美成人www免费全部网站 | 亚洲精品日韩精品久久| 亚洲精品国产av成拍色拍个| 国产精品 无码专区| 乱人伦无码中文视频在线| 国产尤物精品自在拍视频首页| 中文字幕久久国产精品| 国产亚洲精品久久久久婷婷瑜伽| 亚洲最大的成人网站| 九九视频热最新在线视频| 久久亚洲av成人无码软件| 国产360激情盗摄全集| 国产熟女肥臀精品国产馆乱| 内地自拍三级在线观看| 国产午夜福利精品视频| 国产av不卡一区二区| 欧美人与动牲交A免费观看| 男女动态无遮挡动态图| 亚洲精品麻豆一区二区| 久久天天躁综合夜夜黑人鲁色| 一区二区三区国产偷拍| 国产精品一区二区三粉嫩| 日本强好片久久久久久aaa| 久久精品久久黄色片看看| 国产一区二区三区在线观看免费| 亚洲日本乱码在线观看| 亚洲成人av在线资源网| 中文字幕亚洲人妻系列| 亚洲成av一区二区三区|