vue项目开发记录1:为v-html内的img元素添加点击放大效果

本文主要是介绍vue项目开发记录1:为v-html内的img元素添加点击放大效果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目需求:在页面上显示帖子,帖子内的数据来源于后端,形式是"<p>内容</p>"这样的字符串。其中,要为所有的img元素添加一个点击之后看全图的功能,研究了一下,实现方案如下。

1. 基础内容,实现了帖子的显示
<template><div><div v-for="post in posts" :id="post.id"><p>{{ post.author }}</p><p>{{ post.create_time }}</p><div class="content" v-html="post.content"></div></div></div>
</template>
<script setup>
import { ref, onMounted } from 'vue';
import { getPost } from '@/api/index";const posts = ref([])
onMounted(() => {getData();
})
const getData = () => {getPost().then((res) => {posts.value = res.data;}).catch(err => {});
}
</script>
<style scoped>
.content >>> img {max-width: 500px;
}
</style>
2. 在finally中获取dom节点

由于要为img元素添加点击事件,起初我的想法是,用replaceAll函数手动给img添加@click或onclick事件,将字符串变成<img οnclick="test" src="/pictures/01.png" />这样的形式,后来发现不行,添加@click浏览器无法识别,添加onclick,浏览器也无法获取写在vue文件中的test函数,必须要对dom节点进行操作。

网上的写法都是在onMounted中通过ref获取对应节点,但是因为项目逻辑是在onMounted中调用api接口访问后端,所以必须要等到数据回来之后再去访问节点,才能获取对应的内容。

这时候就可以用到finally。在异步操作中,then, catch, finally是一组,finally内的内容在then和catch执行后执行,非常符合当前的场景。

const getData = () => {getPost().then((res) => {posts.value = res.data;}).catch(err => {console.log(err);}).finally(() => {const elements = document.querySelectorAll('.content img'); // 获取所有img节点elements.forEach(item => item.addEventListener('click', handleClick);});
}
3. 添加弹窗

本来想使用ant-design中的Modal实现图片放大后的弹窗,但是默认的样式和需求差得太远,所以自己写了个。其中还有个小插曲,因为这个组件外部还有内容,所以将.modal_mask的样式写为position:absolute;的时候,并没有达到全屏的效果,只是占满了外部组件的全部,所以要写成position:fixed;

<template><div>...<div v-show="showModal" class="modal_mask"><div class="close_btn" @click="showModal=false"><img src="@/assets/pictures/close.png" /></div><img :src="imgsrc" /></div>
</template>
<script setup>
...const showModal = ref(false); //控制弹窗显示隐藏
const imgsrc = ref('');
...
const handleClick = (event) => {showModal.value = true;imgsrc.value = event.target.src; //必须要通过传来的event获取图片src
}
</script>
<style scoped>
.modal_mask {position: fixed;left: 0;right: 0;top: 0;bottom: 0;background-color: rgba(0, 0, 0, 0.45);z-index: 9999;display: flex;align-items: center;justify-content: center;
}
.modal_mask .close_btn {position: absolute;right: 10px;top: 10px;cursor: pointer;
}
.modal_mask img {max-width: 100%;max-height: 100%;
}
</style>

这篇关于vue项目开发记录1:为v-html内的img元素添加点击放大效果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092365

相关文章

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr