解决全屏状态下modal模态框消失

文章讨论了在全屏状态下模态框无法正常显示的问题,提供了三种解决方案:1)利用nzGetContainer在老版本的ng-zorro中指定模态框容器;2)将整个body或document放入全屏以解决层级问题;3)推荐在全屏时动态添加模态框到全屏元素下,保持最小样式变动。
摘要由CSDN通过智能技术生成

问题描述

未在全屏状态下可以正常弹出模态框,而在全屏状态下模态框未出现,退出全屏后显示。        

 期望:

原因

在让元素进入全屏状态后,渲染和css层级是最高的且无法设置css的index企图让其他元素层级高于全屏元素,而在ModalService创建模态框后,模态框是绑定于body下的,并非大屏元素下,所以会造成在全屏模式下,模态框“未生成”,而退出全屏后模态框可见的现象

解决方案

<div style="display: flex;width: 3840px;position: relative;" id="full-screen-five">

            .....

</div>
 fullScreen() {
    /*判断是否全屏*/
    var ell = document.getElementById('full-screen-five');
    const el = ell as HTMLElement & {
      mozRequestFullScreen(): Promise<void>;
      webkitRequestFullscreen(): Promise<void>;
      msRequestFullscreen(): Promise<void>;
    };
    let isFullscreen =
        document['fullscreenElement'] || //W3C
        document['msFullscreenElement'] || //IE
        document['mozFullScreenElement'] || //火狐
        document['webkitFullscreenElement'] || //谷歌
        false;
        

    if (!isFullscreen) {
      if(el.requestFullscreen) {
        el.requestFullscreen();
      } else if (el.mozRequestFullScreen) {
        el.mozRequestFullScreen();
      } else if (el.webkitRequestFullscreen) {
        el.webkitRequestFullscreen();
      } else if (el.msRequestFullscreen) {
        el.msRequestFullscreen();
      }
    } else {
      if (document.exitFullscreen) {
        document.exitFullscreen();
      } else if (document['msExitFullscreen']) {
        document['msExitFullscreen']();
      } else if (document['mozCancelFullScreen']) {
        document['mozCancelFullScreen']();
      } else if (document['webkitCancelFullScreen']) {
        document['webkitCancelFullScreen']();
      }
    }
  }

方案一

在老版本的nz-zooro中,生成模态框时有个配置项为“nzGetContainer”,可以指定模态框绑定于某个元素下,即我们只要在大屏元素下加一个新元素用来绑定模态框即可

<div style="display: flex;width: 3840px;position: relative;" id="full-screen-five">

      <div id="contain"> </div>

</div>
const modal = this.modalService.create({

...,
nzGetContainer: document.getElementById('contain')

})

可惜在新版本的ng-zorro中,该配置项已经废除了 

方案二

将整个body元素或整个document进入全屏,即解决了层级不可跨越的问题。

document.documentElement.requestFullscreen()


优点:一次性解决问题,不需要在每个模态框去单独处理
缺点:由于把整个页面document都放进全屏了,那要实现原先的效果需要调整大屏的样式,把导航栏等覆盖掉,同时也要询问客户相关参数使得大屏元素适配客户的屏幕大小
(也可以api获取,动态去设置元素)去调试,时间沟通成本较高。

方案三:推荐

通过appendChild将单个模态框绑定在全屏元素下

const modal = this.modalService.create({...})
if(全屏状态){  //在全屏状态下在需要绑定在全屏元素下,否则造成层级混乱
   document.getElementById('full-screen-five').appendChild(model.containerInstance.elementRef.nativeElement);
}
    

优点: 不需要改变原有样式,变动小

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果你想要将 `react-modal` 模态框之外的区域变成透明,并只显示一个框,你可以使用 `overlayClassName` 属性和一些 CSS 样式。 首先,你需要在 `overlayClassName` 属性中指定一个自定义的类名,例如 `custom-overlay`: ```jsx <Modal isOpen={modalIsOpen} onRequestClose={closeModal} overlayClassName="custom-overlay" > {/* 模态框的内容 */} </Modal> ``` 然后,在 CSS 样式表中,你可以为 `custom-overlay` 类名设置样式,将其背景设置为透明,同时使用 `:before` 伪元素来显示一个框: ```css .custom-overlay { background-color: rgba(0, 0, 0, 0.5); } .custom-overlay:before { content: ""; position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 400px; height: 300px; border: 1px solid #ccc; background-color: #fff; z-index: 99; } ``` 在上面的样式中,我们首先将 `custom-overlay` 的背景设置为半透明的黑色,这样就可以将模态框之外的区域变为透明。 然后,我们使用 `:before` 伪元素来显示一个框。将 `content` 的值设置为空,这样就不会显示任何内容。使用 `position: fixed` 将框固定在页面上,并将 `top` 和 `left` 设置为 `50%`,将框居中。使用 `transform` 属性微调框的位置。将框的宽度和高度设置为你想要的大小,可以根据需要进行调整。将 `border` 设置为 1px 的灰色,使框更加明显。将 `background-color` 设置为白色,使框的内部变为白色。最后,将 `z-index` 设置为 99,使框显示在最上层。 这样,你就可以在 `react-modal` 的模态框之外显示一个透明的区域,并在其中只显示一个框了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值