Vue网页屏保

Vue网页屏保

在vue项目中,如果项目长时间未操作需要弹出屏幕保护程序,以下为网页屏保效果,看板内容为连接的资源。
屏保效果

屏保组件

<template><div v-if="isActive" class="screensaver" @click="disableScreensaver"><div class="carousel"><divclass="carousel-slide"v-for="(url, index) in urls":key="index":style="{transform: `translateX(-${currentIndex * 100}%)`,transition: 'transform 0.5s ease-in-out'}"><iframe ref="iframe" :src="url" class="carousel-slide-iframe"></iframe></div></div><h1 class="message">屏保活动中!点击此处或敲击键盘任意键退出。</h1></div>
</template><script>
const kanbanUrl = window._CONFIG['kanbanURL']
export default {data() {return {isActive: false,currentIndex: 0,carouselInterval: null,carouselIntervalTime: 30000,urls: [// 这里URL可更换为自己需要的资源地址kanbanUrl+'/index.html',kanbanUrl+'/indexWip.html',kanbanUrl+'/AutelLine-chars.html',],};},methods: {activateScreensaver() {let screensaverFlag=window.localStorage.getItem("screensaverFlag")if(this.isActive||(screensaverFlag===false||screensaverFlag==='false')){// 如果是活动状态不重复触发 || 设置不启用屏保不触发return}this.isActive = true;this.carouselIntervalTime=window.localStorage.getItem("carouselIntervalTime")if(this.carouselIntervalTime==null||this.carouselIntervalTime===""){this.carouselIntervalTime = 30000}const element = document.documentElement; // 获取整个文档的元素if (element.requestFullscreen) { // 标准写法element.requestFullscreen();} else if (element.mozRequestFullScreen) { // Firefox 浏览器element.mozRequestFullScreen();} else if (element.webkitRequestFullscreen) { // Chrome 和 Safarielement.webkitRequestFullscreen();} else if (element.msRequestFullscreen) { // IE11element.msRequestFullscreen();}this.startCarousel();},disableScreensaver() {this.isActive = false;clearInterval(this.carouselInterval);window.removeEventListener('mousemove', this.handleMouseMove);if (document.exitFullscreen) { // 标准写法document.exitFullscreen();} else if (document.mozCancelFullScreen) { // Firefox 浏览器document.mozCancelFullScreen();} else if (document.webkitExitFullscreen) { // Chrome 和 Safaridocument.webkitExitFullscreen();} else if (document.msExitFullscreen) { // IE11document.msExitFullscreen();}},startCarousel() {clearInterval(this.carouselInterval);if (this.carouselIntervalTime == null || this.carouselIntervalTime === '' || this.carouselIntervalTime < 5000) {this.carouselIntervalTime = 5000}this.carouselInterval = setInterval(() => {this.currentIndex = (this.currentIndex + 1) % this.urls.length;}, this.carouselIntervalTime); // 每30秒切换},},mounted() {// this.activateScreensaver(); // 激活屏保,确保其开始运行},beforeDestroy() {clearInterval(this.carouselInterval);},
};
</script><style scoped>
.screensaver {position: fixed;top: 0;left: 0;width: 100%;height: 100%;background-color: rgba(0, 0, 0, 0.8);color: white;display: flex;flex-direction: column;justify-content: center;align-items: center;z-index: 9999;font-family: Arial, sans-serif;
}.carousel {width: 100%;height: 100%;display: flex;overflow: hidden;
}.carousel-slide {min-width: 100%;height: 100%;display: flex;justify-content: center;align-items: center;
}.carousel-slide iframe {width: 100%;height: 100%;border: none;
}
.message {font-size: 2em;margin-top: 5px;text-align: center;color: #c0c0c0;cursor: pointer;position: relative;overflow: hidden;padding: 0 10px;border-radius: 20px;
}.message::before {content: '';position: absolute;top: 0;left: -100%;width: 100%;height: 100%;background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent); /* 可调整透明度 */animation: shine 5s infinite;pointer-events: none; /* 使点击事件穿透 */
}@keyframes shine {0% {left: -100%;}50% {left: 100%;}100% {left: 100%;}
}</style>

调用

<template><a-config-provider :locale="locale"><div id="app" @mousemove="mouseScreensaver" @keydown="mouseScreensaver"><router-view/><Screensaver ref="Screensaver" /></div></a-config-provider>
</template><script>
import zhCN from 'ant-design-vue/lib/locale-provider/zh_CN';
import enquireScreen from '@/utils/device';
import Screensaver from '@/components/Screensaver/Screensaver.vue';export default {components: {Screensaver,},data() {return {locale: zhCN,timeout: null, // 用于存储定时器idleTime: 5000*60*5, // 5分钟,单位为毫秒};},created() {// 创建页面时启动定时器this.setupIdleTimer();window.addEventListener('mouseup', this.mouseScreensaver);window.addEventListener('mousemove', this.mouseScreensaver);window.addEventListener('keydown', this.keydownScreensaver);let that = this;enquireScreen((deviceType) => {// tabletif (deviceType === 0) {that.$store.commit('TOGGLE_DEVICE', 'mobile');that.$store.dispatch('setSidebar', false);}// mobileelse if (deviceType === 1) {that.$store.commit('TOGGLE_DEVICE', 'mobile');that.$store.dispatch('setSidebar', false);} else {that.$store.commit('TOGGLE_DEVICE', 'desktop');that.$store.dispatch('setSidebar', true);}});},beforeDestroy() {// 销毁页面时清除定时器clearTimeout(this.timeout); // 清理定时器this.timeout = nulllet that=thiswindow.removeEventListener('mouseup', this.mouseScreensaver);window.removeEventListener('mousemove', this.mouseScreensaver);window.removeEventListener('keydown', this.keydownScreensaver);},methods: {/*** 设置新的延迟触发屏保*/setupIdleTimer() {let screensaverFlag = window.localStorage.getItem('screensaverFlag')if (screensaverFlag !== false || screensaverFlag !== 'false') {let screensaverTime = window.localStorage.getItem('screensaverTime')if (screensaverTime == null) {screensaverTime = this.idleTime}this.timeout = setTimeout(() => {this.activateScreensaver();}, screensaverTime);}},/*** 触发鼠标活动屏保定时重新计算*/mouseScreensaver() {clearTimeout(this.timeout); // 清除当前定时器this.timeout = nullthis.setupIdleTimer(); // 再次设置定时器},/*** 触发键盘活动屏保定时重新计算*/keydownScreensaver() {if(this.$refs.Screensaver.isActive){// 如果是显示状态this.$refs.Screensaver.disableScreensaver() // 销毁屏保}clearTimeout(this.timeout); // 清除当前定时器this.timeout = nullthis.setupIdleTimer(); // 再次设置定时器that.mouseScreensaver()},/*** 显示屏保*/activateScreensaver() {this.$refs.Screensaver.activateScreensaver();},},
};
</script><style>
#app {height: 100%;
}
</style>

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

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

相关文章

【SpringBoot】使用IDEA创建SpringBoot项目

1、使用SpringBoot脚手架创建 我们使用SpringBoot的脚手架Spring Initializr创建&#xff0c;如图所示&#xff1a; 2、选择SpringBoot版本 最开始做项目时候&#xff0c;组长说创建一个 springboot 2.5.4 的项目&#xff0c;mysql使用 5.6.X &#xff0c;maven使用是3.6.X…

如何在鸿蒙API9和x86模拟器中使用MQTT

目录 引言 安装MQTT软件包 避免MQTT软件包自动升级 程序的编写 运行测试 结语 引言 虽然我的课主要是OpenHarmony南向开发的&#xff0c;但是结课时有个同学说他在写鸿蒙APP时无法将MQTT库加入到设备中&#xff0c;希望我帮忙看看。由于他没有鸿蒙的真机&#xff0c;只能…

保姆级教程用vite创建vue3项目并初始化添加PrimeVue UI踩坑实录

文章目录 一、什么是PrimeVue二、详细教程1.添加PrimeVue2.配置main.js3.添加自动引入4.配置vite.config.js5.创建测试页面 一、什么是PrimeVue PrimeVue 是一个用于 Vue.js 3.x 开发的一款高质量、广受欢迎的 Web UI 组件库。 官网地址&#xff1a;https://primevue.org/ 二、…

【openGauss︱PostgreSQL】openGauss或PostgreSQL查表、索引、序列、权限、函数

【openGauss︱PostgreSQL】openGauss或PostgreSQL查表、索引、序列、权限、函数 一、openGauss查表二、openGauss查索引三、openGauss查序列四、openGauss查权限五、openGauss或PostgreSQL查函数六、PostgreSQL查表七、PostgreSQL查索引八、PostgreSQL查序列九、PostgreSQL查权…

QT的ui界面显示不全问题(适应高分辨率屏幕)

//自动适应高分辨率 QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);一、问题 电脑分辨率高&#xff0c;默认情况下&#xff0c;打开QT的ui界面&#xff0c;显示不全按钮内容 二、解决方案 如果自己的电脑分辨率较高&#xff0c;可以尝试以下方案&#xff1a;自…

超级详细,如何手动安装python第三方库?

文章目录 1&#xff0c;python第三方库安装包有3种类型2&#xff0c;python第三方库安装包whl文件如何安装&#xff1f;3&#xff0c;python第三方库安装包zip和tar.gz文件如何安装&#xff1f;4&#xff0c; python第三方库安装包exe文件如何安装&#xff1f; 手动安装第三方库…

Alibaba EasyExcel 导入导出全家桶

一、阿里巴巴EasyExcel的优势 首先说下EasyExcel相对 Apache poi的优势&#xff1a; EasyExcel也是阿里研发在poi基础上做了封装&#xff0c;改进产物。它替开发者做了注解列表解析&#xff0c;表格填充等一系列代码编写工作&#xff0c;并将此抽象成通用和可扩展的框架。相对p…

什么叫自动获得ip地址?自动获得的ip地址怎么设置

在数字化时代&#xff0c;网络连接已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;对于非技术用户而言&#xff0c;复杂的网络配置常常令人感到困惑。幸运的是&#xff0c;自动获得IP地址技术的出现&#xff0c;极大地简化了网络配置过程。本文将详细介绍自动获…

mac: docker : Command not found解决

描述: 安装docker但是docker命令显示Command not found 分析: mac没有配置对应的环境变量 解决方案: 打开配置文件: vim ~/.zshrc写docker环境变量: export PATH"/Applications/Docker.app/Contents/Resources/bin:$PATH"保存退出: esc,输入wq,按enter 配置文…

Redis高阶之容错切换

当一台主机master宕掉之后&#xff0c;他的从机会取代主机么&#xff1f; 查看集群状态 127.0.0.1:6385> cluster nodes c8ff33e8da5fd8ef821c65974dda304d2e3327f9 192.168.58.129:638216382 slave f6b1fd5e58df90782f602b484c2011d52fc3482d 0 1733220836918 1 connecte…

数据库原理-期末复习基础知识第二弹

1、数据的逻辑独立性是指 外模式/模式映像 当模式改变的时候&#xff0c;由数据库管理员对各个外模式/模式的映像做出相应改变&#xff0c;使外模式保持不变。由于应用程序是按照外模式进行编写的&#xff0c;故应用程序不必修改&#xff0c;保证了数据与程序的逻辑独立性。 …

流媒体之linux下离线部署FFmpeg 和 SRS

前言 用户对网络做了限制&#xff0c;只能访问指定的网址&#xff0c;和没网没啥区别&#xff0c;导致无法连接外网&#xff0c;无法获取安装包&#xff0c;还有一些编译需要的开源工具 用户需要用平台查看库房的海康摄像头实时监控&#xff0c;只能在库房里一台纯净的ubantu…

数字时代的文化宝库:存储技术与精神生活

文章目录 1. 文学经典的数字传承2. 音乐的无限可能3. 影视艺术的数字化存储4. 结语 数字时代的文化宝库&#xff1a;存储技术与精神生活 在数字化的浪潮中&#xff0c;存储技术如同一座桥梁&#xff0c;连接着过去与未来&#xff0c;承载着人类文明的瑰宝。随着存储容量的不断增…

2024年12月大语言模型最新对比:GPT-4、Claude 3、文心一言等详细评测

前言 随着人工智能技术的快速发展&#xff0c;大语言模型(LLM)已经成为了技术领域最热门的话题。本文将详细对比目前主流的大语言模型&#xff0c;帮助大家选择最适合的工具。 一、OpenAI GPT系列 1. GPT-4 核心优势&#xff1a; 多模态理解能力强 逻辑推理能力出色 创造…

TCP/IP 和 UDP

一、TCP/IP&#xff08;传输控制协议&#xff09; TCP/IP 是一个协议族&#xff0c;它是互联网的基础协议&#xff0c;为网络通信提供了标准化的方法。TCP/IP 分为四个层次&#xff0c;每一层都有特定的功能&#xff1a; 应用层&#xff1a;这是最接近用户的层&#xff0c;包含…

React第十一节 组件之间通讯之发布订阅模式(自定义发布订阅器)

组件之间通讯常用方案 1、通过props 2、通过context 3、通过发布订阅模式 4、通过Redux 后面会有专栏介绍 什么情况下使用发布订阅模式 a、当我们想要兄弟组件之间通讯&#xff0c;而共同的父组件中又用不到这些数据时候&#xff1b; b、当多个毫无相关的组件之间想要进行数据…

渗透测试之Web基础之Linux病毒编写——泷羽sec

声明&#xff1a; 学习视频来自B站UP主泷羽sec,如涉及侵权马上删除文章。本文只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频 (bilibili.com)https://space.bilibili.com/350329294 导读&#xff1a; 时刻…

macos上设置windsurf命令行启动

解决方案 1. 在/usr/local/bin 目录下创建软链 sudo ln -s /Applications/Windsurf.app/Contents/Resources/app/bin/windsurf /usr/local/bin/windsurf 2. 执行source source ~/.zshrc

基于神经网络的弹弹堂类游戏弹道快速预测

目录 一、 目的... 1 1.1 输入与输出.... 1 1.2 隐网络架构设计.... 1 1.3 激活函数与损失函数.... 1 二、 训练... 2 2.1 数据加载与预处理.... 2 2.2 训练过程.... 2 2.3 训练参数与设置.... 2 三、 测试与分析... 2 3.1 性能对比.... 2 3.2 训练过程差异.... 3 四、…

Xlsxwriter生成Excel文件时TypeError异常处理

在使用 XlsxWriter 生成 Excel 文件时&#xff0c;如果遇到 TypeError&#xff0c;通常是因为尝试写入的值或格式与 XlsxWriter 的限制或要求不兼容。 1、问题背景 在使用 Xlsxwriter 库生成 Excel 文件时&#xff0c;出现 TypeError: “expected string or buffer” 异常。此…