中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Vue3中怎么實現選取頭像并裁剪

發布時間:2023-05-08 16:24:10 來源:億速云 閱讀:156 作者:iii 欄目:開發技術

這篇文章主要介紹“Vue3中怎么實現選取頭像并裁剪”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Vue3中怎么實現選取頭像并裁剪”文章能幫助大家解決問題。

最終效果

Vue3中怎么實現選取頭像并裁剪

安裝VueCropper組件

yarn add vue-cropper@next

上面的安裝值針對Vue3的,如果時Vue2或者想使用其他的方式引用,請訪問它的npm官方地址:官方教程。

在組件中引用

使用時也很簡單,只需要引入對應的組件和它的樣式文件,我這里沒有在全局引用,只在我的組件文件中引入

<script>
import { userInfoByRequest } from '../js/api'
import { VueCropper } from 'vue-cropper'
import 'vue-cropper/dist/index.css'
export default {
    components: {
        VueCropper
    },
}

然后用<vue-cropper>標簽來進行使用,需要注意的是它需要有外層容器包裹,并且給外層容器設置指定的高度。

<el-dialog title="頭像設置" v-model="showSetAvatarDialog">
            <div class="cropperBox">
                <vue-cropper ref="cropper" :canMoveBox="false" :img="avatarBase64" :fixedBox="true" :autoCrop="true"
                    autoCropWidth="200" autoCropHeight="200" outputType="png"></vue-cropper>
            </div>
            <div class="optionBtn">
                <el-button @click="rotateLeft"><i class="fa fa-rotate-left"></i>左旋轉</el-button>
                <el-button @click="rotateRight"><i class="fa fa-rotate-right"></i>右旋轉</el-button>
                <el-button @click="getPickAvatar" type="primary"><i class="fa fa-save"></i>保存</el-button>
            </div>
</el-dialog>

我這里是將它放到一個Dialog彈框中,當選擇完圖片后會彈出這彈框。
關于它的一些屬性可以參考:官方教程中的詳細描述,上面用到的屬性含義:

  • canMoveBox:截圖框能否移動,默認是可以的,我設置為false,因為我想讓圖片移動,截圖框不動。

  • img:圖片源,可以是圖片網址也可以是base64數據。

  • fixedBox:不允許改變截圖框的大小,默認是可以的,這里我設置為了true,因為我想要一個固定長寬的正方形。

  • autoCrop:是否默認生成截圖框,這里設置為了true

  • autoCropWidth:自動生成截圖框的默認寬度

  • autoCropHeight:自動生成截圖框的默認高度

  • outputType:輸出圖片的格式,這里我設置為了png格式

獲取圖片內容

通過下面這種方式,使用它內置的方法獲取截取圖片的內容

//獲取base64格式的截圖內容
this.$refs.cropper.getCropData(data => {
  // do something
  console.log(data)  
})
//獲取blob格式的截圖內容
this.$refs.cropper.getCropBlob(data => {
  // do something
  console.log(data)  
})

更多其他的內置方法請參考官方教程中的詳細描述。

自定義上傳圖片

截圖組件有了,下面需要我們選擇一個圖片,然后通過前端轉換為base64后彈出截圖的組件進行選擇,這里用原生的input標簽,type為file,但是原生的樣式不是我們想要的,演示中我是點擊一個相機的小圖標后選擇圖片,這個實現過程如下:

  1. 首先將 中加入hidden屬性,將它隱藏

  2. 然后當點擊相機圖標時通過js實現點擊input的事件

  3. 在input標簽中定義change事件,進行圖片轉base64的邏輯

  4. 然后將轉換的數據設置到全局變量中

完整的代碼實現

UserCenter.vue

