Vue网页屏保

打印 上一主题 下一主题

主题 811|帖子 811|积分 2433

Vue网页屏保

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

屏保组件

  1. <template>
  2.   <div v-if="isActive" class="screensaver" @click="disableScreensaver">
  3.     <div class="carousel">
  4.       <div
  5.         class="carousel-slide"
  6.         v-for="(url, index) in urls"
  7.         :key="index"
  8.         :style="{
  9.           transform: `translateX(-${currentIndex * 100}%)`,
  10.           transition: 'transform 0.5s ease-in-out'
  11.         }"
  12.       >
  13.         <iframe ref="iframe" :src="url" class="carousel-slide-iframe"></iframe>
  14.       </div>
  15.     </div>
  16.     <h1 class="message">屏保活动中!点击此处或敲击键盘任意键退出。</h1>
  17.   </div>
  18. </template>
  19. <script>
  20. const kanbanUrl = window._CONFIG['kanbanURL']
  21. export default {
  22.   data() {
  23.     return {
  24.       isActive: false,
  25.       currentIndex: 0,
  26.       carouselInterval: null,
  27.       carouselIntervalTime: 30000,
  28.       urls: [
  29.               // 这里URL可更换为自己需要的资源地址
  30.         kanbanUrl+'/index.html',
  31.         kanbanUrl+'/indexWip.html',
  32.         kanbanUrl+'/AutelLine-chars.html',
  33.       ],
  34.     };
  35.   },
  36.   methods: {
  37.     activateScreensaver() {
  38.       let screensaverFlag=window.localStorage.getItem("screensaverFlag")
  39.       if(this.isActive||(screensaverFlag===false||screensaverFlag==='false')){
  40.         // 如果是活动状态不重复触发 || 设置不启用屏保不触发
  41.         return
  42.       }
  43.       this.isActive = true;
  44.       this.carouselIntervalTime=window.localStorage.getItem("carouselIntervalTime")
  45.       if(this.carouselIntervalTime==null||this.carouselIntervalTime===""){
  46.         this.carouselIntervalTime = 30000
  47.       }
  48.       const element = document.documentElement; // 获取整个文档的元素
  49.       if (element.requestFullscreen) { // 标准写法
  50.         element.requestFullscreen();
  51.       } else if (element.mozRequestFullScreen) { // Firefox 浏览器
  52.         element.mozRequestFullScreen();
  53.       } else if (element.webkitRequestFullscreen) { // Chrome 和 Safari
  54.         element.webkitRequestFullscreen();
  55.       } else if (element.msRequestFullscreen) { // IE11
  56.         element.msRequestFullscreen();
  57.       }
  58.       this.startCarousel();
  59.     },
  60.     disableScreensaver() {
  61.       this.isActive = false;
  62.       clearInterval(this.carouselInterval);
  63.       window.removeEventListener('mousemove', this.handleMouseMove);
  64.       if (document.exitFullscreen) { // 标准写法
  65.         document.exitFullscreen();
  66.       } else if (document.mozCancelFullScreen) { // Firefox 浏览器
  67.         document.mozCancelFullScreen();
  68.       } else if (document.webkitExitFullscreen) { // Chrome 和 Safari
  69.         document.webkitExitFullscreen();
  70.       } else if (document.msExitFullscreen) { // IE11
  71.         document.msExitFullscreen();
  72.       }
  73.     },
  74.     startCarousel() {
  75.       clearInterval(this.carouselInterval);
  76.       if (this.carouselIntervalTime == null || this.carouselIntervalTime === '' || this.carouselIntervalTime < 5000) {
  77.         this.carouselIntervalTime = 5000
  78.       }
  79.       this.carouselInterval = setInterval(() => {
  80.         this.currentIndex = (this.currentIndex + 1) % this.urls.length;
  81.       }, this.carouselIntervalTime); // 每30秒切换
  82.     },
  83.   },
  84.   mounted() {
  85.     // this.activateScreensaver(); // 激活屏保,确保其开始运行
  86.   },
  87.   beforeDestroy() {
  88.     clearInterval(this.carouselInterval);
  89.   },
  90. };
  91. </script>
  92. <style scoped>
  93. .screensaver {
  94.   position: fixed;
  95.   top: 0;
  96.   left: 0;
  97.   width: 100%;
  98.   height: 100%;
  99.   background-color: rgba(0, 0, 0, 0.8);
  100.   color: white;
  101.   display: flex;
  102.   flex-direction: column;
  103.   justify-content: center;
  104.   align-items: center;
  105.   z-index: 9999;
  106.   font-family: Arial, sans-serif;
  107. }
  108. .carousel {
  109.   width: 100%;
  110.   height: 100%;
  111.   display: flex;
  112.   overflow: hidden;
  113. }
  114. .carousel-slide {
  115.   min-width: 100%;
  116.   height: 100%;
  117.   display: flex;
  118.   justify-content: center;
  119.   align-items: center;
  120. }
  121. .carousel-slide iframe {
  122.   width: 100%;
  123.   height: 100%;
  124.   border: none;
  125. }
  126. .message {
  127.   font-size: 2em;
  128.   margin-top: 5px;
  129.   text-align: center;
  130.   color: #c0c0c0;
  131.   cursor: pointer;
  132.   position: relative;
  133.   overflow: hidden;
  134.   padding: 0 10px;
  135.   border-radius: 20px;
  136. }
  137. .message::before {
  138.   content: '';
  139.   position: absolute;
  140.   top: 0;
  141.   left: -100%;
  142.   width: 100%;
  143.   height: 100%;
  144.   background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent); /* 可调整透明度 */
  145.   animation: shine 5s infinite;
  146.   pointer-events: none; /* 使点击事件穿透 */
  147. }
  148. @keyframes shine {
  149.   0% {
  150.     left: -100%;
  151.   }
  152.   50% {
  153.     left: 100%;
  154.   }
  155.   100% {
  156.     left: 100%;
  157.   }
  158. }
  159. </style>
