ホームページ  >  記事  >  ウェブフロントエンド  >  Vue3 でアバターを選択してトリミングする方法

Vue3 でアバターを選択してトリミングする方法

WBOY
WBOY転載
2023-05-29 10:22:491291ブラウズ

最終効果

Vue3 でアバターを選択してトリミングする方法

VueCropper コンポーネントをインストールします

yarn add vue-cropper@next

上記のインストール値は Vue3 用です。Vue2 の場合、または他の方法を使用して参照してください。公式 npm アドレス: 公式チュートリアルにアクセスしてください。

コンポーネント内での参照

使用方法も非常に簡単です。対応するコンポーネントとそのスタイル ファイルを導入するだけです。ここではグローバルに参照しません。コンポーネント内に導入するだけです。 file

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

次に、<vue-cropper></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>

ここでは、ダイアログ ポップアップ ボックスに配置しています。このポップアップ ボックスは、画像を選択するとポップアップします。
そのプロパティの一部については、公式チュートリアルの詳細な説明を参照してください。上記で使用されるプロパティの意味:

  • canMoveBox: スクリーンショット ボックスを移動できるかどうか、デフォルトは「yes」ですが、画像は移動してスクリーンショットボックスは移動しないようにするため、「false」に設定しました。

  • img: 画像ソース。画像 URL または Base64 データにすることができます。

  • fixedBox: スクリーンショット ボックスのサイズを変更することはできません。デフォルトでは許可されています。長さと幅が固定された正方形が必要なので、ここでは true に設定します。

  • autoCrop: デフォルトでスクリーンショット ボックスを生成するかどうか。ここで true に設定します。

  • autoCropWidth: スクリーンショット ボックスのデフォルトの幅を自動的に生成します。

  • autoCropHeight: 自動的に生成されるスクリーンショット フレームのデフォルトの高さ

  • ##outputType: 出力画像の形式。ここでは png に設定します。 format

画像のコンテンツを取得する

次のメソッドを使用して、組み込みメソッドを使用してインターセプトされた画像のコンテンツを取得します

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

その他の組み込みメソッドについては、公式チュートリアルの詳細な説明を参照してください。

アップロードした写真をカスタマイズする

スクリーンショット コンポーネントが利用可能になりました。次に、画像を選択し、フロント エンドを通じてそれを Base64 に変換し、選択用のスクリーンショット コンポーネントをポップアップする必要があります。ネイティブ入力タグを使用し、タイプはファイルですが、ネイティブ スタイルは私たちが望むものではありません。デモでは、小さなカメラ アイコンをクリックして画像を選択しました。実装プロセスは次のとおりです:

  1. 最初に隠し属性を に追加して非表示にします

  2. #次に、カメラ アイコンがクリックされたときに、入力をクリックするイベントが js
  3. # を通じて実装されます。

    ##input タグで変更イベントを定義し、画像を Base64 に変換するロジックに進みます
  4. ##次に、変換されたデータをグローバル変数に設定します

  5. 完全なコード実装

    UserCenter .vue
  6. <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?&#39;保密&#39;:(userInfo.gender==0?&#39;男&#39;:&#39;女&#39;)}}</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 &#39;../js/api&#39;
    import { VueCropper } from &#39;vue-cropper&#39;
    import &#39;vue-cropper/dist/index.css&#39;
    export default {
        components: {
            VueCropper
        },
        data() {
            return {
                userInfo: {},
                defaultAvatar: &#39;https://cube.elemecdn.com/9/c2/f0ee8a3c7c9638a54940382568c9dpng.png&#39;,
                userInfoForm: {},
                genders: [
                    {
                        id: 1,
                        genderName: &#39;男性&#39;,
                        genderCode: 0,
                    },
                    {
                        id: 2,
                        genderName: &#39;女性&#39;,
                        genderCode: 1,
                    },
                    {
                        id: 3,
                        genderName: &#39;保密&#39;,
                        genderCode: 3,
                    }
                ],
                showUserInfoDialog: false,
                showSetAvatarDialog: false,
                avatarBase64:&#39;&#39;,
                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(&#39;avatarFile&#39;)
                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 でアバターを選択してトリミングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。