<template>
    <div class="userCenter">
        <input id="avatarFile" type="file" hidden @change="selectFile" />
        <header>
            <div class="avatar">
                <div class="back">
                    <el-tooltip content="返回">
                        <i @click="back" class="fa fa-arrow-left"></i>
                    </el-tooltip>
                </div>
                <div class="topInfo">
                    <el-avatar :size="120" :src="avatarBlob==null?(userInfo.avatar==null?defaultAvatar:userInfo.avatar):avatarBlob"></el-avatar>
                    <div class="setAvatar">
                        <el-tooltip content="修改頭像">
                            <i @click="getFile" class="fa fa-camera"></i>
                        </el-tooltip>
                    </div>
                    <div class="username">{{userInfo.nickName}}</div>
                </div>
            </div>
        </header>
        <el-row justify="center">
            <el-col :lg="12" :xl="12" :md="18" :sm="20" :xs="20">
                <div class="userInfoBox">
                    <div class="headerOption">
                        <el-tooltip content="修改用戶基本信息,涉及賬號的修改請點擊底欄的操作按鈕">
                            <el-link @click="editUserInfo"><i class="fa fa-edit"></i></el-link>
                        </el-tooltip>
                    </div>
                    <ul>
                        <li>
                            <div class="userInfoTitle">用戶名:</div>
                            <div class="userInfoValue">{{userInfo.username}}</div>
                        </li>
                        <li>
                            <div class="userInfoTitle">郵箱:</div>
                            <div class="userInfoValue">{{userInfo.email}}</div>
                        </li>
                        <li>
                            <div class="userInfoTitle">昵稱:</div>
                            <div class="userInfoValue">{{userInfo.nickName}}</div>
                        </li>
                        <li>
                            <div class="userInfoTitle">性別:</div>
                            <div class="userInfoValue">{{userInfo.gender==3?'保密':(userInfo.gender==0?'男':'女')}}</div>
                        </li>
                        <li>
                            <div class="userInfoTitle">年齡:</div>
                            <div class="userInfoValue">{{userInfo.age}}</div>
                        </li>
                        <li>
                            <div class="userInfoTitle">生日:</div>
                            <div class="userInfoValue">{{userInfo.birthday}}</div>
                        </li>
                    </ul>
                </div>
            </el-col>
        </el-row>
        <div class="option">
            <el-button class="optionBtn" size="large" round><i class="fa fa-user"></i>用戶名修改</el-button>
            <el-button class="optionBtn" size="large" round><i class="fa fa-lock"></i>修改密碼</el-button>
            <el-button class="optionBtn" size="large" round><i class="fa fa-envelope"></i>修改郵箱</el-button>
            <el-button class="optionBtn" size="large" round><i class="fa fa-toggle-on"></i>激活郵箱</el-button>
            <el-button class="optionBtn" size="large" round><i class="fa fa-power-off"></i>注銷賬號</el-button>
        </div>
        <el-dialog title="基本信息" v-model="showUserInfoDialog">
            <el-form :model="userInfoForm">
                <el-form-item label="昵稱">
                    <el-input placeholder="請輸入昵稱" v-model="userInfoForm.nickName"></el-input>
                </el-form-item>
                <el-form-item label="性別">
                    <el-select v-model="userInfoForm.gender">
                        <el-option v-for="item in genders" :key="item.id" :label="item.genderName"
                            :value="item.genderCode"></el-option>
                    </el-select>
                </el-form-item>
                <el-form-item label="生日">
                    <el-date-picker v-model="userInfoForm.birthday" :locale="locale" placeholder="選擇出生日期"
                        value-format="yyyy-MM-dd"></el-date-picker>
                </el-form-item>
                <div class="submitBtn" >
                    <el-button @click="showUserInfoDialog=false" type="info">取消</el-button>
                    <el-button type="primary">確定</el-button>
                </div>
            </el-form>
        </el-dialog>
        <el-dialog title="頭像設置" v-model="showSetAvatarDialog">
            <div class="cropperBox">
                <vue-cropper ref="cropper" :canMoveBox="false" :img="avatarBase64" :fixedBox="true" :autoCrop="true"
                    autoCropWidth="200" autoCropHeight="200" outputType="png"></vue-cropper>
            </div>
            <div class="optionBtn">
                <el-button @click="rotateLeft"><i class="fa fa-rotate-left"></i>左旋轉</el-button>
                <el-button @click="rotateRight"><i class="fa fa-rotate-right"></i>右旋轉</el-button>
                <el-button @click="getPickAvatar" type="primary"><i class="fa fa-save"></i>保存</el-button>
            </div>
        </el-dialog>
    </div>
