Design Vocabulary设计词汇 · 样本集 01

VOCABULARY / 词条

模态对话框

Modal Dialog

加入比较 +

覆盖在主内容之上的对话框,它使系统进入一种特殊模式:在用户明确处理该对话框之前,主内容被禁用、不可交互。

示意图 · 编辑插画,尚无可操作示例
虚构的 FIELDNOTES 应用界面被遮罩压暗,中央是一张带标题、一行正文、主次两个按钮和关闭控件的对话框卡片。
虚构的 FIELDNOTES 应用界面被遮罩压暗,中央是一张带标题、一行正文、主次两个按钮和关闭控件的对话框卡片。

识别特征

  • 对话框外的内容被遮罩且不可操作
  • 打开时焦点进入对话框,Tab 只在其内部循环
  • 有明确的关闭途径,关闭后焦点回到触发处

概念边界

不是所有弹出层都是模态:非模态对话框、气泡提示与渐进披露的展开都允许用户继续操作页面。判断标准是页面其余部分是否在对话框关闭前保持惰性;只要背景仍可点击或可获得焦点,就不应称为模态。

什么时候考虑它

  • 需要在不可逆操作前阻止关键错误
  • 继续用户自己发起的流程必须先取得一项必要信息
  • 需要把复杂流程切成必须逐步完成的小步骤

什么时候慎用

  • 内容与用户当前目标无关,例如订阅推广或非必要提示
  • 用户需要参考对话框外的信息才能作出决定
  • 任务可以在原位或旁路完成而不必打断

取舍

换来用户注意力的集中与错误预防,代价是打断当前任务;与目标无关的打断会被视为骚扰并削弱信任。

条件规则 · 编辑建议

当对话框打开必须把焦点移入对话框,并把 Tab 循环限制在其内部;关闭后把焦点送回触发元素。
当用户想放弃当前对话框必须提供显式的关闭或取消控件,并支持 Escape 关闭。
当对话框内已有未提交的输入建议点击遮罩不应无提示地丢弃输入;先确认或改为仅按钮关闭。

相关词条

渐进披露 ↗相关但不同 · 只是展开次要内容而不必阻断页面

渐进披露允许用户继续操作页面,模态则要求先处理再继续;不要因为内容是次要的就把它做成模态。

行内编辑 ↗条件替代 · 修改短字段且周边内容是有用的参照

原位编辑保留上下文,而模态会遮住用户可能需要参考的信息。

羞辱式拒绝文案 ↗可能误用为 · 用带羞辱意味的拒绝文案阻拦用户离开

模态的阻断力不应被用来施压;拒绝选项必须与确认选项同样清楚、中性。

来源与支持范围

NN/g · Modal & Nonmodal Dialogs: When (& When Not) to Use Them ↗

模态对话框覆盖主内容并使系统进入需要用户先行交互的特殊模式;适用于防止关键错误与获取继续流程所需的信息,与用户目标无关的模态会被视为骚扰并削弱信任。

检索日期:2026-09-15 · 快照待确认
WAI-ARIA APG · Dialog (Modal) Pattern ↗

模态对话框之下的窗口是惰性的;打开时焦点移入对话框,Tab 在其内部循环,Escape 关闭,关闭后焦点返回触发元素;容器使用 dialog 角色并设置 aria-modal。

检索日期:2026-09-15
MDN · <dialog>: The Dialog element ↗

以 showModal() 打开的对话框使页面其余部分惰性并可用 Esc 关闭,而 show() 打开的非模态对话框不会;应提供显式的关闭按钮。

检索日期:2026-09-15

定义参考以上来源;数字界面示例、选择建议、条件关系及配方由本样例编辑,尚未经用户研究验证。

类型扩展与实现说明

本词条尚无可操作示例;插画为编辑示意,应用到产品时仍须验证焦点管理与键盘可达性。

