[缺陷] 会话面板内的插件模态无法逃离所在 pane 的层叠上下文(z-index 99999 输给兄弟 pane 的 z-index 8) #6440
Unanswered
chenshi723
asked this question in
Q&A
Replies: 1 comment 1 reply
|
你的 elementsFromPoint 实测已经证明了结构性问题本身(对话框与手柄不在同一层叠上下文),这个结论不依赖根因猜测。逐条核对我能核的部分:
(基于 0.1.5-rc.2 源码核对;未核实的部分已在文中标出。) |
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
摘要
插件渲染在会话区里的弹窗,无法盖住兄弟 pane 的内容。它写的 z-index: 99999 完全失效,于是另一个 pane 里一个 40px 宽、看不见的拖拽手柄(z-index: 8)会吃掉本该属于弹窗的点击。同一个元素在触屏上还会留下一条常亮的悬停指示条。
环境
复现步骤
实际结果
点击被 div.wSkVaW_widthHandle 吃掉(40px 宽、position: absolute; z-index: 8),尽管对话框是 position: fixed; z-index: 99999 且在视觉上位于最上层。用户能感知到的现象是:「点那几个标签不灵敏,得点好几下」。
在该手柄中心用 document.elementsFromPoint 实测的绘制顺序(从最上层到最下层):
div.dshadb_scrim z:99998 fixed <- 插件对话框的遮罩
div.EvIC1a_scroll z:auto static
div.EvIC1a_root z:auto relative
div.wSkVaW_viewArea z:auto static
div.wSkVaW_scrollBody z:auto static
div.wSkVaW_body z:auto relative
div.wSkVaW_root z:auto relative
从两个元素各自向上找到最近的「自成层叠上下文的祖先」:
模态的上下文根 = div.dshadb_scrim(它自己的遮罩)
手柄的上下文根 = div.wSkVaW_body
=> 两者不在同一个层叠上下文
期望结果
一个 position: fixed 且 z-index: 99999 的对话框,应当绘制并命中测试于 z-index: 8 的 absolute 元素之上,并且不应被兄弟 pane 的内容遮挡。
推测的根因
dsh-client-ui-conversation 中有这样一条规则:
.pXSMma_body>*{ z-index:1; position:relative }
它让会话正文的每一个直接子元素都各自成为一个层叠上下文。于是渲染在 pane A 内部的 fixed 元素永远无法逃出 pane A,而 pane B(装着 .wSkVaW_widthHandle 的聊天 pane)整体绘制在 pane A 之上。对话框自己写多大的 z-index 都失去意义,只有各个 pane 的相对顺序在起作用。
建议的修法
同一元素的第二个症状
.wSkVaW_widthHandle::after 是拖拽指示条(默认 opacity: 0,:hover / [data-dragging] 时为 1)。在 hover: none 设备上,触摸会留下 sticky hover,指示条被永久点亮,表现为一条来路不明的灰色竖条画在无关界面上。应当用指针能力查询把它关掉。
本地临时规避
本地一个纯 CSS 插件对 @media (hover: none) 施加了:
[class*="widthHandle"]::after { display: none !important; }
[class*="widthHandle"] { pointer-events: none !important; }
这能止住这一个手柄的症状,但结构性问题依旧存在 —— 任何在会话 pane 内渲染模态的插件都会中招。
All reactions