当前位置: 首页 > article >正文

3.6 Browser -- useFullscreen

3.6 Browser – useFullscreen

https://vueuse.org/useFullscreen

作用

响应式的Fullscreen API。可以让特定的元素占满屏幕,就是全屏的效果。

官方示例

const el = ref<HTMLElement | null>(null)

const { isFullscreen, enter, exit, toggle } = useFullscreen(el)
<video ref='el'>

通过函数调用的方式,让video可以实现全屏效果。

源码分析

https://github.com/vueuse/vueuse/blob/main/packages/core/useFullscreen/index.ts

源码中对多种浏览器进行了适配,这种适配的思路需要学习一下。

功能实现简单来说就两条:target.requestFullscreen打开全屏,document.exitFullscreen退出全屏。

const functionsMap: FunctionMap[] = [
  [
    'requestFullscreen',
    'exitFullscreen',
    'fullscreenElement',
    'fullscreenEnabled',
    'fullscreenchange',
    'fullscreenerror',
  ],
  // New WebKit
  [
    'webkitRequestFullscreen',
    'webkitExitFullscreen',
    'webkitFullscreenElement',
    'webkitFullscreenEnabled',
    'webkitfullscreenchange',
    'webkitfullscreenerror',
  ],
  // ......
]

export function useFullscreen(
  target?: MaybeElementRef,
  options: UseFullscreenOptions = {},
) {
  const { document = defaultDocument, autoExit = false } = options
  const targetRef = target || document?.querySelector('html')
  const isFullscreen = ref(false)
  
  // 取数组第一项定义的方法名
  let map: FunctionMap = functionsMap[0]

  const isSupported = useSupported(() => {
    if (!document) {
      return false
    }
    else {
      for (const m of functionsMap) {
        if (m[1] in document) {
          map = m
          return true
        }
      }
    }
    return false
  })

  // [
   		 'requestFullscreen',
   		 'exitFullscreen',
   		 'fullscreenElement',
   		 'fullscreenEnabled', // 这条被跳过了,通过留空的方式
   		 'fullscreenchange',
   		 'fullscreenerror',  // 最后一条没有解构
  // ],
  const [REQUEST, EXIT, ELEMENT,, EVENT] = map

  async function exit() {
    if (!isSupported.value)
      return
    
    // 如果当前有全屏的元素 document.fullscreenElement,退出全屏模式,修改isFullscreen
    if (document?.[ELEMENT])
      await document[EXIT]()

    isFullscreen.value = false
  }

  async function enter() {
    if (!isSupported.value)
      return
		// 先尝试退出全屏
    await exit()

    const target = unrefElement(targetRef)
    if (target) {
      // target.requestFullscreen 请求全屏
      await target[REQUEST]()
      isFullscreen.value = true
    }
  }

  // 切换
  async function toggle() {
    if (isFullscreen.value)
      await exit()
    else
      await enter()
  }

  if (document) {
    useEventListener(document, EVENT, () => {
      isFullscreen.value = !!document?.[ELEMENT]
    }, false)
  }

  if (autoExit)
    tryOnScopeDispose(exit)

  return {
    isSupported,
    isFullscreen,
    enter,
    exit,
    toggle,
  }
}

http://www.kler.cn/a/286893.html

相关文章:

  • 学生管理系统C++版(简单版)详解
  • 初阶5 排序
  • windows平台intel-vpl编译
  • 基于微信小程序高校订餐系统的设计与开发ssm+论文源码调试讲解
  • 经验收录/用复盘的心态去学习
  • html简单项目案例
  • 深度解析C++中函数重载与引用
  • 编译原理简介
  • 【例003】利用MATLAB绘制有趣平面图形
  • python脚本如何用sleep
  • 深度学习模型量化方法
  • 深入探索 HarmonyOS 的 CustomDialog 组件:高级特性与使用场景
  • TCP和UDP的主要区别以及应用场景
  • 【数据结构】二叉树的链式结构,二叉树的遍历,求节点个数以及高度
  • UE5 Widget文件编译Bug
  • 介绍一下SOME/IP 的Session handing功能
  • vscode 远程SSH连接并配置C/C++开发环境
  • 基于web的校园社区平台
  • axios发送post请求实例
  • Node 缓存、安全与鉴权
  • 【网络安全】WordPress Uncontrolled Resource Consumption
  • 告别AI痕迹:如何让Midjourney创作更自然
  • 数仓架构:离线数仓、实时数仓Lambda和Kappa、湖仓一体数据湖
  • 深度学习100问47:什么是RNN的正则化,为什么说RNN的正则化很重要
  • MATLAB/Simulink 汽车ABS仿真模型 防抱死刹车 教程 资料 程序 模型 论文 视频
  • 【const】const 修饰符——更安全、更可靠的代码。