{
  "states": [
    "closed",
    "open",
    "confirmed",
    "dismissed"
  ],
  "a11y": [
    "容器使用 dialog 角色并标记为模态,有可访问的标题",
    "打开时焦点进入对话框,关闭时焦点回到触发元素",
    "Escape 与显式关闭控件都能关闭"
  ],
  "motion": "遮罩与出现动画可省略;减弱动态偏好下直接显示"
}
完整 Agent 条目 JSON
{
  "id": "modal-dialog",
  "type": "interaction",
  "name": {
    "zh": "模态对话框",
    "en": "Modal Dialog"
  },
  "aliases": [
    "模态窗口",
    "弹窗",
    "模态框",
    "modal"
  ],
  "granularity": "component",
  "intents": [
    "confirm-action",
    "focus-task"
  ],
  "tags": [
    "对话框",
    "确认",
    "打断",
    "焦点",
    "遮罩"
  ],
  "definition": "覆盖在主内容之上的对话框,它使系统进入一种特殊模式:在用户明确处理该对话框之前,主内容被禁用、不可交互。",
  "boundary": "不是所有弹出层都是模态:非模态对话框、气泡提示与渐进披露的展开都允许用户继续操作页面。判断标准是页面其余部分是否在对话框关闭前保持惰性;只要背景仍可点击或可获得焦点,就不应称为模态。",
  "signature": [
    "对话框外的内容被遮罩且不可操作",
    "打开时焦点进入对话框,Tab 只在其内部循环",
    "有明确的关闭途径,关闭后焦点回到触发处"
  ],
  "when": [
    "需要在不可逆操作前阻止关键错误",
    "继续用户自己发起的流程必须先取得一项必要信息",
    "需要把复杂流程切成必须逐步完成的小步骤"
  ],
  "when_not": [
    "内容与用户当前目标无关,例如订阅推广或非必要提示",
    "用户需要参考对话框外的信息才能作出决定",
    "任务可以在原位或旁路完成而不必打断"
  ],
  "tradeoff": "换来用户注意力的集中与错误预防,代价是打断当前任务;与目标无关的打断会被视为骚扰并削弱信任。",
  "comparison": {
    "focus": "让用户先处理一件事再继续",
    "mechanism": "遮罩并禁用主内容,把交互限制在对话框内",
    "cost": "打断任务流,并需承担焦点管理与退出路径的实现责任"
  },
  "sources": [
    {
      "id": "nng-modal-nonmodal",
      "title": "NN/g · Modal & Nonmodal Dialogs: When (& When Not) to Use Them",
      "url": "https://www.nngroup.com/articles/modal-nonmodal-dialog/",
      "claim": "模态对话框覆盖主内容并使系统进入需要用户先行交互的特殊模式;适用于防止关键错误与获取继续流程所需的信息,与用户目标无关的模态会被视为骚扰并削弱信任。",
      "checkedAt": "2026-09-15",
      "archive": {
        "lookupUrl": "https://web.archive.org/web/20260915*/https://www.nngroup.com/articles/modal-nonmodal-dialog/",
        "status": "unconfirmed",
        "checkedAt": "2026-09-15T18:05:14.105Z",
        "error": "status-request-failed",
        "jobId": "spn2-42b9d1bde63dee38bec054ca6b77099df0a12208"
      }
    },
    {
      "id": "apg-dialog-modal",
      "title": "WAI-ARIA APG · Dialog (Modal) Pattern",
      "url": "https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/",
      "claim": "模态对话框之下的窗口是惰性的;打开时焦点移入对话框,Tab 在其内部循环,Escape 关闭,关闭后焦点返回触发元素;容器使用 dialog 角色并设置 aria-modal。",
      "checkedAt": "2026-09-15",
      "archive": {
        "lookupUrl": "https://web.archive.org/web/20260915*/https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/",
        "status": "available",
        "checkedAt": "2026-09-15T18:05:58.794Z",
        "jobId": "spn2-399060bd1635b97ac2d04c6443f46faf4dc5b8ed",
        "url": "https://web.archive.org/web/20260915180710/https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/",
        "timestamp": "20260915180710"
      }
    },
    {
      "id": "mdn-dialog",
      "title": "MDN · <dialog>: The Dialog element",
      "url": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog",
      "claim": "以 showModal() 打开的对话框使页面其余部分惰性并可用 Esc 关闭,而 show() 打开的非模态对话框不会;应提供显式的关闭按钮。",
      "checkedAt": "2026-09-15",
      "archive": {
        "lookupUrl": "https://web.archive.org/web/20260915*/https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog",
        "status": "available",
        "checkedAt": "2026-09-15T18:05:59.233Z",
        "jobId": "spn2-b4866376b185c337617d6b9f564715f6bc7d624c",
        "url": "https://web.archive.org/web/20260915180623/https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dialog",
        "timestamp": "20260915180623"
      }
    }
  ],
  "relations": [
    {
      "target": "progressive-disclosure",
      "kind": "related",
      "condition": "只是展开次要内容而不必阻断页面",
      "reason": "渐进披露允许用户继续操作页面,模态则要求先处理再继续;不要因为内容是次要的就把它做成模态。",
      "basis": "editorial"
    },
    {
      "target": "inline-edit",
      "kind": "alternative",
      "condition": "修改短字段且周边内容是有用的参照",
      "reason": "原位编辑保留上下文,而模态会遮住用户可能需要参考的信息。",
      "basis": "editorial"
    },
    {
      "target": "confirmshaming",
      "kind": "misused_as",
      "condition": "用带羞辱意味的拒绝文案阻拦用户离开",
      "reason": "模态的阻断力不应被用来施压;拒绝选项必须与确认选项同样清楚、中性。",
      "basis": "editorial"
    }
  ],
  "rules": [
    {
      "when": "对话框打开",
      "instruction": "把焦点移入对话框,并把 Tab 循环限制在其内部;关闭后把焦点送回触发元素。",
      "strength": "must",
      "basis": "editorial"
    },
    {
      "when": "用户想放弃当前对话框",
      "instruction": "提供显式的关闭或取消控件,并支持 Escape 关闭。",
      "strength": "must",
      "basis": "editorial"
    },
    {
      "when": "对话框内已有未提交的输入",
      "instruction": "点击遮罩不应无提示地丢弃输入;先确认或改为仅按钮关闭。",
      "strength": "recommend",
      "basis": "editorial"
    }
  ],
  "behavior": {
    "states": [
      "closed",
      "open",
      "confirmed",
      "dismissed"
    ],
    "a11y": [
      "容器使用 dialog 角色并标记为模态,有可访问的标题",
      "打开时焦点进入对话框,关闭时焦点回到触发元素",
      "Escape 与显式关闭控件都能关闭"
    ],
    "motion": "遮罩与出现动画可省略;减弱动态偏好下直接显示"
  },
  "demo": null,
  "version": "0.1.0",
  "editorialStatus": "drafted",
  "requirements": [],
  "demoCapabilities": [],
  "implementationNote": "本词条尚无可操作示例;插画为编辑示意,应用到产品时仍须验证焦点管理与键盘可达性。",
  "image": {
    "src": "/images/modal-dialog.webp",
    "alt": "虚构的 FIELDNOTES 应用界面被遮罩压暗,中央是一张带标题、一行正文、主次两个按钮和关闭控件的对话框卡片。"
  },
  "searchTerms": [
    "dialog",
    "confirmation",
    "interruption",
    "focus",
    "overlay"
  ]
}