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

React 全屏问题解决方案

1、全屏下弹窗被遮挡的问题

参考:https://www.jianshu.com/p/b22d1ad9533e

原因: 需要全屏的节点部分被传入 screenfull 中,弹窗的层级永远低于全屏,所以被遮挡。

解决方法
方式1:把整个 body 全屏,真正需要全屏的内容通过样式处理成全屏的样子。这样既可以利用全屏的ESC和自带的退出按钮,又不会存在遮挡弹窗的问题。
方式2:直接iframe嵌入,不会有遮挡问题,但加载会慢点

代码如下

const TestFullScreen: React.FC<Props> = props => {
  const reportContent = useRef<HTMLIFrameElement>(null);
  const [isFullscreen, setIsFullscreen] = useState(false);

  const fullScreen = () => {
    if (!document.fullscreenElement) {
      setIsFullscreen(false);
    }
  };

  useEffect(() => {
    // 监听全屏事件
    document.addEventListener('fullscreenchange', fullScreen);
    return () => {
      document.removeEventListener('fullscreenchange', fullScreen);
    };
  }, []);

  const onFullScreenClick = () => {
    // 把body全屏: 解决全屏下弹窗被遮挡的问题
    document.querySelector('body')?.requestFullscreen();
    // 需要全屏的内容通过样式处理
    setIsFullscreen(true);
  };

  return (
    <div className='test-fullscreen'>
      <button onClick={onFullScreenClick}>全屏测试</button>
      <div
        // 全屏时,通过fixed 铺满全屏
        className={
          isFullscreen
            ? 'fixed z-[100] top-0 left-0 w-screen h-screen'
            : 'h-full'
        }
        ref={reportContent}
      >
        {/* 有孩子节点就直接渲染,没有就iframe嵌入url */}
        {props?.children ? props.children : <iframe url={url} />}
      </div>
    </div>
  );
};

2、退出后的元素的宽高还是全屏时的宽高

在退出全屏时,重新设置宽高

const fullScreen = () => {
  if (!document.fullscreenElement) {
    setIsFullscreen(false);
    // 当没有children时,为iframe嵌入,不会有这个问题,不需要处理
    if (reportContent.current && props?.children) {
      reportContent.current.style.width = '100%';
      reportContent.current.style.height = 'calc(100% - 40px)';
    }
  }
};

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

相关文章:

  • Java面向对象编程进阶之包装类
  • 【专题】计算机网络之网络层
  • MacOS 本地生成SSH key并关联Github
  • 基于Python+Django+Vue3+MySQL实现的前后端分类的商场车辆管理系统
  • webpack loader全解析,从入门到精通(10)
  • MyBatisPlus 用法详解
  • 8. GIS数据分析师岗位职责、技术要求和常见面试题
  • 计算polydata相交
  • 【数据结构算法经典题目刨析(c语言)】使用数组实现循环队列(图文详解)
  • Opencv中的直方图(3)直方图比较函数compareHist()的使用
  • 原码、反码、补码及用途
  • 微信小程序开发,使用神卓互联内网穿透做公网地址回调的教程
  • python测试开发基础---线程和进程的概念
  • pytorch初始化张量并填充随机整数值
  • 【Linux详解】命令行参数|环境变量
  • OpenAI SORA团队负责人 通往智能的方式 报告笔记
  • 网络层 V(IPv6)【★★★★★★】
  • k8s-pod 实战三 (Liveness Probe 和 Readiness Probe 详细分析)
  • Stage 模型应用程序包的结构
  • Java设计模式【命令模式】-行为型
  • 国内领先线上运动平台:如何借助AI技术实现业务腾飞与用户体验升级
  • HarmonyOS开发实战( Beta5版)合理使用动画丢帧规范实践
  • 替换Windows AD时,网络准入场景如何迁移对接国产身份域管?
  • Linux——中间件、数据库(理论)
  • 2024高教社杯全国大学生数学建模竞赛(A题)深度剖析 _ 建模完整过程+详细思路+代码全解析
  • Quartz.Net_依赖注入