vue3使用iframe全屏展示pdf效果

server/2025/2/28 16:42:14/

最近的一个功能是编写一个pdf展示的组件,外部传入pdf的链接,根据这个功能,可以使用iframe去展示pdf,目前主要是将预览pdf的样式调整成与屏幕宽高一样
1.pdf使用iframe
2.使用translate将这个组件,使用to属性将目标元素传到body中(to就是目标元素。 接收一个 to prop 来指定传送的目标。
3.显示,隐藏的动画效果可以使用transition组件对iframe进行包裹
具体代码如下:

<template><!-- 使用 teleport 将遮罩层和 iframe 渲染到 body 中 --><teleport to="body"><!-- 遮罩层动画 --><transition name="fade"><div v-if="showOverlay" class="overlay"><!-- 取消按钮 --><button class="close-button" @click="closeOverlay">取消</button></div></transition><!-- iframe 动画 --><transition name="scale"><iframev-if="showOverlay && pdfUrl":src="pdfUrl"width="100%"height="100%"frameborder="0"class="pdf-iframe"></iframe></transition></teleport>
</template><script setup>
import { ref, watch } from 'vue';// 定义 props
const props = defineProps({pdfUrl: {type: String,required: true,},show: {type: Boolean,required: true,},
});// 定义 emits
const emit = defineEmits(['close']);// 响应式数据
const showOverlay = ref(props.show);// 监听 props.show 的变化
watch(() => props.show,(newVal) => {showOverlay.value = newVal;}
);// 关闭遮罩的方法
const closeOverlay = () => {showOverlay.value = false;emit('close'); // 通知父组件关闭
};
</script><style scoped>
/* 遮罩层样式 */
.overlay {position: fixed;top: 0;left: 0;width: 100%;height: 100%;background-color: rgba(0, 0, 0, 0.5); /* 半透明黑色遮罩 */z-index: 1000; /* 确保遮罩层在最上层 */display: flex;justify-content: center;align-items: center;
}/* 取消按钮样式 */
.close-button {position: absolute;top: 20px;right: 20px;padding: 10px 20px;background-color: #ff4d4f; /* 红色背景 */color: white;border: none;border-radius: 5px;cursor: pointer;font-size: 16px;
}.close-button:hover {background-color: #ff7875; /* 鼠标悬停时的颜色 */
}/* iframe 样式 */
.pdf-iframe {position: fixed;top: 50%;left: 50%;transform: translate(-50%, -50%);width: 80%;height: 80%;z-index: 1001; /* iframe 在遮罩层之上 */background-color: white;border-radius: 8px;box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
}/* 遮罩层淡入淡出动画 */
.fade-enter-active,
.fade-leave-active {transition: opacity 0.3s ease;
}.fade-enter-from,
.fade-leave-to {opacity: 0;
}/* iframe 缩放动画 */
.scale-enter-active,
.scale-leave-active {transition: all 0.3s ease;
}.scale-enter-from,
.scale-leave-to {opacity: 0;transform: translate(-50%, -50%) scale(0.8);
}
</style>

如果在父组件使用,如下代码

<template><div><!-- 打开 PDF 的按钮 --><button @click="openPdf">打开 PDF</button><!-- 使用 PdfViewer 组件 --><PdfViewer:pdfUrl="pdfUrl":show="showPdfViewer"@close="closePdfViewer"/></div>
</template><script setup>
import { ref } from 'vue';
import PdfViewer from './components/PdfViewer.vue'; // 引入 PdfViewer 组件// 定义响应式数据
const pdfUrl = ref('');
const showPdfViewer = ref(false);// 打开 PDF 的方法
const openPdf = () => {pdfUrl.value = '/path/to/your/pdf/file.pdf'; // 可以是本地或远程 PDF 文件路径showPdfViewer.value = true;
};// 关闭 PDF 的方法
const closePdfViewer = () => {showPdfViewer.value = false;pdfUrl.value = '';
};
</script><style>
/* 父组件的样式 */
</style>

http://www.ppmy.cn/server/171331.html

相关文章

一周学会Flask3 Python Web开发-Jinja2模板继承和include标签使用

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 不管是开发网站还是后台管理系统&#xff0c;我们页面里多多少少有公共的模块。比如博客网站&#xff0c;就有公共的头部&…

Linux上用C++和GCC开发程序实现不同PostgreSQL实例下单个数据库的多个Schema之间的稳定高效的数据迁移

设计一个在Linux上运行的GCC C程序&#xff0c;同时连接两个不同的PostgreSQL实例&#xff0c;两个实例中分别有一个数据库的多个Schema的表结构完全相同&#xff0c;复制一个实例中一个数据库的多个Schema里的所有表的数据到另一个实例中一个数据库的多个Schema里&#xff0c;…

BUG日志:使用热点或免费加速器时git链接github出现端口22拒绝访问的解决方法

问题描述 现象&#xff1a;git 连接 GitHub 时&#xff0c;报错 Connection refused on port 22。触发条件&#xff1a; 使用移动热点或免费加速器时必现。使用正常 Wi-Fi 时不出现。 解决步骤 临时切换为 HTTPS 协议&#xff08;绕过 22 端口&#xff09;&#xff1a; git r…

波导阵列天线 学习笔记11双极化全金属垂直公共馈电平板波导槽阵列天线

摘要&#xff1a; 本communicaition提出了一种双极化全金属垂直公共馈电平板波导槽阵列天线。最初提出了一种公共馈电的单层槽平板波导来实现双极化阵列。此设计消除了传统背腔公共馈电的复杂腔体边缘的必要性&#xff0c;提供了一种更简单的天线结构。在2x2子阵列种发展了宽十…

推荐一款uniapp的日历插件魔改版可显示阳历阴历农历公历

上图&#xff1a; 1.下载 https://download.csdn.net/download/ktucms/90436225 2.调用,解压后&#xff0c;放到根目录就行了。 js js methds: et_rlbox_clear:function () {var thatthis;that.pdata.datestr_start"";that.pdata.datestr_end"";},et_ch…

C#与AI的交互(以DeepSeek为例)

C#与ai的交互 与AI的交互使用的Http请求的方式&#xff0c;通过发送请求&#xff0c;服务器响应ai生成的文本 下面是完整的代码&#xff0c;我这里使用的是Ollama本地部署的deepseek&#xff0c;在联网调用api时&#xff0c;则url会有不同 public class OllamaRequester {[Se…

PyTorch-基础(CUDA、Dataset、transforms、卷积神经网络、VGG16)

PyTorch-基础 环境准备 CUDA Toolkit安装&#xff08;核显跳过此步骤&#xff09; CUDA Toolkit是NVIDIA的开发工具&#xff0c;里面提供了各种工具、如编译器、调试器和库 首先通过NVIDIA控制面板查看本机显卡驱动对应的CUDA版本&#xff0c;如何去下载对应版本的Toolkit工…

Vue03

Vue03 注&#xff1a;为Vue实例添加属性&#xff0c;写法如下 methods:{ addSex(){ Vue.set(this.student,"sex",男) } }Vue监视数据原理&#xff1a; vue会监视data中所有层次的数据 如何监测对象中的数据 通过setter实现监视&#xff0c;且要在ne…