150%缩放下全屏模式检测失效 React如何实现全缩放级别兼容的全屏检测?
React兼容全缩放级别的全屏检测方案
原方案问题分析
原实现通过比对window.innerHeight与window.screen.height判断全屏的逻辑,会受页面缩放比例影响:页面缩放后逻辑像素和物理像素的映射关系发生变化,导致高度比对的结果失准,无法正确识别全屏状态。
最优解决方案:使用浏览器原生Fullscreen API
该方案基于W3C标准的全屏API实现,状态由浏览器底层直接维护,完全不受页面缩放、设备像素比、分辨率的影响,检测准确率100%。
实现代码
可以封装为通用的React自定义Hook,方便所有组件调用:
import { useState, useEffect } from 'react'; // 全屏检测自定义Hook function useFullScreenDetect() { const [isFullScreen, setIsFullScreen] = useState(false); useEffect(() => { // 检测当前全屏状态 const checkFullStatus = () => { // 标准属性判断,存在全屏元素即处于全屏状态 setIsFullScreen(!!document.fullscreenElement); }; // 组件挂载时先初始化一次状态 checkFullStatus(); // 监听全屏切换事件,状态变化时自动更新 document.addEventListener('fullscreenchange', checkFullStatus); return () => { document.removeEventListener('fullscreenchange', checkFullStatus); }; }, []); return isFullScreen; }
使用示例
在业务组件中直接调用即可获取实时全屏状态:
function App() { const isFullScreen = useFullScreenDetect(); return ( <div> <p>当前是否全屏:{isFullScreen ? '是' : '否'}</p> </div> ); }
低版本浏览器兼容处理
如果需要兼容旧版浏览器,可以补充前缀适配逻辑:
// 兼容多前缀的全屏状态检测 const checkFullStatus = () => { const fullEle = document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement; setIsFullScreen(!!fullEle); }; // 兼容多前缀的事件监听 const fullScreenEvents = [ 'fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange', 'MSFullscreenChange' ]; fullScreenEvents.forEach(event => { document.addEventListener(event, checkFullStatus); }); // 销毁时同步移除所有事件监听 return () => { fullScreenEvents.forEach(event => { document.removeEventListener(event, checkFullStatus); }); };
方案优势
- 不受任何页面缩放比例、系统设置影响,检测结果完全准确
- 仅在全屏状态切换时触发回调,相比监听resize事件性能开销降低90%以上
- 标准API支持所有现代浏览器,兼容逻辑简单易维护
内容的提问来源于stack exchange,提问作者MPK
相关产品推荐
相关产品推荐