</template>
<script>
import { userInfoByRequest } from '../js/api'
import { VueCropper } from 'vue-cropper'
import 'vue-cropper/dist/index.css'
export default {
    components: {
        VueCropper
    },
    data() {
        return {
            userInfo: {},
            defaultAvatar: 'https://cube.elemecdn.com/9/c2/f0ee8a3c7c9638a54940382568c9dpng.png',
            userInfoForm: {},
            genders: [
                {
                    id: 1,
                    genderName: '男性',
                    genderCode: 0,
                },
                {
                    id: 2,
                    genderName: '女性',
                    genderCode: 1,
                },
                {
                    id: 3,
                    genderName: '保密',
                    genderCode: 3,
                }
            ],
            showUserInfoDialog: false,
            showSetAvatarDialog: false,
            avatarBase64:'',
            avatarBlob: null
        }
    },
    methods: {
        back() {
            this.$router.go(-1)
        },
        getUserInfo() {
            userInfoByRequest().then(res => {
                this.userInfo = res.data;
            })
        },
        editUserInfo() {
            this.userInfoForm.nickName = this.userInfo.nickName;
            this.userInfoForm.gender = this.userInfo.gender;
            this.userInfoForm.birthday = this.userInfo.birthday;
            this.showUserInfoDialog = true;
        },
        getPickAvatar() {
            this.$refs.cropper.getCropData(data => {
                this.avatarBlob = data
            })
            this.showSetAvatarDialog = false;
        },
        rotateLeft() {
            this.$refs.cropper.rotateLeft();
        },
        rotateRight() {
            this.$refs.cropper.rotateRight();
        },
        getFile() {
            let fileEle = document.getElementById('avatarFile')
            fileEle.click()
        },
        selectFile(e) {
            var file = e.target.files[0];
            var filesize = file.size;
            var filename = file.name;
            var reader = new FileReader();
            reader.readAsDataURL(file);
            reader.onload = (e) => {
                var imgcode = e.target.result;
                this.avatarBase64 = imgcode
                this.showSetAvatarDialog = true;
            }
        }
    },
    mounted() {
        this.getUserInfo();
    }
}
</script>
<style scoped>
.userCenter {
    display: flex;
    flex-direction: column;
    justify-content: center;
}

.username {
    color: #fff;
    font-weight: bold;
    font-size: 19px;
    padding: 0 10px;
}

header {
    text-align: center;
    padding: 10px;
    background-color: #333;

}

.topInfo {
    animation: userInfoCard 2s;
    -webkit-animation: userInfoCard 2s;
    /* Safari and Chrome */
}

.back {
    text-align: left;
    color: #fff;
    position: relative;
    left: 10px;
}

.back>i {
    cursor: pointer;
}

.userInfoBox {
    box-shadow: 2px 3px 10px #D3d7d4;
    margin-top: 20px;
    padding: 20px;
    background-color: #fff;
    font-size: 16px;
    text-align: center;
    border-radius: 4px;
    animation: userInfoCard 3s;
    -webkit-animation: userInfoCard 3s;
    /* Safari and Chrome */
}

.setAvatar {
    position: relative;
    top: -20px;
    font-size: 14px;
    color: #000;
    margin: -10px;
}

.setAvatar>i {
    cursor: pointer;
}

ul>li {
    display: flex;
    padding: 5px;
}

.userInfoTitle {
    font-weight: bold;
    width: 100px;
    text-align: right;
    padding-right: 10px;
}

.option {
    width: 100%;
    text-align: center;
    position: fixed;
    bottom: 20px;
    border: 1px solid gainsboro;
    padding: 10px;
}

.optionBtn {
    font-weight: bold;
    text-align: center;
    margin-top: 10px;
}

.headerOption {
    text-align: right;
}

@keyframes userInfoCard {
    from {
        opacity: 0;
    }

    to {
        opacity: 1;
    }
}

@-webkit-keyframes userInfoCard

/* Safari and Chrome */
    {
    from {
        opacity: 0;
    }

    to {
        opacity: 1;
    }
}

.cropperBox {
    width: 100%;
    height: 300px;
}
</style>

關于“Vue3中怎么實現選取頭像并裁剪”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

洮南市| 平顶山市| 安塞县| 南昌市| 苏尼特右旗| 台北县| 财经| 项城市| 东至县| 神池县| 佛坪县| 大石桥市| 华阴市| 扬中市| 鹤山市| 舟曲县| 通化市| 建阳市| 汨罗市| 通江县| 夏河县| 沙河市| 海城市| 敦化市| 孟津县| 星子县| 会同县| 连城县| 赣州市| 珲春市| 安丘市| 龙南县| 兴城市| 安宁市| 靖宇县| 同德县| 夏津县| 大名县| 怀远县| 安多县| 常山县|