pc端的屏保实现

背景

偶然间,在使用一款google插件的时候,发现它有一个小功能,只要我停留在它的页面不操作10分钟以上,就会自动给我打开一个屏保界面,这样的
在这里插入图片描述

目的

这种华而不实的功能,正好适合个人博客,所以我就自己简单实现了一下

核心思路

监听用户当前是否出于活跃状态,这里的活跃状态包含以下几种

  1. 是否出发滚动;
  2. 是否移动或者点击鼠标;
  3. 是否按下键盘;
  4. 是否离开(或隐藏)当前窗口(可选)
    监听用户以上的事件,来判断是否在一段时间内,用户是处于活跃状态的
    下面useListenPage的hook中,会监听以上几种事件

代码如下

代码其实就很简单了,这里我直接写了一个hook,方便后续扩展和使用。
hooks的功能:在一段时间内,返回用户是否活跃状态的布尔值

import { useState } from "react";
import { useMount } from "./useMount";
import { useUnMount } from "./useUnMount";
import { debounce } from '../utils';const defaultDelay = 10000;interface IUseListenPage {/** 空闲时间, 默认10s不操作就进入不活跃状态 */delay?: number;/** 是否页面不可见时,设置为不活跃 */isHidden?: boolean;
}export function useListenPage(props: IUseListenPage) {const { delay = defaultDelay, isHidden = false } = props;const [isActive, setIsActive] = useState(true);let timer: any = null;const startListener = () => { if (timer) clearTimeout(timer);timer = setTimeout(() => {if (isActive) {setIsActive(false);}}, delay);}const handleAction = () => {setIsActive(true);/** 重新开启监听 */startListener();}const handleVisibilityChange = () => {if (document.hidden && isActive && isHidden) {// 页面不可见时,设置为不活跃setIsActive(false);}}useMount(() => {/** 开始监听 */startListener();/** 监听页面是否可见 */window.addEventListener("visibilitychange", handleVisibilityChange)/** 监听 滚动 鼠标 键盘事件 */window.addEventListener("scroll", debounce(handleAction));window.addEventListener("mousemove", debounce(handleAction));window.addEventListener("keydown", debounce(handleAction));window.addEventListener("click", debounce(handleAction));})useUnMount(() => {/** 移除监听 */window.removeEventListener("visibilitychange", handleVisibilityChange)window.removeEventListener("scroll", debounce(handleAction));window.removeEventListener("mousemove", debounce(handleAction));window.removeEventListener("keydown", debounce(handleAction));window.removeEventListener("click", debounce(handleAction));})return isActive;
}

使用如下

function xxx({children}: any) {const isActive = useListenPage({ delay: 15 * 60 * 1000 });return isActive ? children : <ScreenSaver />;
}

写在最后

如果觉得这种小知识有帮助到大家,那就点个赞吧,让博主开心开心!

大家有遇到什么问题的,都可以在评论区发出来,只要博主有时间,一定帮你们解决目前的问题,任何相关大前端的疑难杂症都可

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

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

相关文章

Prometheus监控k8s环境构建

传统架构中比较流行的监控工具有 Zabbix、Nagios 等&#xff0c;这些监控工具对于 Kubernetes 这类云平台的监控不是很友好&#xff0c;特别是当 Kubernetes 集群中有了成千上万的容器后更是如此&#xff0c;本章节学习下一代的云原生监控平台---Prometheus。 一、基于kuberne…

医学数据分析实训 项目七 集成学习--空气质量指标--天气质量分析和预测

项目七&#xff1a;集成学习 实践目的 理解集成学习算法原理&#xff1b;熟悉并掌握常用集成学习算法的使用方法&#xff1b;熟悉模型性能评估的方法&#xff1b;掌握模型优化的方法。 实践平台 操作系统&#xff1a;Windows7及以上Python版本&#xff1a;3.8.x及以上集成开…

LineageOS连接网络提示IP配置失败

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ IP配置失败 连接所有网络都提示IP配置失败&#xff0c;通过配置静态IP也连不上网络&#xff0c;感觉就是WIFI模块不能用了。 使用 Magisk root 后就这样了&am…

LeetCode004-两个有序数组的中位数-最优算法代码讲解

最有帮助的视频讲解 【LeetCode004-两个有序数组的中位数-最优算法代码讲解】 https://www.bilibili.com/video/BV1H5411c7oC/?share_sourcecopy_web&vd_sourceafbacdc02063c57e7a2ef256a4db9d2a 时间复杂度 O ( l o g ( m i n ( m , n ) ) ) O(log(min(m,n))) O(log(min(…

spring security 手机号 短信验证码认证、验证码认证 替换默认的用户名密码认证132

spring security内置的有用户名密码认证规则&#xff0c;还可以调用第三方微信、qq登录接口实现登录认证&#xff0c;这里使用自定义的手机号和短信验证码实现登录认证。 要实现自定义的手机号和短信验证码认证需要了解用户名密码认证的逻辑&#xff0c;仿照该逻辑就可以写出…

Java进阶之集合框架(Set)

【基本内容】 二、Set接口(接上一章) Set是Java集合框架中不允许有重复元素的无序集合&#xff0c;其典型的实现类是HashSet&#xff0c;它完全是遵循Set接口特性规范实现的&#xff0c;无序且不允许元素重复&#xff1b;而Set接口下的实现类还有LinkedHashSet和TreeSort&#…

记录生产环境,通过域名访问的图片展示不全,通过ip+端口的方式访问图片是完整的

原因&#xff1a;部署nginx的服务器硬盘满了 排查发现nginx日志文件占用了大量硬盘 解决方案&#xff1a; 删除该文件&#xff0c;重启nginx服务&#xff0c;问题解决。

AI修手有救了?在comfyui中使用Flux模型实现局部重绘案例

&#x1f431;‍&#x1f409;背景 局部重绘相关的话题我们已经讨论和测试过很多次了&#xff0c;比如说inpaint模型、brushnet模型、powerpaint模型等等&#xff0c;最近对于flux模型重绘画面的案例也越来越多了&#xff0c;那我们就结合flux模型的重绘来试试看效果。 &…

前端mock了所有……

目录 一、背景描述 二、开发流程 1.引入Mock 2.创建文件 3.需求描述 4.Mock实现 三、总结 一、背景描述 前提&#xff1a; 事情是这样的&#xff0c;老板想要我们写一个demo拿去路演/拉项目&#xff0c;有一些数据&#xff0c;希望前端接一下&#xff0c;写几个表格&a…

qt信号与槽(自定义)

自定义信号与槽 在qt里&#xff0c;我们可以自己去定义信号与槽。 这里举个栗子&#xff1a; 信号的定义 在我们类里边定义一个信号&#xff0c;我们需要用signals&#xff1a;来声明&#xff0c;不用再去cpp文件里边定义。而且返回值必须是void&#xff0c;可以有参数。 槽…

2024年最新测绘地理信息规范在线查看下载

随着科技的飞速发展&#xff0c;测绘地理信息行业也迎来了新的机遇与挑战。 为了确保测绘地理信息的准确性和规范性&#xff0c;每年都会出台了一系列最新的测绘地理信息规范。 本文将历年地形行业发布的相关标准规范&#xff0c;包括现行和一些已经弃用的标准&#xff0c;截…

数据结构与算法——详谈栈和队列

目录 一&#xff1a;栈 1.1&#xff1a;栈的概念结构与实现 1.1.1&#xff1a;栈的概念结构 1.1.2&#xff1a;栈的实现 1.2&#xff1a;栈的各个功能实现 1.2.1&#xff1a;对栈进行初始化 1.2.2&#xff1a;判空栈 1.2.3&#xff1a;入栈 1.2.4&#xff1a;出栈 1.…

一文读懂AI安全治理框架

随着AI的发展以及研究&#xff0c;我们总会提到AI带来的一些潜在威胁&#xff0c;但截止目前我还没有完全的梳理过AI到底有哪些潜在的风险&#xff0c;今天就来一一看一下&#xff01;陆续补齐。

自动化中验证码的操作笔记,懂的赶紧收藏!

在自动化测试的过程中&#xff0c;验证码一直被视为一个“拦路虎”。很多测试人员在做接口或UI自动化时都会遇到验证码的阻碍&#xff0c;导致测试无法继续进行。今天&#xff0c;我们就来讨论如何在自动化过程中破解验证码&#xff0c;快速绕过这道关卡&#xff0c;轻松完成自…

LVM硬盘挂载

LVM硬盘挂载 一、基础概念 sda/sdb/nvme0n1/nvme0n2&#xff1a; 硬盘的命名方式&#xff0c;中括号的字母为第三位按不同硬盘的加载顺序排序。sda1/sda2/sdb1&#xff1a; 第4位为分区号&#xff0c;数字为不同分区的依序命名lvm: LVM是一种逻辑卷管理器&#xff0c;允许管理…

黑马头条day1 环境搭建 SpringCloud微服务(注册发现,服务调用,网关)

Nacos 环境搭建 Vmvare打开已经安装好的虚拟机镜像环境 使用findshell作为链接工具 和MobaXterm差不多 初始工程搭建 项目导入到idea 里边 这个项目都是用的比较老的东西 jdk1.8 甚至把仓库也提供好了 主体机构 common 就是通用的配置 feign 是对外的接口 model …

css五种定位总结

在 CSS 中&#xff0c;定位&#xff08;Positioning&#xff09;主要有五种模式&#xff0c;每种模式的行为和特点不同&#xff0c;以下是 static、relative、absolute、fixed 和 sticky 五种定位方式的对比总结&#xff1a; 1. static&#xff08;默认定位&#xff09; 特性…

“中秋快乐”文字横幅的MATLAB代码生成

中秋快乐呀朋友们&#xff01;&#xff01;&#xff01; 给大家带来一个好玩的代码&#xff0c;能够生成“中秋快乐”的横幅文字&#xff0c;比较简单&#xff0c;当然你也可以根据自己的需求去更改文字和背景&#xff0c;废话不多说&#xff0c;直接展示。 文字会一直闪烁&…

计算机毕业设计 基于SpringBoot框架的网上蛋糕销售系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

基于Springboot+vue的音乐网站

随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了音乐网站的开发全过程。通过分析音乐网站管理的不足&#xff0c;创建了一个计算机管理音乐网站的方案。文章介绍了音乐网站的系统分析部分&#xff0c;包括可行性分析…