当前位置: 首页 > news >正文

vue3 + antd实现简单的图片点开可以缩小放大查看

通过ref传参src打开弹窗

点击图片放大


<imgv-if="getFileType(record[column.key]) === '图片'":src="`${defaultBaseURL + record[column.key]}`"class="img-style"@click="handleImgClick(`${defaultBaseURL + record[column.key]}`)"/>// 点击打开图片
function handleImgClick(imgUrl: string) {showImgRef.value.openModel(imgUrl);
}// 引用图片展示组件
<ModelShowImg ref="showImgRef" />

图片展示组件代码

<script lang="ts" setup>
import { ref } from 'vue';import { CloseOutlined } from '@ant-design/icons-vue';const open = ref(false);
const showImg = ref('');
const x = ref(0);
const y = ref(0);
const startx = ref(0);
const starty = ref(0);
const endx = ref(0);
const endy = ref(0);
const height = ref(800);
function closeImg() {showImg.value = '';open.value = false;x.value = 0;y.value = 0;startx.value = 0;starty.value = 0;endx.value = 0;endy.value = 0;height.value = 800;
}
function changeImg(e: any) {if (e.deltaY < 0) {height.value += 80;} else {if (height.value > 80) {height.value -= 80;}}
}
function mousedown(e: any) {startx.value = e.pageX;starty.value = e.pageY;document.addEventListener('mousemove', mousemove);document.querySelector('#imgId')?.addEventListener('mouseup', mouseup);
}
function mousemove(e: any) {x.value = e.pageX - startx.value + endx.value;y.value = e.pageY - starty.value + endy.value;
}
function mouseup() {// 解除绑定mousemovedocument.removeEventListener('mousemove', mousemove, false);endx.value = x.value;endy.value = y.value;
}
function openModel(imgUrl: string) {showImg.value = imgUrl;open.value = true;
}
// 暴露方法给父组件调用
defineExpose({ openModel });
</script>
<template><a-modalv-model:open="open":centered="true":closable="false":footer="null":mask-closable="false"width="100%"wrap-class-name="dialogModalBox"@cancel="closeImg"><imgv-if="showImg"id="imgId":src="showImg":style="{ transform: `translate(${x}px,${y}px)`, height: `${height}px` }"draggable="false"@mousedown="mousedown($event)"@mousewheel="changeImg($event)"/><CloseOutlined class="close" @click="closeImg" /></a-modal>
</template>
<style lang="less">
.dialogModalBox {.ant-modal .ant-modal-content {padding: 0;background-color: rgba(0, 0, 0, 0);display: flex;justify-content: center; /* 水平居中 */align-items: center; /* 垂直居中 */height: 100vh;}
}
.close {position: fixed;right: 30px;top: 30px;color: white;font-size: 32px;
}
</style>

效果:点击图片按下可以拖拽,滚轮可以放大缩小图片,右上角X按钮关闭

http://www.lryc.cn/news/624858.html

相关文章:

  • 视觉语言导航(4)——强化学习的三种方法 与 优化算法 2.43.4
  • BeeWorks 私有化会议系统:筑牢企业会议安全防线,赋能高效协同
  • Go并发编程-goroutine
  • 私有化部署本地大模型+function Calling+本地数据库
  • 【秋招笔试】2025.08.17字节跳动秋招机考真题
  • 技术赋能安全:智慧工地构建城市建设新防线
  • IB数学课程知识点有哪些?IB数学课程辅导机构怎么选?
  • [系统架构设计师]未来信息综合技术(十一)
  • 【秋招笔试】2025.08.17大疆秋招机考第一套
  • C++ STL容器相关操作的复杂度分析
  • FPGA驱动量子革命:微美全息(NASDAQ:WIMI)实现数字量子计算关键验证
  • 认证授权系统设计
  • redis-集成prometheus监控(k8s)
  • 【K8s】harbor安装与推送镜像
  • 中断线程化
  • 虚幻基础:动作时间窗
  • 徕芬的冰火两重天:增长困局,转型阵痛还是衰落前奏?
  • SQL注入防御
  • 【168页PPT】IBM五粮液集团数字化转型项目实施方案建议书(附下载方式)
  • 力扣2道dp
  • Dijkstra和多层图 0
  • [NSSCTF 2022 Spring Recruit]rrrsssaaa
  • 决策树学习报告
  • 决策树简单实战
  • 容器化 Android 开发效率:cpolar 内网穿透服务优化远程协作流程
  • 【Langchain系列三】GraphGPT——LangChain+NebulaGraph+llm构建智能图数据库问答系统
  • Swift + Xcode 开发环境搭建终极指南
  • 一个月内快速掌握蓝牙原理与应用的全面学习规划
  • 104、【OS】【Nuttx】【周边】文档构建渲染:安装 Sphinx 扩展(上)
  • Day7--滑动窗口与双指针--1695. 删除子数组的最大得分,2958. 最多 K 个重复元素的最长子数组,2024. 考试的最大困扰度