Vue3.5 企业级管理系统实战(十一):全屏切换组件

news/2025/4/1 4:30:00/

本篇主要探讨如何在导航栏(Navbar)中添加全屏切换按钮,并借助功能强大的 screenfull 插件,丝滑实现全屏切换功能,为用户打造更为便捷、流畅的交互体验。

1 安装插件 screenfull

screenfull 是一个轻量级的 JavaScript 库,用于简化在网页中实现全屏功能的操作。它屏蔽了不同浏览器在全屏 API 上的差异,提供统一且易用的接口,增强了跨浏览器兼容性。

 

使用时,首先通过 npm 或 yarn 安装该插件。其核心方法包括:request 用于请求指定元素进入全屏;exit 用于退出全屏;toggle 用于切换全屏状态。

例如,若要让 id 为 myDiv 的元素进入全屏,只需检查 screenfull.isEnabled 为 true 后,调用 screenfull.request(document.getElementById('myDiv')) 即可。此外,还能监听 change 事件,根据全屏状态变化执行相应逻辑。

通过 pnpm 安装 screenfull 插件,代码如下:

pnpm install screenfull

2 Screenfull 组件开发

在 src/components 下新建 Screenfull 文件夹,新建 index.vue 文件,代码如下:

//src/components/Screenfull/index.vue
<template><!-- 定义一个 SVG 图标组件,用于切换全屏状态 --><svg-icon@click="handleClick"custom-class="w-2em h-2em":icon-name="isFullScreen? 'ant-design:fullscreen-exit-outlined': 'ant-design:fullscreen-outlined'"></svg-icon>
</template><script lang="ts" setup>
// 引入 screenfull 库,用于处理全屏相关操作
import screenfull from "screenfull";
// 引入 Vue 的 ref 函数,用于创建响应式数据
import { ref, onMounted, onBeforeUnmount, getCurrentInstance } from "vue";// 创建一个响应式变量 isFullScreen,用于记录当前是否处于全屏状态,初始值为 false
const isFullScreen = ref(false);
// 获取当前组件实例
const { proxy } = getCurrentInstance()!;// 定义点击事件处理函数,用于处理图标点击时的操作
function handleClick() {// 检查浏览器是否支持全屏功能if (screenfull.isEnabled) {// 如果支持,切换全屏状态screenfull.toggle();} else {// 如果不支持,通过消息提示告知用户浏览器不支持全屏proxy!.$message("浏览器不支持全屏");}
}// 定义更新全屏状态的函数,用于监听全屏状态变化并更新 isFullScreen 的值
function updateFullscreenStatus() {// 获取当前是否处于全屏状态,并更新 isFullScreen 的值isFullScreen.value = screenfull.isFullscreen;
}// 组件挂载完成后执行的生命周期钩子函数
onMounted(() => {// 检查浏览器是否支持全屏功能if (screenfull.isEnabled) {// 如果支持,监听全屏状态变化事件,并在状态变化时调用 updateFullscreenStatus 函数screenfull.on("change", updateFullscreenStatus);}
});// 组件即将卸载前执行的生命周期钩子函数
onBeforeUnmount(() => {// 检查浏览器是否支持全屏功能if (screenfull.isEnabled) {// 如果支持,移除对全屏状态变化事件的监听screenfull.off("change", updateFullscreenStatus);}
});
</script>

这段代码实现了一个切换全屏状态的功能,通过点击 SVG 图标来切换全屏和退出全屏,同时会根据当前的全屏状态显示不同的图标。并且在组件挂载和卸载时,分别添加和移除对全屏状态变化的监听。  

3 页面引用

在 src/layout/components/Navbar.vue 中引入 Screenfull 组件,代码如下:

