关于页面自定义弹窗的几个小点

221 阅读2分钟

相信大家在日常的开发中经常用到弹窗,但是一些组件弹窗有时候又没法完成我们的一些需求,所以我们需要自己写一个自定义弹窗,以此来满足需求,那么下面是我在实际应用中总结的两个痛点:

1.层级问题

不知道大家遇没遇到这样一种情况,在antd的弹窗上层再弹一层弹窗。

由于业务问题,我第二层弹窗用的是自己写的弹窗组件,结果写完一看,哦豁,自定义弹窗被antd弹窗压在下面了!

一开始我以为是我自己写的自定义弹窗层级不够高,然后z-index:99999,发现没用!继续找!

我仔细观察antd弹窗的样式,发现一个属性:transform: 'translateZ(1px)',经过反复测试,确实是这个属性惹的祸,那么他的作用呢?

官网解释是向z轴移动,在我理解看来就是抬高或者降低(个人理解),百度到的是防止在一些浏览器不能显示的问题,目前没遇到过!

最后在我的自定义弹窗里面加上这个属性,ok,解决了!!

2.滚动穿透问题

相信这个问题很多自定义弹窗都有,弹窗出现的时候,当我们滑动页面,遮罩层下面的内容跟着一起滚动!!

网上找了许多办法,好用的却没有,基本都是当弹窗出现的时候,页面设置

document.body.style.overflow = 'hidden';

当弹窗消失的时候,恢复正常

document.body.style.overflow = 'visible';

这个方法在PC 端可以,但是移动端就不怎么行了,用户不关闭弹窗的情况下,左右滑动退出当前页面,会发现页面滑动不了!

因为页面虽然退出了,但是弹窗销毁的时候,使页面恢复的事件没有执行导致的,也就是document.body.style.overflow = 'visible';没有执行!!

下面有两个解决方法

1.当弹窗打开时,开启监听 popstate ,此事件可以监听页面左右滑动,里面设置一个返回事件,当触发的时候阻止浏览器 goback(),而是执行回调 关闭弹窗!!

2.第二个方法;就是在自定义弹窗组件销毁的时候,执行document.body.style.overflow = 'visible';

虽然没有多少代码示例,更多的是思路想法,但还是欢迎大佬们多多指教!!