E4.10.3no nested modal设计研究

模态内不应再弹模态

别名: 模态套模态 · 对话框嵌套 · 层叠模态 · stacked dialogs

概念解释

一个已经阻断主流程的对话框里再打开另一个对话框,叫模态嵌套(nested modal)。外层还没被回答,内层又把外层锁住,人要先解决里层才能回到本层,再解决本层才能回到主任务。两层「必须响应」叠在一起,哪一层才是真正的前置条件变得说不清。这条禁的是对话框再套对话框,不是浮层总数的上限,也不是焦点怎么关。

机制

模态的合同是:你现在只面对这一个问题,答完就回到主表面。第二层模态改写合同:问题变成了问题的问题,返回栈从「主表面 ← 对话」变成「主表面 ← 外层 ← 内层」。工作记忆要同时挂两套未决决策,而且两套都自称紧急。内层若是外层的校验(「名称已占用,要改名吗」),它本应是外层里的一段内联错误,不该再锁一次。内层若是另一件不相干的事(会话过期、系统通知),它是在打断一个已经在打断的任务,紧急程度无法被合理排序。遮罩叠遮罩还会让外层看起来像主内容,关闭内层时人以为回到了应用,其实还困在外层。嵌套把「一次一个前置条件」这条模态赖以成立的规则自己拆掉了。

怎么研究

构造必须在对话框里完成的任务,一组把二级决策做成内联,一组再弹一个模态。记录完成时间、关错层、以为已经回到主界面的次数。自变量:内层是相关校验还是无关打断。因变量:层错误(关掉了不该关的那层)、任务放弃率。无关内层弹出时放弃率应最高。眼动或回放里看关闭动作落在哪一层的遮罩上。

边界

操作系统级的权限框、崩溃警告可能从应用模态之上再冒出来,应用无法禁止,但应用自己不要再叠加。向导里的步骤应换页或换面板,而不是一步一个模态。非模态的选择器(日期弹出)开在模态里,严格说也是一层浮层,只要它不自称模态、不锁外层对话、点外侧只关选择器,就不算模态嵌套。把外层先关再开新模态是换问题,不是嵌套——前提是外层的状态被明确保存或丢弃。

怎么落地

  • 对话框内的校验、二次确认、说明改用内联或展开,不新开对话框。
  • 会话过期一类全局事件到来时,关掉或挂起当前模态再处理全局事件,而不是盖在上面。
  • 需要另一份完整对话时,先结束当前模态并交代状态,再开下一份。
  • 验证:走完一条带校验的提交,过程中数打开着的对话框。同一时刻大于一个,就还在嵌套。

延伸

  • 同组E4.10.1 模态阻断主流程,只用于必须响应的事项 · E4.10.2 模态需要焦点捕获与关闭后归还 · E4.10.4 模态必须有键盘可达的关闭方式
  • 相邻E4.16 浮层叠加与逃生 · E4.12 弹出层
  • 站内检索nested modal · dialog stacking · modal in modal

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/E4.10.3