Vue网页屏保

news2024/12/27 3:13:31

Vue网页屏保

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

屏保组件

<template>
  <div v-if="isActive" class="screensaver" @click="disableScreensaver">
    <div class="carousel">
      <div
        class="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 和 Safari
        element.webkitRequestFullscreen();
      } else if (element.msRequestFullscreen) { // IE11
        element.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 和 Safari
        document.webkitExitFullscreen();
      } else if (document.msExitFullscreen) { // IE11
        document.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) => {
      // tablet
      if (deviceType === 0) {
        that.$store.commit('TOGGLE_DEVICE', 'mobile');
        that.$store.dispatch('setSidebar', false);
      }
      // mobile
      else 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 = null
    let that=this
    window.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 = null
      this.setupIdleTimer(); // 再次设置定时器
    },
    /**
     * 触发键盘活动屏保定时重新计算
     */
    keydownScreensaver() {
      if(this.$refs.Screensaver.isActive){
        // 如果是显示状态
        this.$refs.Screensaver.disableScreensaver() // 销毁屏保
      }
      clearTimeout(this.timeout); // 清除当前定时器
      this.timeout = null
      this.setupIdleTimer(); // 再次设置定时器that.mouseScreensaver()
    },
    /**
     * 显示屏保
     */
    activateScreensaver() {
      this.$refs.Screensaver.activateScreensaver();
    },
  },
};
</script>

<style>
#app {
  height: 100%;
}
</style>

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

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

相关文章

计算机网络复习5——运输层

运输层解决的是进程之间的逻辑通信问题 两个主机进行通信归根结底是两个主机中的应用程序互相通信&#xff0c;又称为“端到端的通信” 端口 运行在计算机中的进程是用进程标识符来标志的。但不同的操作系统标识进程的方法不统一&#xff0c;因特网重新以统一的方法对TCP/IP…

qtcanpool 知 10:包管理雏形

文章目录 前言痛点转机雏形实践后语 前言 曾听闻&#xff1a;C/Qt 没有包管理器&#xff0c;开发起来太不方便。这是一个有过 node.js 开发经验的人对 Qt 的吐槽。 确实&#xff0c;像 python、golang、node.js 这些编程语言都有包管理器&#xff0c;给用户带来了极佳的开发体…

ASP.NET Core 9.0 静态资产传递优化 (MapStaticAssets )

一、结论 &#x1f4a2;先看结论吧&#xff0c; MapStaticAssets 在大多数情况下可以替换 UseStaticFiles&#xff0c;它已针对为应用在生成和发布时了解的资产提供服务进行了优化。 如果应用服务来自其他位置&#xff08;如磁盘或嵌入资源&#xff09;的资产&#xff0c;则应…

LeetCode 力扣 热题 100道(十五)搜索插入位置(C++)

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 代码如下所示&#xff1a; class Solution { public:int searchIns…

WPF+LibVLC开发播放器-音量控制和倍速控制

界面 界面上增加音量的控件和倍速控制控件 音量控制 主要也是一个Slider进度条控件来实现音量调节 我们这里设置默认的最大值为100&#xff0c;默认Value值也为100&#xff0c;默认声音开到最大 这里目前完全由前端控制音量调节&#xff0c;可以直接使用ValueChanged事件实…

Vue3技术开发,使用纯CSS3动手制作一个3D环绕的相册展示效果,支持传入任意图片.3D轮播相册的组件

主要讲述封装一个3D轮播相册的组件&#xff0c;效果图如下&#xff0c;仅仅传入一个图片的数组即可&#xff0c;效果如下&#xff1a; 使用Vue3技术开发&#xff0c;支持传入任意张数的图片。 使用方法 <template><Swiper :list"list" /> </templat…

python怎么将字母大写

Python中有三种将字母转换为大写的方法&#xff1a;upper()、capitalize()、title()。 下面通过实例给大家介绍具体用法&#xff1a; str "www.php.com" print(str.upper()) # 把所有字符中的小写字母转换成大写字母 print(str.lower()) # 把所有字…

将vscode上的项目提交到github上

1.windows终端中 创建github仓库 创建完成 提交代码 git init git config --global user.email "fuyulai2024163.com" git config --global user.name "Fuyulai-Hub" git add . git commit -m "first commit" git remote add origin https://g…

