1. 现象复现:当弹窗遇上局部全屏
最近在开发数据监控大屏时遇到一个棘手的问题:当使用screenfull.js将某个图表区域局部全屏后,ElementUI的Notification组件弹出的告警消息竟然"消失"了。这就像你在电影院看IMAX电影时,服务员递来的爆米花突然穿过屏幕掉进了电影里——明明该出现在眼前的提示,却怎么都找不到。
具体场景是这样的:我们有一个实时监控系统,当服务器推送异常告警时,前端会通过this.$notify()弹出警告。在普通状态下一切正常,但只要把某个图表区域全屏展示,Notification就会神秘失踪。即使把z-index调到9999也无济于事,就像这样:
javascript复制// 全屏操作
handleScreen() {
if (!screenfull.isEnabled) return
screenfull.toggle(this.$refs.fullscreen) // 针对特定DOM元素全屏
}
// 弹出通知
this.$notify({
title: 'CPU过载警告',
message: '服务器A的CPU使用率已达95%',
type: 'warning',
duration: 0,
offset: 100
})
这个问题在需要长时间全屏展示又必须及时响应告警的场景下尤为致命。想象一下运维人员在全屏查看监控曲线时,完全错过了服务器宕机的预警通知,这简直是灾难性的体验。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 原理溯源:层叠上下文的"结界"效应
为什么全屏元素会"吞噬"弹窗?这要从CSS的层叠上下文(Stacking Context)说起。可以把层叠上下文理解为HTML中的"平行宇宙",每个宇宙有自己独立的z轴空间。当元素满足以下条件时会创建新的层叠上下文:
- position不为static且z-index不为auto
- opacity小于1
- transform不为none
- filter不为none
- 全屏元素(fullscreen API触发时)
关键问题在于:ElementUI的Notification默认挂载在body下,而局部全屏的元素会创建一个新的层叠上下文,这个上下文就像玻璃天花板,把body中的弹窗"压"在了下面。即使你把弹窗的z-in
