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

React中设置body全屏时隐藏指定元素的实现方法

解决React全屏时隐藏指定组件的问题

要搞定React项目里点击ItemsPage的全屏按钮后,隐藏<First/>、<TopComponent/>、<NavBar/>这些组件的需求,咱们可以通过监听全屏状态变化+控制组件显隐的方式来实现,下面是两种实用的方案:

方案一:React状态+条件渲染(推荐)

这种方式通过顶层组件维护全屏状态,直接控制组件的显示与隐藏,逻辑清晰,适合大多数React项目。

1. 改造主应用组件

在你的主应用组件中添加状态管理和全屏事件监听:

class App extends React.Component {
  state = {
    isFullscreen: false
  };

  componentDidMount() {
    // 监听全屏状态变化——用户可能用ESC键退出全屏,所以必须监听这个事件
    document.addEventListener('fullscreenchange', this.updateFullscreenState);
    // 兼容不同浏览器的前缀
    document.addEventListener('webkitfullscreenchange', this.updateFullscreenState);
    document.addEventListener('mozfullscreenchange', this.updateFullscreenState);
  }

  componentWillUnmount() {
    // 组件卸载时移除监听,避免内存泄漏
    document.removeEventListener('fullscreenchange', this.updateFullscreenState);
    document.removeEventListener('webkitfullscreenchange', this.updateFullscreenState);
    document.removeEventListener('mozfullscreenchange', this.updateFullscreenState);
  }

  updateFullscreenState = () => {
    // 判断当前是否处于全屏模式,更新状态
    const isFull = !!(document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement);
    this.setState({ isFullscreen: isFull });
  };

  // 封装全屏请求方法,传给ItemsPage使用
  triggerFullscreen = () => {
    const elem = document.body;
    if (elem.requestFullscreen) {
      elem.requestFullscreen();
    } else if (elem.webkitRequestFullscreen) {
      elem.webkitRequestFullscreen();
    } else if (elem.mozRequestFullScreen) {
      elem.mozRequestFullScreen();
    }
  };

  render() {
    const { isFullscreen } = this.state;
    return (
      <>
        {/* 非全屏时显示,全屏时隐藏 */}
        {!isFullscreen && <First />}
        {!isFullscreen && <TopComponent />}
        <Switch>
          <Route>
            <div style={{ display: 'flex' }}>
              {/* 同样,全屏时隐藏NavBar */}
              {!isFullscreen && <NavBar />}
              <div className="content">
                <Switch>
                  <Route 
                    exact path="/" 
                    render={() => this.render_items({ triggerFullscreen: this.triggerFullscreen })} 
                  />
                </Switch>
              </div>
            </div>
          </Route>
        </Switch>
      </>
    );
  }
}

2. 调整ItemsPage组件

把全屏触发方法改为使用父组件传递过来的函数:

class ItemsPage extends React.PureComponent {
  render = () => {
    const { triggerFullscreen } = this.props;
    return (
      <button onClick={triggerFullscreen}>fullscreenbtn</button>
    );
  };
}

方案二:CSS类控制显隐

如果你的项目更倾向于用样式来控制,也可以给body添加全屏类,通过CSS隐藏指定组件:

1. 主应用组件添加类切换逻辑

updateFullscreenState = () => {
  const isFull = !!(document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement);
  // 给body添加/移除全屏类
  document.body.classList.toggle('is-fullscreen', isFull);
};

2. 添加CSS样式

/* 全屏模式下隐藏指定组件 */
body.is-fullscreen .first-comp,
body.is-fullscreen .top-comp,
body.is-fullscreen .nav-bar {
  display: none !important;
}

3. 给组件添加对应类名

<First className="first-comp" />
<TopComponent className="top-comp" />
<NavBar className="nav-bar" />

Hook版本(函数组件)

如果你的项目用的是函数组件,用useState和useEffect也能轻松实现:

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

function App() {
  const [isFullscreen, setIsFullscreen] = useState(false);

  useEffect(() => {
    const handleFullscreenChange = () => {
      const isFull = !!(document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement);
      setIsFullscreen(isFull);
      document.body.classList.toggle('is-fullscreen', isFull);
    };

    // 添加多浏览器兼容的事件监听
    const events = ['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange'];
    events.forEach(evt => document.addEventListener(evt, handleFullscreenChange));

    // 清理函数
    return () => {
      events.forEach(evt => document.removeEventListener(evt, handleFullscreenChange));
    };
  }, []);

  const triggerFullscreen = () => {
    const elem = document.body;
    if (elem.requestFullscreen) elem.requestFullscreen();
    else if (elem.webkitRequestFullscreen) elem.webkitRequestFullscreen();
    else if (elem.mozRequestFullScreen) elem.mozRequestFullScreen();
  };

  return (
    <>
      {!isFullscreen && <First />}
      {!isFullscreen && <TopComponent />}
      <Switch>
        <Route>
          <div style={{ display: 'flex' }}>
            {!isFullscreen && <NavBar />}
            <div className="content">
              <Switch>
                <Route exact path="/" render={() => <ItemsPage triggerFullscreen={triggerFullscreen} />} />
              </Switch>
            </div>
          </div>
        </Route>
      </Switch>
    </>
  );
}

这两种方案都能完美实现需求:不管是通过按钮触发全屏,还是用户按ESC退出全屏,指定组件都会自动显示/隐藏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:37:58