Vue3鼠标悬浮个人头像时出现修改头像,点击出现弹框,上传头像使用cropperjs可裁剪预览

实现效果:

鼠标悬浮到头像上,下方出现修改头像

点击修改头像出现弹框,弹框中可上传头像,并支持头像的裁剪及预览

 

实现方式: 

1.tempalte中

<div class="img-box"><img v-if="avatarImgUrl" :src="avatarImgUrl" class="avatar" /><div class="text" @click="toFixImg()">修改头像</div></div>

注意:用服务端做渲染的同学v-if="avatarImgUrl"必须添加,不然会因水合作用图片出现问题。

<el-dialogv-model="dialogVisible"title="修改图片"width="700"@close="cancelFixAvatar":close-on-click-modal="false"><inputtype="file"accept="image/*"@change="onFileChange"id="myFileInput"style="display: none"ref="fileInput"/><!-- 触发文件选择的按钮 --><button type="button" class="change-img" @click="triggerFileInput">选择图片</button><!-- 图片裁剪区域 --><div v-if="imageUrl" class="cropper-img"><vue-cropper:key="imageKey"ref="cropper":src="imageUrl"style="width: 300px; height: 300px":options="cropperOptions"/><div @click="cropImage" class="confirm-btn">点击预览</div><!-- 显示裁剪后的图片(可选) --><div v-if="croppedImageUrl" class="cropped"><img:src="croppedImageUrl"alt="Cropped Image"style="width: 200px; height: 200px; border-radius: 50%"/></div></div><template #footer><div class="dialog-footer"><el-button @click="cancelFixAvatar">取消</el-button><el-button type="primary" @click="fixAvatar"> 确定 </el-button></div></template></el-dialog>

以上为点击修改头像出现的弹框,实现裁剪图片主要使用的是cropperjs插件,需先安装此插件。

npm install cropperjs --save

2.script中 

引入相关文件及定义变量

import 'cropperjs/dist/cropper.css';
import VueCropper from 'vue-cropperjs';
const dialogVisible = ref(false);
const avatarImgUrl = ref('');
const imageUrl = ref('');
const croppedImageUrl = ref('');
const cropperOptions = ref({aspectRatio: 1, // 设置裁剪框的比例viewMode: 1, // 限制图片的拖动范围// ...其他选项
});
const token = ref('');
const croppedImg = ref('');
const imageKey = ref(0); // 使用 key 来强制重新渲染
const cropper = ref(null);

定义使用的相关方法


