全屏API及vue3 hook封装

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

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

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

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

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

  • 响应式的全屏状态
  • 可以指定元素进入/退出全屏模式
ts 复制代码
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,
  };
}

使用示例

tsx 复制代码
const { isFullScreen, fullScreen, exitFullScreen } = useFullScreen();

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

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

shell 复制代码
Failed to execute 'requestFullscreen' on 'Element': API can only be initiated by a user gesture.

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

相关推荐
围炉聊科技1 天前
Windows-MCP 拆解与实测:AI 操作 Windows 这件事——智能体基建系列
windows·llm·dom
冒险的豆子2 天前
Vue2 、Vue3 响应式对比及优劣
vue
NetX行者3 天前
用 Vite + Vue3 + UnoCSS 搭建企业级项目模板(一):基础骨架
vue·vite·unocss
java水泥工3 天前
什么是前端
java·vue·html5
mont evergreen4 天前
一封从外部世界寄来的信:二维码数据如何穿越三重门,抵达你的屏幕
electron·vue·事件
志尊宝5 天前
Vue3 零基础每日笔记(071):暗黑模式与主题切换——CSS 变量 + Element Plus 暗黑方案
前端·css·笔记·vue·html·前端开发·软件开发
怦然丶心动5 天前
用 Java 把干支历法算清楚:从节气切年到可读摘要
java·算法·vue·独立开发·spring boot / spring
我最爱吃鱼香茄子7 天前
【毕业设计优选】人力资源管理系统|Java|SpringBoot|Vue|前后端分离|带详细文档+部署教学视频
java·vue·毕业设计·springboot
骑着蜗牛撵大象3278 天前
SpringBoot+Vue3 企业智能体侧挂架构:独立服务、独立数据库与主线零侵入落地
数据库·spring boot·架构·vue·springboot·事件驱动·服务拆分
码艺-Alimjan10 天前
Tauri 网站To桌面应用实战总结
前端·javascript·vue