You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ReactJS中如何实现全屏切换、监听全屏事件并更新UI?

React 全屏功能完整实现方案

下面是一个简洁且兼容多浏览器的React解决方案,通过自定义Hook封装全屏逻辑,可满足你所有需求:

自定义Hook:useFullscreen

这个Hook封装了跨浏览器的全屏API调用,以及状态监听逻辑:

import { useState, useEffect, useCallback } from 'react';

const useFullscreen = (targetRef) => {
  const [isFullscreen, setIsFullscreen] = useState(false);

  // 兼容不同浏览器的全屏API
  const fullscreenAPI = {
    request: element => {
      if (element.requestFullscreen) return element.requestFullscreen();
      if (element.webkitRequestFullscreen) return element.webkitRequestFullscreen();
      if (element.mozRequestFullScreen) return element.mozRequestFullScreen();
      if (element.msRequestFullscreen) return element.msRequestFullscreen();
      return Promise.reject(new Error('全屏API不被当前浏览器支持'));
    },
    exit: () => {
      if (document.exitFullscreen) return document.exitFullscreen();
      if (document.webkitExitFullscreen) return document.webkitExitFullscreen();
      if (document.mozCancelFullScreen) return document.mozCancelFullScreen();
      if (document.msExitFullscreen) return document.msExitFullscreen();
      return Promise.reject(new Error('全屏API不被当前浏览器支持'));
    },
    getElement: () => {
      return document.fullscreenElement || 
             document.webkitFullscreenElement || 
             document.mozFullScreenElement || 
             document.msFullscreenElement;
    },
    eventName: 'fullscreenchange webkitfullscreenchange mozfullscreenchange MSFullscreenChange'
  };

  // 更新全屏状态
  const updateFullscreenStatus = useCallback(() => {
    setIsFullscreen(!!fullscreenAPI.getElement());
  }, []);

  // 监听全屏状态变化
  useEffect(() => {
    const eventNames = fullscreenAPI.eventName.split(' ');
    eventNames.forEach(name => document.addEventListener(name, updateFullscreenStatus));
    
    return () => {
      eventNames.forEach(name => document.removeEventListener(name, updateFullscreenStatus));
    };
  }, [updateFullscreenStatus]);

  // 进入全屏
  const enterFullscreen = useCallback(async () => {
    if (!targetRef.current) return;
    try {
      await fullscreenAPI.request(targetRef.current);
    } catch (err) {
      console.error('进入全屏失败:', err);
    }
  }, [targetRef]);

  // 退出全屏
  const exitFullscreen = useCallback(async () => {
    try {
      await fullscreenAPI.exit();
    } catch (err) {
      console.error('退出全屏失败:', err);
    }
  }, []);

  // 切换全屏状态
  const toggleFullscreen = useCallback(() => {
    if (isFullscreen) {
      exitFullscreen();
    } else {
      enterFullscreen();
    }
  }, [isFullscreen, enterFullscreen, exitFullscreen]);

  return {
    isFullscreen,
    enterFullscreen,
    exitFullscreen,
    toggleFullscreen
  };
};

export default useFullscreen;

组件使用示例

在你的React组件中,通过Ref指定目标元素,使用Hook提供的方法和状态:

import { useRef } from 'react';
import useFullscreen from './useFullscreen';

function FullscreenDemo() {
  const contentRef = useRef(null);
  const { isFullscreen, toggleFullscreen } = useFullscreen(contentRef);

  return (
    <div>
      <button onClick={toggleFullscreen}>
        {isFullscreen ? '退出全屏' : '进入全屏'}
      </button>
      
      <div ref={contentRef} style={{ width: '80%', margin: '20px auto', padding: '20px', backgroundColor: '#f0f0f0' }}>
        <h2>{isFullscreen ? '当前处于全屏模式' : '点击按钮切换全屏'}</h2>
        <p>这是需要控制全屏的内容区域</p>
      </div>
    </div>
  );
}

export default FullscreenDemo;

方案说明

  • 跨浏览器兼容:Hook内部处理了不同浏览器的API前缀(webkit、moz、ms),覆盖主流桌面和移动浏览器。
  • 状态自动同步:通过监听全屏变化事件,无论用户是通过按钮、ESC键还是手机返回键切换全屏,isFullscreen状态都会自动更新,确保UI同步。
  • 简洁易用:自定义Hook封装了所有复杂逻辑,组件中只需通过Ref指定目标元素,调用方法即可实现功能。
  • 错误处理:对API调用失败的情况添加了错误捕获,避免程序崩溃。

内容的提问来源于stack exchange,提问作者cavpollo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 21:55:17