pc端的屏保实现

news2024/12/23 6:54:57

背景

偶然间,在使用一款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.coloradmin.cn/o/2145209.html

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

相关文章

STM32MP157/linux驱动学习记录(二)

38.Linux INPUT 子系统实验 按键、鼠标、键盘、触摸屏等都属于输入(input)设备&#xff0c;Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。输入设备本质上还是字符设备&#xff0c;只是在此基础上套上了 input 框架&#xff0c;用户只需要负责上报输入事件…

健身器材识别系统源码分享

健身器材识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

2024年【电气试验】试题及解析及电气试验模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【电气试验】试题及解析及电气试验模拟考试题&#xff0c;包含电气试验试题及解析答案和解析及电气试验模拟考试题练习。安全生产模拟考试一点通结合国家电气试验考试最新大纲及电气试验考试真题汇总&#xff0…

数据结构之‘栈’

文章目录 1.简介2. 栈的初始化和销毁3. 进栈和出栈3.1 进栈3.2 出栈3.3 栈的打印 1.简介 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行&#xff08;数据插入和删除操作&#xff09;的一端称为栈顶&#xff0c;另一端称为栈底。压栈&#xf…

C++中的const \static \this

目录 前言 一、const关键字 1、const修饰类的成员变量 2、const修饰类的成员函数 3、const修饰类的对象 二、static关键字 1、static修饰类中的成员变量 1. 共享性 2. 初始化 3. 访问权限 4. 内存分配 5. 不依赖于对象 2、static修饰类中的成员函数 三、this关键字…

OpenHarmony(鸿蒙南向开发)——标准系统方案之扬帆移植案例

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——轻量系统STM32F407芯片移植案…

SHL笔试测评系统题库考什么?如何通过综合测评|附性格测试104道

嘿&#xff0c;各位求职小伙伴们&#xff01;我是职小豚&#xff0c;今天就来带大家深入了解神秘又充满挑战的 SHL 笔试测评系统。 一、SHL 人才测评系统介绍 SHL 呀&#xff0c;那可是人才测评领域的超级大明星&#xff01;就像一个智慧的魔法师&#xff0c;用各种神奇的题目…

Linux系统之head命令的基本使用

Linux系统之head命令的基本使用 一、head命令介绍二、head命令的使用帮助2.1 head命令的help帮助信息2.2 head命令的语法解释 三、head的基本使用3.1 直接使用3.2 查看文件前N行3.3 查看多个文件3.4 查询文件的前5行3.5 显示文本所有内容&#xff08;除了后5行内容&#xff09;…

实战讲稿:Spring Boot整合MyBatis

文章目录 实战讲稿&#xff1a;Spring Boot整合MyBatis课程目标课程内容1. 创建员工映射器接口1.1 创建子包1.2 创建接口 2. 测试员工映射器接口2.1 自动装配员工映射器2.2 测试按标识符查询员工方法2.3 测试查询全部员工方法2.4 测试插入员工方法2.5 测试更新员工方法2.6 测试…

No module named MYSQLdb 问题解决

问题&#xff1a; 导入写好的数据库时报错 解决&#xff1a;pip install mysql-python &#xff08;又报错&#xff09; 找了网上的方法&#xff1a; 执行 pip install PyMySQL&#xff0c;将数据库连接改为 mysqlpymysql://username:passwordserver/db&#xff0c;接下来的操…

eggtart队比赛攻略

关联比赛: “新内容 新交互”全球视频云创新挑战赛--算法挑战赛道 赛题回顾 本次赛题核心为高清视频人像分割&#xff0c;属于无监督视频物体分割任务&#xff0c;要求在未提供任何额外输入的情况下&#xff0c;识别并定位视频中的主要人物&#xff0c;并精确到图像的每个像素…

微服务配置中心介绍

在微服务架构中&#xff0c;配置中心是一个非常重要的组件&#xff0c;它负责管理所有服务的配置信息&#xff0c;使得配置管理变得更加集中和动态。配置中心能够极大地提高微服务架构的灵活性和可维护性。 为什么需要配置中心&#xff1f; 在传统的单体应用中&#xff0c;配置…

22:SPI一:简单的使用

SPI简单的使用 1、什么是SPI2、数据通信2.1&#xff1a;5个重要参数2.2&#xff1a;4种传输模式 3、程序模拟SPI通信时序3、片上外设SPI通信时序 1、什么是SPI SPI是一种同步的&#xff0c;全双工&#xff0c;支持总线挂载多设备的通信协议。它特别适用于高效&#xff0c;快速…

【Python报错已解决】 TypeError: Descriptors cannot not be created directly

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

计算机毕业设计 健身房管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

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

MUNIK谈ASPICE系列专题分享(六)企业为什么要做ASPICE?

前言&#xff1a; 知名的几家主机厂对ASPICE有什么各自的要求&#xff1f;企业应该做哪些应对 1-说到“企业为什么要做ASPICE”这个话题&#xff0c;我们首先需要了解一下ASPICE的历史。 在1993年&#xff0c;国际标准化组织&#xff08;ISO&#xff09;和国际电工委员会&am…

C++_类和对象(下篇)—— 内部类、匿名对象、对象拷贝时的编译器优化

目录 四、类和对象&#xff08;下篇&#xff09; 5、内部类 6、匿名对象 7、对象拷贝时的编译器优化 四、类和对象&#xff08;下篇&#xff09; 5、内部类 如果⼀个类定义在另⼀个类的内部&#xff0c;这个内部类就叫做内部类。内部类是⼀个独立的类&#xff0c;跟定义…

基于SpringBoot+WebSocket实现地图上绘制车辆实时运动轨迹图

实现基于北斗卫星的车辆定位和轨迹图的Maven工程&#xff08;使用模拟数据&#xff09;&#xff0c;我们将使用以下技术&#xff1a; Spring Boot&#xff1a;作为后端框架&#xff0c;用来提供数据接口。Thymeleaf&#xff1a;作为前端模板引擎&#xff0c;呈现网页。Leaflet…

Agile Modbus STM32裸机移植 从机使用

本教程手把手教你实现Agile Modbus&#xff0c;照抄就能成。 并且会解读函数功能含义。 1. 引言 Agile Modbus 是一个轻量级的 Modbus 协议栈&#xff0c;可以满足用户在任何场景下的需求。 功能 支持 rtu 和 tcp 协议&#xff0c;使用纯 C 语言开发&#xff0c;不涉及任何硬…

安科瑞AIM-D100系列 光伏直流系统直流绝缘监测仪——保障光伏发电运行稳定可靠

应用场景&#xff1a;发电厂家、变电站的直流屏、电动汽车充电装置、UPS供电系统、光伏直流系统、储能系统及其它直流电网等直流系统。 随着工业的发展&#xff0c;很多用电设备和工厂设备采用直流系统供电&#xff0c;直流系统的正极和负极不接地。对于不接地&#xff08;IT&…