FullScreen API与F11快捷键的相关问题排查与解决

前言

某个项目需要点击全屏按钮将页面中某个容器内的元素进行全屏显示便于用户操作,点击退出全屏时显示原来的页面内容

问题

1:指定元素全屏存在部分元素无法显示

记得之前看 FullScreen 相关API时有印象可以让某一元素直接全屏显示,随即变试了试,发现效果还不错,使用如下:

const targetEle = document.getElementById('fullscreenEle');
targetEle.requestFullscreen();

但是在实际的项目中使用变发现了问题,全屏貌似是将当前全屏的内容放入了一个虚拟的DOM视图中(貌似?没怎么研究原理),使用 F12 检索后发现如下:
在这里插入图片描述
全屏元素挂载在了 top-layer DOM树下,这样会导致以下几个问题:

  1. 为该元素设置的背景样式会失效,显示为黑色(无法解决)
  2. 如果你在该页面中使用了类似于 ANT-Design-Vue 组件库中的 a-tooltip / a-modal 等组件,这些组件默认是挂载在 body 下的,无法显示在该全屏页面中

第二个问题的解决方案也很简单:

  1. 将整个document元素作为全屏的元素,然后通过JS去控制哪些元素不显示,哪些元素显示
  2. 将所有挂载在 body 元素上的悬浮提示、模态框等使用官方API挂载在需要全屏的元素之内即可

2.使用F11时关闭全屏无法监听按键事件

当用户使用F11的快捷键进入全屏后,再使用快捷键F11或者ESC退出全屏时,会发现并没有触发按键事件。这对于页面需要根据全屏状态显示不同内容的开发者来说是致命的。因为这将导致用户使用按钮进入全屏和使用快捷键进入全屏后页面某些元素的状态同步不正确从而导致一些Bug

查阅资料后发现,这应该是浏览器端做的限制,目的是“为了防止开发者使用JS强制用户不可退出全屏”,我认为这是合理的。

但我们如何达成自己想要的效果呢?很简单,重新实现以下按键F11的全屏功能即可

  1. 首先监听按键事件,当监听到用户点击 F11 时执行自定义的全屏逻辑
  2. 然后监听全屏事件,当用户使用 ESCF11 退出全屏时,可以通过该事件执行自己的逻辑,恢复某些按钮或元素的状态
  3. 组件卸载时取消监听按键事件,防止在其他页面仍然执行了该全屏逻辑

代码实现大致如下:

