如何为WAI-ARIA标记加载动画?

So *_*ins 7 html accessibility wai-aria

我正在努力修复网页上的一些辅助功能问题.我有一个div作为一个对话框,在一个点内部显示一个包含加载动画和文本"Working ..."的div.

我不确定如何标记这两个项目,以便正确通知盲人用户有进度动画并且它正在工作,他应该等待.

<div id="loading" style="display: none;">
        <div class="mgBot15"><span class="txt16" role="alert">Working...</span></div>
        <img src="loading.png" role="progressbar" aria-busy="true"/>
    </div>
Run Code Online (Sandbox Code Playgroud)

我尝试将角色和aria-busy属性添加到img(最初也是父div).

当这个div出现时(通过更改显示样式属性),它正确读取"Working ..."但我没有听到任何迹象表明它正忙,用户应该等待,我错过了什么?

我已经看了很多关于加载动画的例子,到目前为止无济于事.

注意:我正在使用NVDA作为屏幕阅读器进行测试.

谢谢

So *_*ins 12

我能提出的最佳解决方案是使用角色警报,并使用aria-busy ="true".

<div id="loading" style="display: none;">
    <div class="mgBot15"><span class="txt16" role="alert" aria-busy="true">Working...</span></div>
    <img src="loading.png" alt="loading" />
</div>
Run Code Online (Sandbox Code Playgroud)

  • 这是对“aria-busy”属性的常见误解。“aria-busy”“隐藏”屏幕阅读器更新中的元素,旨在防止屏幕阅读器读取特定元素树的更新,直到对该树的连续修改完成。非常不直观的是,在加载动画上使用它绝对是错误的属性 - 因为它将完全向屏幕阅读器用户隐藏该动画。请参阅:https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-busy (3认同)

小智 11

我相信最明智的方法是使用组合 aria-busy="true" aria-live="polite"

其原因是因为某些页面可能有很多独立的装载机(假设为每个组件,而不是整个页面的单一装载机),它使用aria-live="assertive"或者role="alert"这将是非常侵入和各装载机将调用出去。


Sco*_*nan 6

此处使用的正确角色与使用progressbar的原始问题相同。其他角色alert可能会起作用,但它们不太具体,这意味着辅助技术可能会以不太理想的方式呈现信息。

但是,原始问题的示例存在一些问题:

  • 如果您希望在与警报相同的情况下宣布文本,aria-live="assertive"则应使用而不是alert角色。该aria-live值是导致屏幕阅读器在发出警报时宣布文本的原因。
  • 要宣布的文本应progressbar使用aria-valuetext属性设置在具有角色的元素上。它不应单独设置在单独的相邻元素上。如果出于演示原因还需要将其包含在另一个元素中,则该元素应具有aria-hidden="true".
  • 每规范,aria-valueminaria-valuemax要指定即使进度是不确定的(像旋转负载指示)。这些可以分别设置为 0 和 100 作为表示百分比的简单占位符。

加载完成后,aria-valuenow可以将 设置为用于 的任何内容aria-valuemax,并且aria-busy可以设置为false

这导致了原始问题的一种潜在替代方案:

<div id="loading" role="progressbar" aria-valuetext="Working…" aria-busy="true"
    aria-live="assertive" aria-valuemin="0" aria-valuemax="100">
    <div class="mgBot15" aria-hidden="true"><span class="txt16">Working...</span></div>
    <img src="loading.png" alt="" />
</div>
Run Code Online (Sandbox Code Playgroud)

  • 当加载程序因网络请求而显示时,您将如何处理最小值和最大值?如果你像上面那样使用它,那么它总是会显示“0%”,如果你把它们全部拿出来,它会显示类似“工作未确定”之类的内容 (2认同)

小智 5

经过一天的类似问题的摆弄之后,我终于能够通过大量的阅读和实验来解决这个问题。我正在使用 NVDA 作为屏幕阅读器。

<div class="loader" show.bind="isLoading" role="alert" aria-label="Loading"></div>
Run Code Online (Sandbox Code Playgroud)

以下属性是关键:rolearia-label。上面的示例使 NVDA 在 isLoading 变为 true 时宣布“正在加载警报”。需要注意的是,NVDA 发音 aria-label 值,后跟“alert”。使用角色“日志”或“状态”并没有出现在任何公告中。

  • 什么是“show.bind”和“isLoading”?这是 Angular 还是类似的框架?该问题被标记为“html”。 (2认同)

MBe*_*mam 5

Bootstrap使用role="status"像这样:

<div class="spinner-grow text-primary" role="status">
  <span class="sr-only">Loading...</span>
</div>
Run Code Online (Sandbox Code Playgroud)

MDN中写道:

状态角色是一种活动区域和容器,其内容是针对用户的咨询信息,其重要性不足以证明警报的合理性,并且通常以状态栏的形式呈现。当角色添加到元素时,浏览器将向辅助技术产品发送可访问状态事件,然后辅助技术产品可以通知用户。

  • 当加载器用于等待主要内容时,我认为这不是正确的角色。在 [MDN](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/status_role) 的同一页面上,它指出:“实时区域旨在通知用户动态更新在当前网页的其他区域中发生过的情况,但不需要通过上下文的更改来中断用户的当前活动。 (2认同)