//src/layout/components/Navbar.vue
<template><div class="navbar" flex><hamburger@toggleCollapse="toggleSidebar":collapse="sidebar.opened"></hamburger><BreadCrumb></BreadCrumb><div flex justify-end flex-1 items-center mr-20px><screenfull mx-5px></screenfull></div></div>
</template><style scoped lang="scss">
.navbar {@apply h-[var(--navbar-height)];
}
</style><script lang="ts" setup>
import { useAppStore } from "@/stores/app";
// 在解构的时候要考虑值是不是对象,如果非对象解构出来就 丧失响应式了
const { toggleSidebar, sidebar } = useAppStore();
</script>

npm run dev 启动后,页面效果如下:

以上,全屏切换组件就完成了。

下一篇将继续探讨组件尺寸多语言实现,敬请期待~


http://www.ppmy.cn/news/1584080.html

相关文章

Appium中元素定位之一组元素定位API

应用场景 和定位一个元素相同&#xff0c;但如果想要批量的获取某个相同特征的元素&#xff0c;使用定位一组元素的方式更加方便 在 Appium 中定位一组元素的 API 与定位单个元素的 API 类似&#xff0c;但它们返回的是一个元素列表&#xff08;List<MobileElement>&am…

蓝桥杯 班级活动

问题描述 小明的老师准备组织一次班级活动。班上一共有 n 名同学&#xff08;n 为偶数&#xff09;&#xff0c;老师想把所有同学进行分组&#xff0c;每两名同学一组。 为了公平&#xff0c;老师给每名同学随机分配了一个 n 以内的正整数作为 id&#xff0c;第 i 名同学的 i…

C#基础学习(八)终章 C#中的结构体

假如你要用数据记录一个人&#xff0c;你觉得要记录些什么&#xff0c;身高&#xff0c;体重&#xff0c;名字等。那两个人呢&#xff0c;他是不是也有这样的特征&#xff0c;那我们是不是就可以用一种数据类型将他们共有的特征提取出来&#xff0c;这就是我们今天讲的结构体。…

智能制造:自动化焊装线的数字化设计

通过建设焊装车间生产线智能制造系统&#xff0c;致力于打造一个智能化、绿色环保的工厂&#xff0c;不仅提高生产效率&#xff0c;还将节能减排与环保理念深入到生产流程的每一环节&#xff0c;推动制造业向更高的智能化与绿色化方向迈进。 项目目标 智能制造及绿色工厂的打造…

大数据分析与挖掘实训室总体介绍

一、实训室建设目的与意义 大数据分析与挖掘实训室的建设旨在满足当前社会对大数据专业人才的迫切需求。随着大数据技术在各个行业的广泛应用&#xff0c;如金融、医疗、电商等领域&#xff0c;企业对具备数据采集、预处理、分析与挖掘以及数据可视化能力的专业人才需求激增。…

(C语言)指针运算 习题练习1.2(压轴难题)

在上一张已经练习了三道习题&#xff0c;小试牛刀了&#xff0c;那么在本章在来几题&#xff0c;练练手。&#xff08;习题三是压轴难题&#xff09; 习题一 int main() {int aa[2][5] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int* ptr1 (int*)(&aa 1);int* ptr2 (int*)…

香港电讯企业托管服务,助企业实现高效IT管理与运营

随着企业数字化转型的加速&#xff0c;IT基础设施的复杂性也随之增加。与此同时&#xff0c;流程保障缺失、混合办公和混合云模式、不断增加的IT需求、人力负担和运营成本的增加&#xff0c;企业如何应对这些挑战&#xff1f;为此&#xff0c;香港电讯推出的企业托管服务&#…

横扫SQL面试——事件流处理(峰值统计)问题

横扫SQL面试 &#x1f4cc; 事件流处理&#xff08;峰值统计&#xff09;问题 “会议室预定冲突怎么查&#xff1f; &#x1f50d; 服务器瞬时负载如何算&#xff1f;&#x1f3a2; 健身房的‘人挤人’高峰究竟出现在几点&#xff1f;&#x1f3c3;‍♂️” 这些看似毫不相干…