【期末JavaEE项目】springboot+vue3完成中国铁路12306网站的业务实现【原创】

&#x1f939;‍♀️潜意识Java&#xff1a;个人主页 &#x1f399;告诉你&#xff1a;Java是世界上最美好的语言 &#x1f48e;比较擅长的领域&#xff1a;前端开发 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是…

浅谈CI持续集成

1.什么是持续集成 持续集成&#xff08;Continuous Integration&#xff09;&#xff08;CI&#xff09;是一种软件开发实践&#xff0c;团队成员频繁地将他们的工作成果集成到一起(通常每人每天至少提交一次&#xff0c;这样每天就会有多次集成)&#xff0c;并且在每次提交后…

电子商务人工智能指南 1/6 - 搜索、广告和发现

介绍 81% 的零售业高管表示&#xff0c; AI 至少在其组织中发挥了中等至完全的作用。然而&#xff0c;78% 的受访零售业高管表示&#xff0c;很难跟上不断发展的 AI 格局。 近年来&#xff0c;电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…

【Git教程 之 版本控制】

Git教程 之 版本控制 Git教程 之 版本控制版本控制版本控制类型单用户版本控制系统&#xff08;VCS&#xff09;单用户版本控制系统&#xff08;VCS&#xff09;特点常见的单用户版本控制系统&#xff08;VCS&#xff09; 集中式版本控制系统&#xff08;CVCS&#xff09;集中式…

.NET Framework修复工具

某些精简Windows系统或者第三方下载的改版Windows系统在安装.NET Framework的时候会出现类似下面的错误信息: 可以使用微软官方出的.NET Framework修复工具解决, 下载地址: 【免费】.NETFramework修复工具资源-CSDN文库 下载后运行即可修复系统里的.NET Framework

计算机毕业设计Python轨道交通客流预测分析可视化 智慧交通 机器学习 深度学习 人工智能 爬虫 交通大数据

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

从计算服务器角度看智算与算力

计算服务器于智算和算力领域的地位堪称中流砥柱。人工智能旨在赋予计算机人类智能的使命&#xff0c;对计算服务器提出了近乎苛刻的要求。 在智算层面&#xff0c;它是计算服务器通向高效能的核心动力。凭借 CPU 与 GPU、FPGA、ASIC 等构建的异构组合&#xff0c;计算服务器可…

Lighthouse(灯塔)—— Chrome 浏览器性能测试工具

1.认识 Lighthouse Lighthouse 是 Google 开发的一款开源性能测试工具&#xff0c;用于分析网页或 Web 应用的性能、可访问性、最佳实践、安全性以及 SEO 等关键指标。开发人员可以通过 Lighthouse 快速了解网页的性能瓶颈&#xff0c;并基于优化建议进行改进。 核心功能&…

Logistic Regression(逻辑回归)、Maximum Likelihood Estimatio(最大似然估计)

Logistic Regression&#xff08;逻辑回归&#xff09;、Maximum Likelihood Estimatio&#xff08;最大似然估计&#xff09; 逻辑回归&#xff08;Logistic Regression&#xff0c;LR&#xff09;逻辑回归的基本思想逻辑回归模型逻辑回归的目标最大似然估计优化方法 逻辑回归…

使用Hadoop MapReduce进行大规模数据爬取

Hadoop MapReduce概述 Hadoop MapReduce是一个编程模型&#xff0c;用于处理和生成大数据集。它由Map和Reduce两个主要阶段组成。Map阶段负责处理输入数据&#xff0c;并将结果输出为键值对&#xff1b;Reduce阶段则对Map阶段的输出进行汇总和合并&#xff0c;生成最终结果。 …

AI驱动的低代码平台:解密背后的算法与架构创新

引言 在如今的数字化浪潮中&#xff0c;企业对软件的需求正以前所未有的速度增长。传统的开发方式由于开发周期长、成本高&#xff0c;已逐渐无法满足市场的快速变化。而低代码平台的出现&#xff0c;使得开发者和业务人员能够以极简的方式快速构建应用。然而&#xff0c;随着企…

【Spring工具插件】lombok使用和EditStarter插件

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 引入 一&#xff1a;lombok介绍 1&#xff1a;引入依赖 2&#xff1a;使用 3&#xff1a;原理 4&…