// 点击“修改头像”
const toFixImg = () => {dialogVisible.value = true;nextTick(() => {document.getElementById('myFileInput').addEventListener('change', onFileChange);});
};// 监听上传的头像变化
const onFileChange = (e) => {const file = e.target.files[0];if (!file) return;const reader = new FileReader();reader.onload = (e) => {imageUrl.value = e.target.result;imageKey.value += 1;};reader.readAsDataURL(file);
};
// 再次点击“选择图片”替换
const triggerFileInput = () => {fileInput.value.click();
};
// 裁剪图片
const cropImage = () => {cropper.value.getCroppedCanvas().toBlob((blob) => {croppedImageUrl.value = URL.createObjectURL(blob);let file = new File([blob], 'test.png', { type: blob.type });// 这里添加将blob发送到服务器的逻辑,根据个人情况,此处调用的后端接口const formData = new FormData();formData.append('files', file);formData.append('folder', 'avatarArr');let uploadFileRequest = new Request(config.public.baseUrl +'xxxx',{method: 'post',headers: {Authorization: token.value,},body: formData,},);fetch(uploadFileRequest).then((response) => {let result = response.text();result.then((res) => {const resdata = JSON.parse(res);if (resdata.code == 200) {croppedImg.value = resdata.data[0].fileAddr;}});});}, 'image/jpeg');
};
// 修改头像弹框的确定按钮
const fixAvatar = () => {if (!croppedImg.value || croppedImg.value == '') {ElMessage({message: '请预览效果后点击保存',type: 'warning',customClass: 'mzindex',});return;}
// 此处调用后端提供的保存接口};
// 修改弹框的取消按钮
const cancelFixAvatar = () => {imageUrl.value = '';croppedImageUrl.value = '';imageKey.value = 0;dialogVisible.value = false;
};// 监听头像的改变
watch(() => store.fetchImage(),(newVal) => {if (newVal) {avatarImgUrl.value = `${config.public.baseUrl}/digit-trade-platform-system/file/${newVal}`;}},{ immediate: true },{ deep: true },
);

3.style中

.img-box {position: relative;display: inline-block;width: 100px; /* 或者你需要的大小 */height: 100px; /* 和宽度相同,形成圆形 */.avatar {width: 100%;height: 100%;object-fit: cover;border-radius: 50%;cursor: pointer;}.icon{position: absolute;bottom: 0;right: 0;}.text {position: absolute;bottom: 0; /* 文本定位在底部 */left: 50%; /* 水平居中 */width: 60%;padding: 5px 0;transform: translateX(-50%); /* 文本水平居中 */background-color: rgba(0, 0, 0, 0.5); /* 半透明背景 */color: white;text-align: center;border-radius: 0 0 50% 50% / 50%; /* 底部平直的圆角 */opacity: 0;transition: opacity 0.3s ease; /* 添加过渡效果 */font-size: 11px;cursor: pointer;}/* 鼠标悬浮在头像上时显示文本 */.avatar:hover + .text,.text:hover {opacity: 1; /* 鼠标悬浮时显示文本 */}}.change-img {background-color: $mainColor; /* Green */border: none;color: white;text-align: center;text-decoration: none;display: inline-block;font-size: 16px;margin: 4px 2px;cursor: pointer;border-radius: 4px;width: 100px;height: 40px;line-height: 40px;}.cropper-img {width: 100%;margin: 20px 0;display: flex;.confirm-btn {margin: 140px 20px 0 20px;width: 100px;height: 36px;background-color: $mainColor;color: #fff;text-align: center;line-height: 36px;border-radius: 4px;cursor: pointer;}.cropped {margin-top: 60px;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/29695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见的网络设备

引入 园区网络安全部署场景 1、路由器&#xff1a; 跨网段通信设备 。 2、交换机&#xff1a; 同网段或跨网段通信设备。 3、AntiDDoS &#xff1a; DDoS 防御系统&#xff0c;通常旁挂部署于网络出口处&#xff0c; 位于防火墙上游&#xff0c;用于减轻防火墙报文处理负担。 …

CENTOS7.9下服务器双网卡bond模式6配置示例

​1.bond口的特点 bond口通过将多个网口进行聚合&#xff0c;多个网口聚合后一方面实现了大带宽传输&#xff0c;另外多网口聚合后也同时具有冗余特性&#xff0c;当其中一个网口down掉后&#xff0c;其他网口会继续转发流量&#xff0c;不会导致流量中断。 2.使用条件 当环境…

CAD二次开发(10)-单行文字的添加+图形修改

1. 单行文字的添加 第一步&#xff1a; 首先在CAD中新增中文样式 输入ST命令&#xff1a; 第二步&#xff1a;代码开发 /// <summary>/// 添加文本信息/// </summary>[CommandMethod("AddText")]public void AddText(){var doc Application.DocumentM…

全氟己酮自动灭火材料表现亮眼!手把手教你自动灭火毯的使用方法

灭火毯的使用方法是什么&#xff1f;很多朋友在购买灭火毯之前&#xff0c;都比较关心这个问题。在这里&#xff0c;我们可以把灭火毯分为两种。一种是传统灭火毯&#xff0c;还有一种是近年来兴起的高科技产品—全氟己酮自动灭火毯。这两种灭火毯的使用方法大有不同&#xff0…

[算法刷题—二分法]寻找插入位置

题目展示: 本道题本身并不是很难,主要是学习和分析二分查找插入位置的方法。 首先大体上分为两种情况: 一.target在待查找的数组之中,返回对应值的下标索引。 二.target不在待查找的数组之中&#xff0c;需要返回target插入位置的索引(原数组有序) 第一种情况不难&#xff…

WordPress 站点 Wp-Login.Php 登录页面,防止被机器扫描爆破终极方法

最近好像不少的 WordPress 站点又迎来了一波疯狂的 wp-login.php 登录页面暴力破解,明月使用的 Dragon 主题也迅速的做出了安全防范响应,第一时间就增强了代码上的安全防御能力。明月代运维的几个站点也在这方面加强了防范措施,基本上实现了永久解决这一顽疾的目标,今天明月…

基于minhook的Windows HOOK

MinHook是一个基于微软Detours技术的可移植Hook库&#xff0c;它允许开发者在运行时更改函数定义&#xff0c;而无需修改原始函数代码。以下是关于MinHook的详细介绍&#xff1a; 基本概念 定义&#xff1a;MinHook使用内存污染和跳转技术来实现Hook&#xff0c;使得开发者能…

视频汇聚安防综合管理平台EasyCVR支持GA/T 1400视图库标准及设备接入配置

一、概述 视频汇聚安防综合管理平台EasyCVR视频监控系统已经与公安部GA/T 1400视图库标准协议实现了对接&#xff0c;即《公安视频图像信息应用系统》。 安防监控系统EasyCVR支持采用GA/T 1400进行对接&#xff0c;可实现人脸数据使用的标准化、合规化。其采用统一接口对接雪…

分布式技术导论 — 探索分析从起源到现今的巅峰之旅(流式处理到微批处理)

探索分析从起源到现今的巅峰之旅 流式计算回顾流式服务结合分布式特性 流式计算组成部分监控数据处理进度流式分析案例流转数据的衍生存储确认器采取高效策略确认器异常应对策略工作节点故障的处理&#xff08;精确一次处理&#xff09;确认器故障的处理&#xff08;恰好一次处…

【PPT教程】一键重置幻灯片背景的方法,新建幻灯片带默认背景

目的是替换18届的研电赛ppt背景为19届 这里写目录标题 1.设计->设置背景格式2.图片或纹理填充->插入3.选择需要替换为背景的照片4.点击下方的应用到全部 1.设计->设置背景格式 2.图片或纹理填充->插入 3.选择需要替换为背景的照片 4.点击下方的应用到全部 此时全部…

Google推出开源代码大模型CodeGemma:AI编程新纪元,代码自动完成和生成技术再升级

论文标题: CodeGemma: Open Code Models Based on Gemma机构: Google LLC论文链接: https://arxiv.org/pdf/2406.11409.pdf CodeGemma模型概述 CodeGemma是基于Google DeepMind的Gemma模型系列&#xff08;Gemma Team et al., 2024&#xff09;开发的一系列开放代码模型。这些…

Flutter - Material3适配

demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新&#xff0c;请前往github查看最新代码 Flutter - Material3适配 对比图具体实现一些组件的变化 代码实现Material2的ThemeDataMaterial3的ThemeData Material3适配官方文档 flutter SDK升级到3.16.0之后 …

AI在线免费视频工具2:视频配声音

1、视频配声音 https://deepmind.google/discover/blog/generating-audio-for-video/ https://www.videotosoundeffects.com/ &#xff08;免费在线使用&#xff09;

企业内网是如何禁用U盘的?电脑禁用U盘有哪些方法?

在当今企业环境中&#xff0c;数据安全和信息保护至关重要。 为了防止数据泄露和恶意软件传播&#xff0c;很多企业选择在内网中禁用U盘&#xff0c;以控制数据的物理传输。 小编这就来给大家总结一份详细指南&#xff01;&#xff01; 关于企业内网如何禁用U盘的指南&#x…

mysql分析常用锁

这里写自定义目录标题 1.未提交事物&#xff0c;阻塞DDL&#xff0c;继而阻塞所有同表的后续操作,查看未提交事务的进程2.存着正在进行的线程数据。3.根据processlist表中的id杀掉未释放的线程4.查看正在使用的表5.mysql为什么state会有waiting for handler commit6.什么情况导…

【Spring Cloud应用框架】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

异步爬虫:aiohttp 异步请求库使用:

使用requests 请求库虽然可以完成爬虫业务&#xff0c;但是对于异步任务来说&#xff0c;它是做不到的&#xff0c; 这时候我们需要借助 aiohttp 异步请求库来完成异步爬虫的编写&#xff1a; 话不多说&#xff0c;直接看示例&#xff1a; 注意&#xff1a;楼主使用的python版…

还在为找不到工作发愁?来看看嵌入式行业

嵌入式系统的就业方向非常广泛&#xff0c;涵盖了许多不同的行业和领域。以下是一些常见的嵌入式系统就业方向&#xff1a; 消费电子产品&#xff1a;这包括智能手机、平板电脑、智能电视、智能家居设备等。嵌入式系统工程师可以参与设计、开发和测试这些产品的硬件和软件。 汽…

超简洁的待办事项自托管便签todo

什么是todo todo 是一个自托管的 todo web 应用程序&#xff0c;可让您以简单且最少的方式跟踪您的 todo。 搭建 使用Docker命令行方式进行搭建 docker run -d -p 8000:8000 -v todo_db:/usr/local/go/src/todo/todo.db prologic/todo Docker-compose.yml version: 3 ​ se…

工程项目全生命周期管理系统企智汇一站式解决方案!

在当今竞争激烈的工程行业&#xff0c;实现工程项目的全生命周期管理已成为企业提升效率、降低成本、确保质量并赢得市场竞争的关键。企智汇的工程项目管理系统解决方案致力于助力工程企业实现全面、精细化的项目全生命周期管理&#xff0c;确保从项目启动到竣工交付的每一个环…