为新添加的区域正确处理 WCAG

Correct WCAG handling for newly added regions

如果我在一个页面上有 3 个按钮,选择一个会使它们隐藏,然后显示另一个 div 包含一些表单元素,我想正确地通知显示的新添加内容。我的理解是动态内容更改(例如显示区域)需要根据 WCAG 进行正确处理。有没有标准的方法来处理 aria/html?

我已经尝试过 aria-live,因为通常建议在新区域的外部 div 上使用 aria-live,但即使使用 aria-live="polite" 我也会遇到不良副作用。假设显示的区域包含一个小表格。当焦点移动到文本字段并开始输入时,我得到了一种奇怪的行为,即当用户在输入中输入字符时,JAWS 会针对每次击键重复开始一次又一次地读取标签。如果我删除父级 div 上的 aria-live 属性,则在表单中使用 Tab 键时,标签只会在字段焦点上读取一次,并且不会在用户输入时再次读取。

即似乎具有 aria-live 的父元素导致标签等子元素被更积极地读取,即使显示的区域是一次性更改,并且在那之后没有动态变化。

这种奇怪的行为似乎暗示 aria-live 更适合将 errors/alerts 等小的孤立元素添加到页面,而不是大区域。

我应该改用角色吗?

<form role="form" action="/submit" method="post">
    <div hidden id="section1" aria-live="polite">
        <h2>Form Header</h2>        
        <div>
            <label for="RequestNumber">Request Number*</label>
            <input id="RequestNumber" name="RequestNumber" type="text" />           
        </div>
    </div>
</form>

这听起来像是一个简单的渐进式披露案例。 JAWS 所做的不是错误,而是 aria-live 的工作原理。 Aria-live 创建了 DOM 的敏感区域,只要该区域发生变化,就会触发 Assistive Tech 的话语。这就是为什么在 aria-live 中包装一个表单是不明智的。

如果这确实是一种渐进式披露情况,即表单根据用户的选择先于用户构建自身,则不需要 aria-live 通知。只要用户的焦点在与当前任务相关的表单元素中逻辑移动,并且用户背后的内容没有改变,就不需要警报。

在您的示例中,您还包装了表单字段和标签。您可能只想将 H2 添加到 aria-live 区域,这会将公告限制为该元素。

(抱歉,如果我误解了情况,但如果选择其中一个按钮导致按钮组消失并添加 div,那么真正的问题是焦点落在哪里?)

黄金法则 - 不要使用 ARIA,除非所有其他选项都已用尽。

您在这里真正想做的只是管理焦点。

当您单击 3 个按钮中的一个时,我假设显示的是不同的表单。 99% 的屏幕阅读器都可以毫无问题地处理这个问题(对于不能处理的屏幕阅读器,它们在没有 JavaScript 的情况下使用,因此请确保您的网站在没有它的情况下也能正常工作。)

单击按钮时,隐藏它们(如果有动画,则使用 aria-hidden,否则只需 display:none 即可),然后在显示新表单时,只需使用JavaScript.

屏幕 reader 会处理剩下的事情。

可能建议在按钮上添加一些视觉上隐藏的文本,以通知用户按钮消失并出现一个表单 - 只要确保您提供一种方法让他们返回到按钮,以防他们做了错误的选择。

视觉隐藏Class供参考

如果您认为屏幕 reader 可能需要适当的信息,请使用下面的 CSS 隐藏按钮内的内联跨度。

.visually-hidden { 
    position: absolute !important;
    height: 1px; 
    width: 1px;
    overflow: hidden;
    clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
    clip: rect(1px, 1px, 1px, 1px);
    white-space: nowrap; /* added line */
}