ARIA: alert 角色

alert 角色用于重要且通常是时效性的信息。alert 是一种 status 类型,被视为一个独立的实时区域。

描述

alert 角色用于向用户传达一个重要且通常是时效性的消息。当此角色被添加到元素时,浏览器会向辅助技术产品发送一个可访问的警报事件,以便它们可以通知用户。

alert 角色仅应用于需要用户立即关注的信息,例如

  • 在表单字段中输入了无效值
  • 用户的登录会话即将过期
  • 与服务器的连接丢失,本地更改将不会保存

alert 角色仅应用于文本内容,而不是交互式元素,如链接或按钮。带有 alert 角色的元素不必能够接收焦点,因为屏幕阅读器(语音或盲文)无论键盘焦点在哪里,都会自动播报更新的内容,只要该角色被添加到元素上。

alert 角色被添加到包含警报消息的节点上,而不是触发警报的元素上。警报是 强制性实时区域。设置 role="alert" 等同于设置 aria-live="assertive"aria-atomic="true"。由于它们不接收焦点,因此不需要管理焦点,也不需要用户交互。

警告:由于其侵扰性,alert 角色必须谨慎使用,并且仅在需要用户立即关注的情况下使用。

alert 角色是五种 实时区域 角色之一。动态变化不那么紧急的应该使用不那么激进的方法,例如包含 aria-live="polite" 或使用其他实时区域角色,如 status。如果用户需要关闭警报,则应使用 alertdialog 角色。

关于 alert 角色最重要的信息是,它用于动态显示的内容,而不是页面加载时显示的内容。它非常适用于用户填写表单,然后使用 JavaScript 添加错误消息的情况——警报会立即读出消息。它不应用于用户尚未与之交互的 HTML。例如,如果一个页面加载时有多个可见的警报散布在各处,则不应使用 alert 角色,因为这些消息不是动态触发的。

与所有其他 实时区域 一样,警报仅在 role="alert" 的元素内容被更新时才会播报。请确保带有该角色的元素首先存在于页面的标记中——这将“预热”浏览器和屏幕阅读器,使其能够监视元素的变化。在此之后,内容的任何更改都将被播报。请勿尝试动态添加/生成一个已经填充了您想要播报的警报消息的 role="alert" 元素——这通常不会导致播报,因为它不是内容更改。

由于 alert 角色会读出任何已更改的内容,因此应谨慎使用。警报,顾名思义,具有干扰性。一次出现多个警报,以及不必要的警报,都会造成糟糕的用户体验。

示例

以下是警报的常见示例及其实现方式

示例 1:使带有 alert 角色的元素内的现成内容可见

如果带有 role="alert" 的元素内部的内容最初使用 CSS 隐藏,使其可见将触发警报。这意味着现有的警报容器元素可以被“重复”使用多次。

css
.hidden {
  display: none;
}
html
<div id="expirationWarning" role="alert">
  <span class="hidden">Your log in session will expire in 2 minutes</span>
</div>
js
// removing the 'hidden' class makes the content inside the element visible, which will make the screen reader announce the alert:
document
  .getElementById("expirationWarning")
  .firstChild.classList.remove("hidden");

示例 2:动态更改带有 alert 角色的元素内的内容

使用 JavaScript,您可以动态更改带有 role="alert" 的元素内部的内容。请注意,如果您需要多次触发相同的警报(即,您动态插入的内容与之前的内容相同),这通常不会被视为更改,并且不会导致播报。因此,最好先短暂地“清除”警报容器的内容,然后再注入警报消息。

html
<div id="alertContainer" role="alert"></div>
js
// clear the contents of the container
document.getElementById("alertContainer").textContent = "";
// inject the new alert message
document.getElementById("alertContainer").textContent =
  `Your session will expire in ${expiration} minutes`;

示例 3:视觉隐藏的警报容器用于屏幕阅读器通知

可以视觉隐藏警报容器本身,并将其用于提供屏幕阅读器的更新/通知。当页面上的重要内容已更新,但屏幕阅读器用户无法立即注意到这些更改时,这可能很有用。

但是,请确保容器没有使用 display:none 隐藏,因为这会将其隐藏,即使是辅助技术也无法感知,这意味着它们不会被通知任何更改。相反,可以使用类似 .visually-hidden 样式的方法。

html
<div id="hiddenAlertContainer" role="alert" class="visually-hidden"></div>
css
.visually-hidden {
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  height: 1px;
  overflow: hidden;
  position: absolute;
  white-space: nowrap;
  width: 1px;
}
js
// clear the contents of the container
document.getElementById("hiddenAlertContainer").textContent = "";
// inject the new alert message
document.getElementById("hiddenAlertContainer").textContent =
  "All items were removed from your inventory.";

规范

规范
无障碍富互联网应用程序 (WAI-ARIA)
# alert

另见