// 注:这里使用了 screenfull库,使用原生API也是一样的道理// 页面渲染完成后监听按键事件执行自定义全屏逻辑
document.addEventListener('keydown', handleKeyDownEvent);
// 监听全屏改变事件,对应原生API中的 fullscreenchange 事件
screenfull.on('change', handleFullscreenEvent);// 监听按键事件方法
function handleKeyDownEvent(event: KeyboardEvent): void {if (event.key === 'F11') {// 阻止默认行为并执行切换全屏逻辑event.preventDefault();toggleFullScreen();}
}// 切换全屏方法
function toggleFullScreen(): void {if (screenfull.isFullscreen) {isFullScreen.value = false;screenfull.exit();} else {isFullScreen.value = true;screenfull.request();}
}// 全屏切换事件
function handleFullscreenEvent(): void {if (!screenfull.isFullscreen) {isFullScreen.value = false;}
}// 组件卸载时移除监听事件
document.removeEventListener('keydown', handleKeyDownEvent);
screenfull.off('change', handleFullscreenEvent);

这样,不管用户使用快捷键进入全屏还是点击按钮全屏,所有元素的状态都可以保持一致

注意:
看到网上有人使用 resize 事件来监听退出全屏,虽然退出全屏时也会触发该事件,但是不应该使用该事件,因为该事件是文档窗口大小改变时才会触发,也就是说当你双击浏览器顶部放大缩小或者手动拖拽浏览器边角调整大小时都会触发该事件,此时就会误执行相关逻辑。
在这里插入图片描述

这里还是应该使用 fullscreenchange 事件去监听的,这是原生 FullScreen API中提供的,使用样例如下:

document.documentElement.addEventListener('fullscreenchange', () => {});

第三方库

虽然官方提供了 FullScreen API ,但是对于浏览器版本还是有限制的,且不同浏览器中的API也略有不同,如果自行实现的话需要对各个浏览器做适配,这里建议使用 screenfull 库

你可以通过它封装的API去简便的实现全屏逻辑,如下:

import screenfull from 'screenfull';function toggleFullScreen(): void {if (!screenfull.isEnabled) {message.warn('当前浏览器版本不支持全屏');return;}if (screenfull.isFullscreen) {isFullScreen.value = false;screenfull.exit();} else {isFullScreen.value = true;screenfull.request();}
}

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

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

相关文章

LeetCode 算法:翻转二叉树 c++

原题链接🔗:翻转二叉树 难度:简单⭐️ 题目 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 示例 …

面对.rmallox勒索病毒:如何有效防范及应对

引言: 在当今数字化社会,网络安全问题日益严重,勒索病毒成为企业和个人不可忽视的威胁之一。最近出现的.rmallox勒索病毒更是给全球各地的用户带来了严重的数据安全问题。本文将探讨.rmallox勒索病毒的特点、感染方式及应对策略,…

【D3.js in Action 3 精译】1.1.3 D3.js 的工作原理

译者注 上一节我们探讨了 D3.js 的适用场景——需要高度定制化、可以尽情释放想象力的复杂图表。这一节我们再跟随作者的视角,看看 D3.js 的工作原理究竟是怎样的。 1.1.3 D3.js 的工作原理 您可能已经体验过 D3 并且发现它不太容易上手。这也许是因为您把它当成了…

Oracle 23ai的Windows平台版本发布了

Oracle 23ai free的版本之前只有Linux平台的版本,刚刚增加了Windows平台的版本,这里尝一下鲜。 关于号主,姚远: Oracle ACE(Oracle和MySQL数据库方向)华为云最有价值专家《MySQL 8.0运维与优化》的作者拥有…

UI设计必备的6个网站,赶紧收藏!

6个UI设计必备网站,找素材、找灵感一步到位,赶紧收藏起来吧! 1、菜鸟图库 UI图片素材-UI图片模板免费下载 - 菜鸟图库 菜鸟图库提供了超多免费设计素材,在这里你可以找到平面、UI、电商等设计类素材,还有大量的高清背…

AI视频教程下载-数据分析中的提示工程:Python、Pandas、ChatGPT

Prompt Engineering for Data Analysis Python, Pandas, ChatGPT ChatGPT与Python:无需编程。借助ChatGPT、Python、Pandas及提示工程进行数据分析与数据可视化 "利用Python、Pandas和ChatGPT进行数据分析的提示工程"是一门开创性的课程,它通…

《昇思25天学习打卡营第5天|onereal》

ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型,和MobileNet, SqueezeNet等一样主要应用在移动端,所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操作:Pointw…

添加用户页面(Flask+前端+MySQL整合)

首先导入Flask库和pymysql库。Flask用于创建Web应用程序,pymysql用于连接和操作MySQL数据库。 from flask import Flask, render_template, request import pymysql创建一个Flask应用实例。__name__参数告诉Flask使用当前模块作为应用的名称。 app Flask(__name_…

[Go Web] Kratos 使用的简单总结

文章目录 1.Kratos 简介2.传输协议3.日志4.错误处理5.配置管理6.wire 1.Kratos 简介 Kratos并不绑定于特定的基础设施,不限定于某种注册中心,或数据库ORM等,所以您可以十分轻松地将任意库集成进项目里,与Kratos共同运作。 API -&…

老无忧,成熟人士都在玩的社交app

随着互联网向不同年龄群体的进一步渗透,越来越多大龄人士逐步在传统以年轻人为主的平台中搭建起自己的空间,对缔结社交关系的需求也变得强烈起来。老无忧无忧交友app应运而生,于2024年6月1日正式上线(以下简称“老无忧”&#xff…

校园圈子小程序系统搭建需求和需要哪些功能?APP小程序H5前后端源码交付

功能:小程序授权登陆,支持app双端,小程序,h5,pc端,手机号登陆,发帖,建圈子、发活动。可置顶推荐帖子,关注、粉 丝、点赞等。可作为圈子贴吧、小红书、校园社区、表白墙、…

【Lua小知识】Vscode中Emmylua插件大量报错的解决方法

起因 Vscode写Lua用的好好的,最近突然出现了大量报错。 看报错是有未定义的全局变量,这里查日志才发现是由于0.7.5版本新增诊断启用配置,所以导致了原先好的代码,现在出现了大量的报错。 解决方案一 最直接的方法当然是在配置中直…

java周测总结(3)

1、什么是I0流? 是一串流动的字符,从先进先出的方式要求信息的通道。 2、什么是序列化?什么是反序列化? 序例化是将对象的状态存储到特定的存储介质中的过程反序例化是将特定的有合者公质中数据重新构建对象的过程。 3、Java中线程在哪个包下…

Python基于逻辑回归分类模型、决策树分类模型、随机森林分类模型和XGBoost分类模型实现乳腺癌分类预测项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 在当今医疗健康领域,乳腺癌作为威胁女性健康的主要恶性肿瘤之一,其早期诊断与精…

点击获取2024SIAL西雅国际食品展上海展后报告

随着2024年SIAL 西雅展(上海)的圆满落幕,我们不仅见证了一场食品与饮料行业的国际盛会,更是感受到了上海这座城市独有的魅力与活力。在这里,我们回顾了上海展的辉煌成就,同时,我们也满怀期待地展…

Hadoop版本演变、分布式集群搭建

Hadoop版本演变历史 Hadoop发行版非常的多,有华为发行版、Intel发行版、Cloudera Hadoop(CDH)、Hortonworks Hadoop(HDP),这些发行版都是基于Apache Hadoop衍生出来的。 目前Hadoop经历了三个大的版本。 hadoop1.x:HDFSMapReduce hadoop2.x…

# [0628] Task04 DQN 算法及进阶

easy-rl PDF版本 笔记整理 P6 - P8 joyrl 比对 补充 P7 - P8 相关 代码 整理 待整理 !! 最新版PDF下载 地址:https://github.com/datawhalechina/easy-rl/releases 国内地址(推荐国内读者使用): 链接: https://pan.baidu.com/s/1i…

C++笔记:实现一个字符串类(构造函数、拷贝构造函数、拷贝赋值函数)

实现一个字符串类String&#xff0c;为其提供可接受C风格字符串的构造函数、析构函数、拷贝构造函数和拷贝赋值函数。 声明依赖文件 其中ostream库用于打印标准输入输出&#xff0c;cstring库为C风格的字符串库 #include <iostream> #include <cstring> 声明命…

基于lio-sam的重定位和增量式建图

文章目录 遇到的问题解决思路预览效果详细过程预先构建地图订阅初始估计姿态加载全局地图ICP配准计算初始位姿参考遇到的问题 为了复用上个生命周期录制的轨迹,我需要用到重定位功能,现有的开源方案中,可以实现该功能,但存在以下问题:在预先构建的地图之外,无法实现定位…

车辆轨迹预测系列 (五):Argoverse API Forecasting Tutorial代码解析

车辆轨迹预测系列 (五)&#xff1a;Argoverse API Forecasting Tutorial代码解析 文章目录 车辆轨迹预测系列 (五)&#xff1a;Argoverse API Forecasting Tutorial代码解析一、argoverse.data_loading.argoverse_forecasting_loader二、argoverse.visualization.visualize_seq…