复制代码
调用

  1. <template>
  2.   <a-config-provider :locale="locale">
  3.     <div id="app" @mousemove="mouseScreensaver" @keydown="mouseScreensaver">
  4.       <router-view/>
  5.       <Screensaver ref="Screensaver" />
  6.     </div>
  7.   </a-config-provider>
  8. </template>
  9. <script>
  10. import zhCN from 'ant-design-vue/lib/locale-provider/zh_CN';
  11. import enquireScreen from '@/utils/device';
  12. import Screensaver from '@/components/Screensaver/Screensaver.vue';
  13. export default {
  14.   components: {
  15.     Screensaver,
  16.   },
  17.   data() {
  18.     return {
  19.       locale: zhCN,
  20.       timeout: null, // 用于存储定时器
  21.       idleTime: 5000*60*5, // 5分钟,单位为毫秒
  22.     };
  23.   },
  24.   created() {
  25.     // 创建页面时启动定时器
  26.     this.setupIdleTimer();
  27.     window.addEventListener('mouseup', this.mouseScreensaver);
  28.     window.addEventListener('mousemove', this.mouseScreensaver);
  29.     window.addEventListener('keydown', this.keydownScreensaver);
  30.     let that = this;
  31.     enquireScreen((deviceType) => {
  32.       // tablet
  33.       if (deviceType === 0) {
  34.         that.$store.commit('TOGGLE_DEVICE', 'mobile');
  35.         that.$store.dispatch('setSidebar', false);
  36.       }
  37.       // mobile
  38.       else if (deviceType === 1) {
  39.         that.$store.commit('TOGGLE_DEVICE', 'mobile');
  40.         that.$store.dispatch('setSidebar', false);
  41.       } else {
  42.         that.$store.commit('TOGGLE_DEVICE', 'desktop');
  43.         that.$store.dispatch('setSidebar', true);
  44.       }
  45.     });
  46.   },
  47.   beforeDestroy() {
  48.     // 销毁页面时清除定时器
  49.     clearTimeout(this.timeout); // 清理定时器
  50.     this.timeout = null
  51.     let that=this
  52.     window.removeEventListener('mouseup', this.mouseScreensaver);
  53.     window.removeEventListener('mousemove', this.mouseScreensaver);
  54.     window.removeEventListener('keydown', this.keydownScreensaver);
  55.   },
  56.   methods: {
  57.     /**
  58.      * 设置新的延迟触发屏保
  59.      */
  60.     setupIdleTimer() {
  61.       let screensaverFlag = window.localStorage.getItem('screensaverFlag')
  62.       if (screensaverFlag !== false || screensaverFlag !== 'false') {
  63.         let screensaverTime = window.localStorage.getItem('screensaverTime')
  64.         if (screensaverTime == null) {
  65.           screensaverTime = this.idleTime
  66.         }
  67.         this.timeout = setTimeout(() => {
  68.           this.activateScreensaver();
  69.         }, screensaverTime);
  70.       }
  71.     },
  72.     /**
  73.      * 触发鼠标活动屏保定时重新计算
  74.      */
  75.     mouseScreensaver() {
  76.       clearTimeout(this.timeout); // 清除当前定时器
  77.       this.timeout = null
  78.       this.setupIdleTimer(); // 再次设置定时器
  79.     },
  80.     /**
  81.      * 触发键盘活动屏保定时重新计算
  82.      */
  83.     keydownScreensaver() {
  84.       if(this.$refs.Screensaver.isActive){
  85.         // 如果是显示状态
  86.         this.$refs.Screensaver.disableScreensaver() // 销毁屏保
  87.       }
  88.       clearTimeout(this.timeout); // 清除当前定时器
  89.       this.timeout = null
  90.       this.setupIdleTimer(); // 再次设置定时器that.mouseScreensaver()
  91.     },
  92.     /**
  93.      * 显示屏保
  94.      */
  95.     activateScreensaver() {
  96.       this.$refs.Screensaver.activateScreensaver();
  97.     },
  98.   },
  99. };
  100. </script>
  101. <style>
  102. #app {
  103.   height: 100%;
  104. }
  105. </style>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

没腿的鸟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表