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

Posted

技术标签:

【中文标题】如何为 WAI-ARIA 标记加载动画?【英文标题】:How to label a loading animation for WAI-ARIA? 【发布时间】:2016-12-06 20:46:30 【问题描述】:

我正在努力解决网页上的一些可访问性问题。我有一个充当对话框的 div,在其中一个 div 包含加载动画和显示文本“Working...”。

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

<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>

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

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

我已经到处寻找加载动画的示例,但到目前为止无济于事。

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

谢谢

【问题讨论】:

你有测试的网址吗?就目前而言,屏幕阅读器正在宣布您提供的文本,但听起来您希望它说的不止这些。 我希望它宣布它正在工作,以指示用户他应该等待,警报项目上的 aria-busy 似乎已经成功了。 后续问题:一旦加载操作完成,如何宣布新数据? 【参考方案1】:

我能想到的最佳解决方案是使用角色警报和 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"  />
</div>

【讨论】:

【参考方案2】:

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

这样做的原因是因为某些页面可能有很多单独的加载器(假设每个组件一个加载器,而不是整个页面的单个加载器)并且您使用 aria-live="assertive"role="alert" 它会非常侵入性,每个加载程序都会被调用。

【讨论】:

【参考方案3】:

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

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

如果您希望文本与警报相同,则应使用aria-live="assertive" 而不是alert 角色。 aria-live 值是导致屏幕阅读器在发出警报时宣布文本的原因。 应使用aria-valuetext 属性在具有progressbar 角色的元素上设置要宣布的文本。它不应单独设置在单独的相邻元素上。如果出于演示原因还需要将其包含在另一个元素中,则该元素应具有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"  />
</div>

【讨论】:

当加载器因网络请求而显示时,您将如何处理最小值和最大值?如果你像上面那样使用它,那么它总是会说“0%”,如果你把它们都拿出来,它会说“工作未确定” 如果您知道实际进度,您应该在下载时设置并更新aria-valuenow 到适当的数量。如果您不知道实际进度,那么将minmax 排除在外可能是避免您所描述的现实世界行为的最佳选择,尽管这在技术上与规范相反。在未知进展的情况下让它说“工作未确定”是准确的。 (请注意,我无法重现您所描述的内容,因为我不知道您正在使用什么软件进行测试。)【参考方案4】:

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

<div class="loader" show.bind="isLoading" role="alert" aria-label="Loading"></div>

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

【讨论】:

【参考方案5】:

我遇到了一篇很好的文章,它解释了在这种情况下需要做什么Loading spinner accessibility

微调器应包含在容器内。它的可见性可以根据 aria-busy 属性进行切换。它们应该总是相反的,即,如果当前正在加载,section[aria-busy="true"], .tn-spinner[aria-hidden="false"],一旦内容被加载,分别切换到 false 和 true。

【讨论】:

【参考方案6】:

Bootstrap 像这样使用 role="status"

<div class="spinner-grow text-primary" role="status">
  <span class="sr-only">Loading...</span>
</div>

在MDN 中它说:

状态角色是一种活动区域和一个容器,其内容 是对用户来说不够重要的咨询信息 证明警报的合理性,并且通常显示为状态栏。当。。。的时候 角色被添加到一个元素,浏览器将发送一个可访问的 辅助技术产品的状态事件,然后可以通知 用户对此的看法。

【讨论】:

以上是关于如何为 WAI-ARIA 标记加载动画?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3:如何为类似于进度条的视图背景颜色设置动画

在 Swing 中显示动画 BG

当UIVIew隐藏在sameView中时,如何为UIview设置动画

如何在谷歌地图上一一加载标记动画[重复]

使用着色器为网格设置动画

如何用动画重新加载 iCarousel?