我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Vue3中怎么实现选取头像并裁剪

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Vue3中怎么实现选取头像并裁剪

这篇文章主要介绍“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" :class="lazy" data-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;    }.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;    }.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    {    from {        opacity: 0;    }    to {        opacity: 1;    }}.cropperBox {    width: 100%;    height: 300px;}</style>

关于“Vue3中怎么实现选取头像并裁剪”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Vue3中怎么实现选取头像并裁剪

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Vue3中实现选取头像并裁剪

这篇文章主要详细介绍了在vue3中如何选取头像并裁剪,文章中有详细的代码示例,需要的朋友可以参考阅读
2023-05-15

Vue3中怎么实现选取头像并裁剪

这篇文章主要介绍“Vue3中怎么实现选取头像并裁剪”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue3中怎么实现选取头像并裁剪”文章能帮助大家解决问题。最终效果安装VueCropper组件yarn
2023-07-05

怎么用cropper.js和exif.js实现头像上传缩放裁剪旋转

本篇内容主要讲解“怎么用cropper.js和exif.js实现头像上传缩放裁剪旋转”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用cropper.js和exif.js实现头像上传缩放裁剪旋
2023-06-29

jQuery插件ImgAreaSelect怎么实现头像上传预览和裁剪功能

本文小编为大家详细介绍“jQuery插件ImgAreaSelect怎么实现头像上传预览和裁剪功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“jQuery插件ImgAreaSelect怎么实现头像上传预览和裁剪功能”文章能帮助大家解决疑惑
2023-06-04

Android实现从本地图库/相机拍照后裁剪图片并设置头像

玩qq或者是微信的盆友都知道,这些聊天工具里都要设置头像,一般情况下大家的解决办法是从本地图库选择图片或是从相机拍照,然后根据自己的喜爱截取图片。上述过程已经实现好了,最后一步我加上了把截取好的图片在保存到本地的操作,来保存头像。为了大家需
2022-06-06

HTML5中canvas实现移动端上传头像拖拽裁剪效果的方法

这篇文章主要介绍HTML5中canvas实现移动端上传头像拖拽裁剪效果的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!本示例使用HTML5 canvas,简单的编写了上传头像的裁剪效果,移动端支持拖拽后裁剪, 虽
2023-06-09

php+html5兼容手机端的图片选取裁剪上传怎么实现

本篇内容介绍了“php+html5兼容手机端的图片选取裁剪上传怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先放置一个上传按钮及相
2023-06-04

Flutter 中怎么实现一个裁剪类组件

Flutter 中怎么实现一个裁剪类组件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。ClipRectClipRect组件使用矩形裁剪子组件,通常情况下,ClipRect作用于
2023-06-04

Java中怎么实现一个图片剪裁功能

Java中怎么实现一个图片剪裁功能,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Listing1: 引入的类import java.awt.Graphics; impor
2023-06-17

怎么在Linux的命令行中实现裁剪图片

本篇内容介绍了“怎么在Linux的命令行中实现裁剪图片”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!当涉及到在Linux中转换或编辑图像文件
2023-06-13

thinkphp框架中的图片旋转裁剪功能怎么实现

这篇文章主要讲解了“thinkphp框架中的图片旋转裁剪功能怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“thinkphp框架中的图片旋转裁剪功能怎么实现”吧!第一步:安装think
2023-07-06

Javaweb怎么实现头像上传及读取显示

本篇内容主要讲解“Javaweb怎么实现头像上传及读取显示”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Javaweb怎么实现头像上传及读取显示”吧!思路:1.如果要上传头像并要显示的话,可以创
2023-07-02

gradio摄像头获取照片和视频怎么实现

这篇文章主要讲解了“gradio摄像头获取照片和视频怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“gradio摄像头获取照片和视频怎么实现”吧!1.环境设置1.1gradio安装需要
2023-07-05

python怎么实现调用摄像头并拍照发邮箱

这篇文章主要介绍了python怎么实现调用摄像头并拍照发邮箱,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。python的五大特点是什么python的五大特点:1.简单易学,开
2023-06-14

Electron怎么实现调用外接摄像头并拍照上传

这篇文章主要介绍了Electron怎么实现调用外接摄像头并拍照上传的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Electron怎么实现调用外接摄像头并拍照上传文章都会有所收获,下面我们一起来看看吧。背景基于E
2023-07-05

C#+EmguCV怎么实现使用摄像头读取、保存视频

这篇文章主要介绍“C#+EmguCV怎么实现使用摄像头读取、保存视频”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#+EmguCV怎么实现使用摄像头读取、保存视频”文章能帮助大家解决问题。在Emg
2023-06-29

怎么在Android中实现摄像头高斯模糊

怎么在Android中实现摄像头高斯模糊?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。核心代码:public Bitmap blur
2023-05-30

js怎么利用FileReader实现图片转base64格式并上传预览头像

今天小编给大家分享一下js怎么利用FileReader实现图片转base64格式并上传预览头像的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一
2023-06-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录