首页 > 其他分享 >全屏API及vue3 hook封装

全屏API及vue3 hook封装

时间:2023-11-23 17:14:21浏览次数:37  
标签:const isFullScreen fullscreenElement hook API 全屏 document

最近在一个大屏项目遇到一个需求:用户可以通过一个按钮,触发页面部分模块全屏。通过以下API可以实现:

Element.requestFullscreen()方法用于发出异步请求使元素进入全屏模式。

且全屏状态变化会触发以下事件:

fullscreenchange 事件会在浏览器进入或退出全屏模式后立即触发。

基于以上API和事件,封装了一个简单的全屏hook

  • 响应式的全屏状态
  • 可以指定元素进入/退出全屏模式
import { onMounted, onUnmounted, ref } from "vue";

export default function useFullScreen() {
  // 响应式全局状态
  const isFullScreen = ref<boolean>(!!document.fullscreenElement);

  function fullscreenchanged() {
    // 如果有元素处于全屏模式,则 document.fullscreenElement 将指向该元素。如果没有元素处于全屏模式,则该属性的值为 null。
    if (document.fullscreenElement) {
      isFullScreen.value = true;
    } else {
      isFullScreen.value = false;
    }
  }

  onMounted(() => {
    // 通过 ESC 键可以退出全屏
    // 监听全屏事件,判断当前是否处理全屏状态
    document.addEventListener("fullscreenchange", fullscreenchanged);
  });

  onUnmounted(() => {
    document.removeEventListener("fullscreenchange", fullscreenchanged);
  });

  const fullScreen = async (dom?: HTMLElement) => {
    if (!document.fullscreenElement) {
      dom && dom.requestFullscreen();
    }
  };

  const exitFullScreen = () => {
    if (document.fullscreenElement) {
      document.exitFullscreen();
    }
  };

  return {
    isFullScreen,
    fullScreen,
    exitFullScreen,
  };
}

使用示例

const { isFullScreen, fullScreen, exitFullScreen } = useFullScreen();

// 点击触发全屏
const clickHandle = () => {
  dom && fullScreen(dom)
} 

而且需要特别注意,全屏模式,只能由用户行为触发。比如无法一进入页面就由JS直接调起全屏,此时会有错误提示

Failed to execute 'requestFullscreen' on 'Element': API can only be initiated by a user gesture.

就算是创建一个元素,然后模拟触发点击事件也不行。只能由真实的用户行为触发。

标签:const,isFullScreen,fullscreenElement,hook,API,全屏,document
From: https://www.cnblogs.com/shapeY/p/17851986.html

相关文章

  • CreateIndex API执行流程_milvus源码解析
    CreateIndexAPI执行流程源码解析milvus版本:v2.3.2整体架构:CreateIndex的数据流向:1.客户端sdk发出CreateIndexAPI请求。importnumpyasnpfrompymilvusimport(connections,FieldSchema,CollectionSchema,DataType,Collection,)num_entities,......
  • CreateIndex API执行流程_milvus源码解析
    CreateIndexAPI执行流程源码解析milvus版本:v2.3.2整体架构:CreateIndex的数据流向:1.客户端sdk发出CreateIndexAPI请求。importnumpyasnpfrompymilvusimport(connections,FieldSchema,CollectionSchema,DataType,Collection,)num_entities,......
  • ES插入报错 索引只读:blocked by: [FORBIDDEN/12/index read-only / allow delete (ap
     ES插入报错:reason:ElasticsearchException[Elasticsearchexception[type=cluster_block_exception,reason=blockedby:[FORBIDDEN/12/indexread-only/allowdelete(api)];]]   这种大多都是因为磁盘空间不足了超过设置的阈值,一般80%所以索引变成只读了,要把空......
  • OpenHarmony之NAPI框架介绍
     张志成诚迈科技高级技术专家 NAPI是什么NAPI的概念源自Nodejs,为了实现javascript脚本与C++库之间的相互调用,Nodejs对V8引擎的api做了一层封装,称为NAPI。可以在Nodejs官网(https://nodejs.org/dist/latest-v20.x/docs/api/n-api.html)上查看各种NAPI接口定义说明。可以......
  • 使用Python调用API接口获取小红书笔记详情数据
    本文将详细介绍如何使用Python编程语言调用小红书API接口,以获取小红书笔记的详情数据。我们将从以下几个方面展开讨论:1)API接口简介;2)Python环境准备;3)API密钥获取;4)使用Requests库发送API请求;5)解析响应数据;6)异常处理与错误排查。一、API接口简介API(应用程序编程接口)是一种......
  • MFC-ODBC API动态连接配置数据库
    一、ODBC管理器介绍在Window中,ODBC数据远管理器有6个标签:用户DSN、系统DSN、文件DSN、驱动程序、跟踪、连接池,通常情况下,使用用户DSN或者系统DSN,这里主要了解用户DSN和系统DSN即可。用户DSN:ODBC用户数据源存储了如何与指定的数据库提供者连接的信息,只有当前用户可见。系统DSN:O......
  • .NET8:快速集成Rapid.NET三维控件
    .NET8正式版本发布了,AnyCADRapid.NET针对.NET8进行了升级和优化。本文以WPF项目为例介绍在.NET8中使用AnyCADRapid.NET三维控件。1从.NET6升级若之前使用NET6升级到.NET8,升级过程非常简单,升级到AnyCADRapid.NET最新版本后,仅需要更改以下两处:(1).csproj文件<TargetFramewor......
  • 关于FastAPI与Vue3的通信
    学习一下前后端分离技术,前端采用三大框架之一的Vue.js,后端则采用Python的FastAPI框架。一、前端设计1.建目录mydemo2.在mydemo目录下打开命令行,运行:npminitvue@latest(这里如果cmd卡死了,就ctrl+C结束,再次运行npminitvue@latest)3.工程名设置为 frontend ,其余按默......
  • Windows下mDNS查询API—DnsStartMulticastQuery/DnsStopMulticastQuery的使用
    背景及问题:目前很多局域网设备通过mNDS协议实现互联,IP地址为自动IP段-169.254.x.x,有时候设备厂家提供的API需要通过知晓局域网中的IP地址/设备名,才能连接该设备。这样要求每个软件必须配置设备名或者启动时遍历所有IP(6w+),不是很方便,这时候可以通过mDNS查询,自动拿到设备名,再进行连......
  • Reflect API:每个 JavaScript 开发人员都需要的瑞士军刀
    前言您是否曾经希望拥有一个神奇的工具包,可以让您像超级英雄一样控制JavaScript对象?向ReflectAPI打个招呼吧,它是ES6中引入的一个新的全局对象,它能够处理简单的代码操作。它是每个现代JavaScript开发人员都需要的瑞士军刀!......