Copyright © 2018-2021 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and permissive document license rules apply.
本章暂无中文版,详情请访问英文版 ARIA Authoring Practices Guide (APG) Home
本章暂无中文版,详情请访问英文版 ARIA Authoring Practices Guide (APG) Home
本章暂无中文版,详情请访问英文版 Read Me First
本节演示了如何通过应 WAI-ARIA 角色、状态和属性以及实现键盘支持,使常见的富互联网应用模式和 widget 变得无障碍。
手风琴是一组垂直堆叠的交互式标题,每个标题都包含代表一系列内容的标题名、内容片段或缩略图。标题作为控件,使用户能够显示或隐藏其相关的内容部分。手风琴通常用于减少在单个页面显示多个内容部分时出现滚动的情况。
通过以下术语来理解手风琴:
在某些手风琴中,在手风琴标题旁边会有一些附加元素。例如,每个手风琴标题附带一个菜单按钮,用来提供适用于该部分的访问操作。而且,在某些情况下,隐藏内容的片段(snippet)也可能在视觉上持续存在。
手风琴示例:演示把一个表单分成三部分,手风琴每次只展开其中一部分。
button
都被一个具有 heading 角色的元素包裹,且该元素设置了合适的 aria-level
值以适配页面的信息架构。
heading
角色和 aria-level
属性的元素,例如 HTML 标题标签(HTML heading
tag),可以使用原生语言元素。button
元素是 heading
元素内的唯一元素。也就是说,即使有其他(跟 button
元素)视觉上持久(visually
persistent)的元素,他们不能被包含在 heading
元素中。
button
元素的 aria-expanded 属性设置为
true
。如果面板折叠的,则 aria-expanded 属性设置为 false
。
button
元素的 aria-controls 属性需设置为包含手风琴面板的内容元素的ID。
button
元素的 aria-disabled 设置为
true
。
region
角色,例如在一个包含超过 6
个面板的手风琴中,且这些面板可能会同时展开。
region
角色对屏幕阅读器用户感知结构特别有帮助。
Alert(警告)是一个呈现简短、重要信息的元素,以一种引起用户注意而不打断用户任务的方式。动态渲染的警告,会被大多数屏幕阅读器自动朗读,在某些操作系统中,警告会触发警告提示音。与此同时,需要注意的是屏幕阅读器不会告知用户在加载完成前已经存在的警告。
由于警告是用于提供重要和潜在的时间敏感信息,并且不会打扰用户继续工作,所以它不影响键盘焦点这点至关重要。alertdialog 则是为那些必须打断工作流的情况设计的。
避免设计自动消失的警告也同样重要。一个消失太快的警告,可能导致不符合 WCAG 2.0 成功标准第 2.2.3 条。警告引起的中断频率也是一个重要的设计考虑。频繁打断会降低视障和认知障碍用户的可用性,这让满足 WCAG 2.0 成功标准第 2.2.4 条的需求更加困难。
不适用。
该 widget 的角色为 alert。
警告对话框是可以中断用户工作流程的模态对话框,用以传达一个重要的信息并获得响应。下面的示例包括操作确认提示和错误消息确认。alertdialog 角色能够让辅助技术和浏览器从其他对话框中区分出警告对话框,这样就能给予警告对话框特殊对待,例如播放一个系统警告提示音。
警告对话框示例:演示警告对话框的确认提示。
请参阅模态对话框模式键盘交互部分。
alertdialog
的元素拥有以下情况中的一种:
alertdialog
的元素,具有 aria-describedby 属性来索引包含警告信息的元素。面包屑是包含当前页面的父页面的链接列表,该列表是层级顺序的。它可以帮助用户在网站或应用程序中找到自己的位置。面包屑通常水平放置在页面的主要内容之前。
不适用。
page
。如果表示当前页面的元素不是链接的形式,则 aria-current 可选。
Button(按钮)是一个能够让用户触发一个操作或事件的 widget,例如提交表单、打开对话框、取消操作、或执行删除操作。告知用户一个按钮将打开对话框的常见方法是将“...”(省略号)添加到按钮上,例如“另存为...”。
除了常规按钮 widget 外,WAI-ARIA 还支持其他 2 种按钮类型:
menu
或 true
时,辅助技术会将该按钮视为一个菜单按钮。
按钮执行的动作类型与链接的功能截然不同(参见链接模式)。Widget
的外观和角色与其提供的功能相匹配是非常重要的。但有时候某些元素会有链接的视觉样式,却执行按钮的操作。在这种情况下,为元素添加 button
角色,可以帮助辅助技术用户理解元素的功能。但是,更好的解决方案还是应该调整其视觉设计,以匹配其功能和 ARIA 角色。
当按钮获取焦点时:
button
有一个可访问的标签。默认情况下,可访问名称是从按钮元素内部的所有内容计算得来。但是,可访问名称也可以通过 aria-labelledby
或 aria-label 提供。
true
。true
,按钮关闭时,该状态属性的值为
false
。
轮播通过按顺序地显示一个或多个幻灯片(slide)的子集来呈现一组项目,称为幻灯片。通常,轮播一次显示一张幻灯片,用户可以激活下一张或上一张幻灯片控件,轮播将隐藏当前幻灯片并将下一张或上一张幻灯片“轮播”(rotate)到视图中。在某些实现中,当页面加载时轮播会自动开始,一旦所有的幻灯片都被显示出来,它也可以自动停止。虽然幻灯片可以包含任何类型的内容,但每张幻灯片仅包含单个图像的图像轮播(image carousel)是很常见的。
确保所有用户都可以轻松控制并且不受幻灯片轮播的不利影响,这是轮播无障碍的一个重要方面。例如,如果在屏幕上不可见的幻灯片被错误地隐藏起来,例如显示在屏幕之外,那么屏幕阅读器的体验可能会令人困惑和感到混乱。类似地,如果幻灯片自动轮播而屏幕阅读器用户却感知不到这种变化,则用户可能会先在幻灯片 1 上读到一个元素,接着通过屏幕阅读器命令切换到下一张幻灯片(幻灯片 2),这时他会听到幻灯片 2 上的一个元素,而不是依旧听到幻灯片 1 上的下一个元素,他无从得知刚刚听到的元素是来自一个全新的上下文。
提供全面的轮播控制功能包括:
以下术语用于描述轮播。
本节介绍三种轮播样式的元素组成:
carousel
。aria-roledescription
设置为“carousel”,因此标签不应该包含“carousel”一词。
aria-pressed
属性。
slide
。aria-roledescription
设置为“slide”,标签中不应该再包含“slide”一词。false
和 aria-live 设置为:
off
:如果轮播是自动切换的。polite
:如果轮播没有自动切换。选项卡式轮播与基本轮播相同,不同之处在于:
group
,而且它没有 aria-roledescription
属性。
tab
元素,因此激活选项卡将显示与该选项卡相关联的幻灯片。tab
的可访问名称通过包括幻灯片的名称或编号来指示它将显示哪个幻灯片,例如,“幻灯片3”。如果每张幻灯片都有唯一的名称,则最好使用幻灯片名称。tablist
元素组合起来,该元素由 aria-label 提供可访问名称,用于标识选项卡的用途,例如“选择要显示的幻灯片”。tab
、tablist
和 tabpanel
实现了选项卡模式中指定的属性。分组式轮播的结构与基本轮播相同,但它还包括幻灯片选取器控件,其中:
group
元素的 ID 来实现。
true
。注意: aria-disabled
比 HTML
的 disabled
属性更合适,因为在这种情况下,屏幕阅读器用户可以从页面 Tab sequence 中包含的禁用按钮中受益。
WAI-ARIA 支持两种类型的 checkbox(多选框)widget:
三态多选框的一种常见使用场景是在软件安装时,一个单独的三态多选框用来代表和控制整个安装选项组的状态。并且,该组中的每个选项都可以单独使用双态多选框开启或关闭。
用户在使用三态多选框时,可以只需一个操作即可更改组中的所有选项:
当多选框拥有焦点时,按 Space 键可以改变多选框的状态。
checkbox
角色的元素中包含的可见文本内容。checkbox
角色的元素,其 aria-labelledby 值引用了一个可见的标签。checkbox
角色的元素设置了 aria-label。true
。false
。mixed
。
Combobox(组合框)是具有关联弹出窗口(popup)的输入 widget,使用户能够从可能值的集合中为组合框选择值。
在有些实现中,弹出窗口呈现一组(预定义的)允许值,而在其它实现中,弹出窗口呈现一组建议值,用户可以从中选择一个建议值或键入一个值。
弹出窗口可以是 listbox(列表框)、
grid(网格)、tree(树)或 dialog(对话框)。
许多实现还包括第三个可选元素——与组合框相邻的图形打开
按钮,它指示弹出窗口的可用性。
如果存在建议值,激活打开
按钮将显示弹出窗口。
组合框模式支持几种可能的交互行为。
最常见的交互是文本输入。
有些组合框允许用户在组合框中键入和编辑文本,而有些组合框则不允许。
如果组合框不支持文本输入,则将其称为 select-only 组合框,这意味着用户只能通过在弹出窗口中选择值来设置组合框的值。
例如,在某些浏览器中,渲染 size="1"
的 HTML select
元素会被当成组合框呈现给辅助技术。
或者,如果组合框支持文本输入,则认为它是可编辑的。
可编辑组合框可以允许用户输入任意值,或者可以将其值限制为允许值的离散集合,在这种情况下,键入输入用于过滤弹出窗口中呈现的建议值。
弹出窗口默认状态下隐藏,即,默认为折叠状态。触发弹出窗口展开的条件会因具体实现的不同而不同。这些可能的条件包括:
打开按钮时,展开弹出窗口。(可选)如果组合框可编辑并且包含与允许值不匹配的字符串,则不会进行展开弹出窗口。
组合框 widget 可以很好地用于在以下两种情况下获取用户输入:
这种由弹出窗口呈现可能值的表现及其呈现方式称为自动补全(autocomplete)行为。 组合框可以有以下四种自动补全形式:
如果组合框可编辑,并且具有任何形式的列表自动补全功能,则弹出窗口可能会随着用户的键入而出现或消失。 例如,如果用户键入两个字符串,触发展开弹出窗口并显示五个建议值,但随后键入了第三个字符,形成了一个没有任何匹配建议值的字符串,那么弹出窗口可能会关闭,如果存在内联自动补全功能,内联自动补全的字符串会消失。
另外两个在视觉上也很类似并允许用户从一组离散选项中进行单项选项的 widget 是列表框和菜单按钮。
组合框区别于列表框和菜单按钮的一个特性是,用户的选择可以呈现为可编辑字段中的值,这使用户能够选择部分或全部值并复制到剪贴板上。
组合框和菜单按钮可以实现让用户从允许值中探索,并且不会丢失上一次选择。
也就是说,用户可以在组合框弹出窗口或菜单中导航可用选项集,按下 Escape 可以在不更改先前输入的情况下关闭弹出窗口或菜单。
与此相反,在单选列表框的选项之间导航会立即更改其值,并且按下 Escape 不提供撤消机制。
组合框和列表框可以根据需要标记 aria-required="true"
,并且它们具有与其值不同的可访问名称。
因此,当辅助技术用户默认聚焦到组合框或列表框时,他们可以分别感知这些 widget 的名称和值。
但是,菜单按钮不能标记为必填,虽然它具有可访问的名称,但它没有值,因此不适合在其折叠状态下传达用户的选择。
select
元素。aria-autocomplete=none
相关的行为。
焦点在组合框中:
适用于设备平台的标准单行文本编辑键:
contenteditable
属性的元素提供这些功能。焦点在列表框弹出窗口中:
aria-activedescendant
实现在列表框内移动,如使用
aria-activedescendant 管理合成组件中的焦点中所述。在网格弹出窗口中,每个建议值可以由单个单元格或整行表示。 关于网格设计的这个方面是如何影响键盘交互设计以及选择移动以响应焦点移动的方式,请参见下面的“说明”。
aria-activedescendant
实现在列表框内移动,如使用
aria-activedescendant 管理合成组件中的焦点中所述。在树弹出窗口的一些实现中,部分或全部父节点可能仅作为建议类别标签,因此它们可能不是可选值。 关于这将如何影响键盘交互设计以及选择移动以响应焦点移动的方式,请参见下面的“说明”。
焦点在垂直方向的树弹出窗口中:
aria-activedescendant
实现在列表框内移动,如使用
aria-activedescendant 管理合成组件中的焦点中所述。horizontal
):
焦点在弹出对话框中:
与其他组合框弹出窗口不同,对话框不支持 aria-activedescendant
,因此 DOM 焦点将从组合框移到对话框中。
aria-controls
仅在弹出窗口可见时才需要设置。但是,引用不可见的元素也是有效的。
listbox
,具有 combobox
角色的元素将 aria-haspopup
属性设置为与弹出窗口类型对应的值。
也就是 aria-haspopup
属性置为 grid
,tree
,或 dialog
。
请注意,具有 combobox
角色的元素有一个隐含的 aria-haspopup
属性值为 listbox
。
combobox
角色的元素将 aria-expanded 属性置为 false
。
当弹出窗口元素可见时,aria-expanded
置为 true
。
请注意,具有 combobox
角色的元素的 aria-expanded
属性的默认值是 false
。
option
,gridcell
,row
,或 treeitem
的 aria-selected 设置为
true
。
label
元素(例如 input
元素)标记的 HTML 元素,则使用
label
元素对其进行标记。
否则,如果组合框元素具有可见标签,则将 aria-labelledby 设置为引用标签元素的值。
否则,组合框元素的标签由 aria-label 提供。
none
:显示弹出窗口时,无论组合框中键入的字符如何变化,其包含的建议值都是相同的。list
:当触发展开弹出窗口时,它将显示建议值。如果组合框可编辑,则值完整或逻辑对应于组合框中键入的字符。both
:当触发展开弹出窗口时,它呈现与组合框中键入的字符完整或逻辑对应的建议值。
此外,所选建议中尚未由用户键入的部分(称为自动补全的文本)在组合框中的输入光标之后内联显示。 内联自动补全的文本在视觉上突出显示并具有选定状态。
Dialog(对话框)是叠加在主窗口或另一个对话框上的窗口。Window 下的模态对话框是惰性的。也就是说,用户不能与对话框之外的内容进行交互。当前活跃窗口之外的非活跃内容,一般是模糊不清或灰暗的,这样就让这些内容很难被辨别,并且在某些实现中,如果试图与非活跃内容进行交互将导致对话框被关闭。
与非模态对话框类似,模态对话框包含其 tab sequence。也就是说,Tab 和 Shift + Tab 不会把焦点移出对话框之外。但是,与非模态对话框不同的是,模态对话框没有提供在不关闭当前对话框的情况下,将键盘焦点移出对话框窗口的方法。
有一种特殊情况的对话框角色 alertdialog,它被专门设计用来将用户的注意力转移到简短、重要的信息上。警告对话框设置模式描述了它的用法。
在以下的描述中,术语 可获取焦点的元素
(tabbable element)是指 tabindex
值大于等于 0 的元素。注意,强烈不建议使用大于 0 的值。
tabindex="-1"
添加到内容开头的静态元素并最初聚焦该元素。这使辅助技术用户更容易通过导航语义结构来阅读内容。此外,在这种情况下,建议不要将 aria-describedby
属性应用于对话容器。
tabindex="-1"
添加到对话框顶部的静态元素,例如对话框标题或第一段,并将焦点放在该元素上。
确定或
继续按钮上。
button
角色的可见元素来关闭对话框,例如一个关闭图标,或者取消按钮。dialog
的元素的后代。true
。dialog
角色的元素中,哪个元素或哪些元素包含描述对话框的主要目的或消息的内容。指定描述性元素使屏幕阅读器能够在对话框打开时识别描述以及对话框标题和最初聚焦的元素,这通常仅在描述性内容简单且无需结构信息即可轻松理解时才有用。如果对话内容包含语义结构(例如列表、表格或多个段落)需要被感知以便易于理解内容,即如果内容做为一个不间断的字符串难以理解时,则建议省略指定
aria-describedby
。
true
,将对话框标记为模态对话框,可以防止某些辅助技术用户感知到对话框外的内容,如果一个对话框被标记为模态对话框,但对其他用户来说又不表现为模态对话框,这些辅助技术的用户将会得到不好的体验。所以,以下两点同时出现时,标记为模态对话框:
aria-modal
属性替代了 aria-hidden,为了告知辅助技术对话框的内容是不可交互的。然而,但传统对话框的实现中,aria-hidden
被用来让对话框外的内容变得让辅助技术用户不可访问,更重要的是:
aria-hidden
设置为 true
。aria-hidden
为 true
的元素的后代。展开折叠是使内容能够折叠(隐藏)或展开(可见)的 widget。它由两个元素组件:展开折叠按钮和由该按钮控制可见情况的内容部分。展开折叠按钮通常设计成典型的按钮样式,当受控内容隐藏时,有一个指向右边的箭头或三角形,它暗示激活按钮将显示其他内容。当内容可见时,箭头或三角形通常指向下方。
展开折叠按钮获取焦点时:
button
角色的元素将 aria-expanded 属性置为 true
。
内容隐藏时,则置为 false
。
button
角色元素的 aria-controls 属性的值引用一个包含所有显示或隐藏内容的元素。Feed(信息流)是页面上可以随用户滚动自动加载新内容的部分。 Feed 中的内容部分以 article 元素的形式呈现。 因此,Feed 通常可以看成一个可以无限滚动的动态 article 列表。
Feed 是一种结构而不是 widget,这是它与其他支持随用户滚动加载数据的 ARIA 模式(例如网格)的最大不同。 因此,具有阅读模式的辅助技术(例如屏幕阅读器)在与 Feed 内容交互时默认为阅读模式。 但是,与大多数其他 WAI-ARIA 结构不同,Feed 在网页和辅助技术之间创建了互操作性合约(interoperability contract)。 规范规定了滚动交互方式,以便辅助技术用户可以阅读 article,按 article 向前和向后跳转,并在阅读模式下可靠地触发新 article 加载。
例如,购物网站上的产品页面可能有一个相关产品版块,一次显示五个相关产品。 随着用户的滚动,更多的产品被请求并加载到 DOM 中。 虽然静态模式可能已经包括一个“加载更多”按钮,该按钮支持每次加载五个新产品,但支持随着用户滚动而自动加载更多数据的动态实现能进一步简化用户体验,并减少用户想要查看五个以上新产品时所带来的延迟感。 但不幸的是,当网页基于用户滚动动态加载内容时,这可能会给使用辅助技术的用户带来可用性和互操作性(interoperability)方面的困难。
为保证辅助技术阅读模式交互的可靠性,Feed 模式在网页和辅助技术之间建立了以下互操作性协议(interoperability agreement):
因此,实现 Feed 模式可以让屏幕阅读器在保持阅读模式的同时,可靠地读取并触发 Feed 加载新内容。
Feed 模式的另一个特点是它能够促进辅助技术用户的快速阅读。 网页作者可为每个 article 提供可访问的名称和描述。 通过识别 article 中提供标题和主要内容的元素,辅助技术可以提供使用户能够从一个 article 跳转到另一个 article 并有效辨别哪些 article 可能值得更多关注的功能。
Feed 模式不是桌面 GUI widget,因此 feed
角色没有使用任何公认的键盘交互约定。
建议支持以下或类似接口。
当焦点在 Feed 内部时:
feed
元素的 aria-labelledby 属性引用包含标题的元素。
否则,feed
元素使用 aria-label 属性声明标签。
article
元素中。
article
元素都有 aria-labelledby 属性,指向 article 内部可以被用作唯一标识的元素。
article
元素都声明该属性,并通过引用 article
内的一个或多个元素作为 article 的主要内容。
article
元素具有 aria-posinset 属性,该属性值表示其在 Feed 中的位置。
article
元素将 aria-setsize 属性设置为表示已加载的 article 总数或 Feed 中 article 的总数,这主要取决于哪个值对用户更有帮助。如果
Feed 中的总数不确定,可将 aria-setsize
属性的值设为 -1
。
feed
中添加或删除 article
元素,并且需要进行多次 DOM 操作时,在更新操作期间,需要将 feed
的 aria-busy 属性设置为
true
。请注意,请务必在完成更新操作后将 aria-busy
置为 false
,否则更新操作可能对某些辅助技术用户不可见。
Grid(网格)widget
是一个容器,使用户能够使用方向导航键(如方向键、Home 和 End
键)来导航它所包含的信息或交互式元素。作为一个提供灵活键盘导航的通用容器组件,它可以满足各种各样的需求。它的用途可以简单到将一组多选框或导航链接进行分组,也可以复杂到创建一个功能齐全的电子表格应用程序。虽然 WAI-ARIA 属性的名称中使用了“行(row)”和“列(column)”这两个词,辅助技术在描述和呈现具有
grid
角色元素的逻辑结构时也使用了这两个词,但在一个元素上使用 grid
角色并不一定意味着其视觉呈现是表格形式的。
当内容以表格形式呈现时,在选择实施这种 grid
模式或表格模式时要考虑以下因素:
grid
是个复合 widget,所以它:
grid
模式的使用大致分为两类:展示表格信息(数据网格,data grids)和分组其他 widget(布局网格,layout grids)。尽管数据网格和布局网格都采用了相同的 ARIA
角色、状态和属性,但它们在内容和 purpose surface factors 的不同,是键盘交互设计中需要考虑的重要因素。为了解决这些因素,下面两节将分别描述数据网格和布局网格的键盘交互模式。
grid
可用于显示具有列标题、行标题或两者兼有的表格信息。如果表格信息是可编辑或可互动的,grid
模式就特别有用。例如,当数据元素是指向更多信息的链接时,与其将它们呈现在一个静态的表格里并将链接包含在 tab sequence 中,不如实现 grid
模式,为用户提供对网格内容直观、高效的键盘导航,以及更短的页面 tab sequence。grid
还可以提供其他功能,如单元格内容编辑、选择、剪切、复制和粘贴。
在网格中,每一个单元格都包含一个可聚焦的元素,不管单元格的内容是否可编辑或可交互,他们本身就是可聚焦的。但有一个例外:如果列或行的标题单元格不提供排序或过滤等功能,则它们不需要可聚焦。支持所有单元格接收或包含键盘焦点一个重要原因是,当用户与网格交互时,屏幕阅读器通常会处于其应用阅读模式,而不是文档阅读模式。在应用模式下,屏幕阅读器用户只能听到可聚焦元素(focusable elements)和用以标记可聚焦元素的内容(content that labels focusable elements)。所以,屏幕阅读器用户可能会无意中忽略网格中包含的那些不可聚焦的,或不是用来标记列或行的元素。
以下按键通过在网格的单元格中移动焦点来提供网格导航。当网格中的元素获得焦点时,实现网格(模式)使以下按键命令可用,例如,在用户用 Tab 键将焦点移至网格后。
如果一个网格支持选择单元格、行或列,那以下按键通常用于这些功能:
关于剪切、复制和粘贴键的分配,请查阅 § 6.8 常用功能的按键分配约定。
grid
模式可以用来分组一组交互式元素,如链接、按钮或多选框。由于整个网格中只有一个元素包含在 tab sequence 中,用网格分组可以极大减少页面上的 tab
步骤。如果在列表滚动浏览时,(列表)能从一个大的数据集中动态地加载更多的元素,比如购物网站上连续的建议产品列表,这就特别有价值。如果像这样的列表中的元素都在 tab sequence
中,键盘用户实际上会被困于列表中。如果组中的任何元素还具有在悬停时出现的相关元素,那么 grid
模式对于提供对用户界面的这些上下文元素的键盘访问也很有用。
与用于展示数据的网格不同,用于布局的 grid
不一定有标记为行或列的标题单元格,可能只包含单行或单列。即使它包含多行和多列,它也可能呈现为一个单一的、逻辑上同质化的元素集合。例如,消息的收件人列表可以是一个网格,每个单元格都包含一个代表收件人的链接。网格最初可能只有一行,但随着收件人的增加,会变成多行。在这种情况下,网格导航键也可以换行,这样用户就可以通过按
Right Arrow 或 Down Arrow 从头到尾阅读列表。虽然这种类型的焦点移动环绕(focus movement
wrapping)在布局网格中非常有用,但如果用在数据网格中就会让人觉得迷惑,特别是对辅助技术使用者而言。
因为方向键是用来在 grid
内移动焦点的,如果 grid
所包含的组件不需要方向键来操作,那么网格的构建和使用都会更容易。如果网络单元格包含像列表框这样的元素,就需要一个额外的按键命令来聚焦和激活列表框,以及一个恢复网格导航功能的命令。支持这一需求的方法在在单元格内部编辑和导航这一节中描述。
以下按键通过在网格的单元格中移动焦点来提供网格导航。当网格中的元素获得焦点时,实现网格(模式)使以下按键命令可用,例如,在用户用 Tab 键将焦点移至网格后。
对于一个布局网格来说,提供选择单元格功能并不常见。不过,如果需要的话,以下按键通常用于这些功能:
关于剪切、复制和粘贴键的分配,请查阅 § 6.8 常用功能的按键分配约定。
本节介绍了数据网格和布局网格模式所共有的键盘交互设计的两个重要方面:
对于辅助技术用户来说,导航网格时的体验质量,在很大程度上取决于单元格包含的内容和键盘焦点的设置。例如,如果某单元格中包含一个按钮,而网格导航键将焦点放在单元格而不是按钮上,此时屏幕阅读器会读取按钮的标签,但不会告诉用户按钮的存在。
有两种最佳的单元格设计和聚焦行为组合:
虽然任何 widget、文本和图形的组合都可以包含在一个单元格中,但如果网络没有遵循这两种单元格设计和焦点移动模式中的任一种,会给作者、用户或两者都增加复杂性。下面示例的参考实现展示了一些使其他单元格设计尽可能无障碍的策略,但最广泛的无障碍体验可能还是源于应用上述两种模式。
虽然导航键,如方向键,是将焦点从一个单元格移动到另一个单元格,但它们不能用来在单元格内执行操作组合框或移动编辑光标等动作。用户可能需要使用网格导航键来操作单元格内的元素,如果一个单元格包含:
以下是用于禁用和恢复网格导航功能的常用键盘约定。
禁用网格导航时,导航行为的常规变化包括:
grid
元素或 rowgroup 角色元素的 DOM 子元素,或由其拥有。
row
元素的 DOM 子元素,或由其拥有,并具有以下角色之一:
true
。如果网格支持列选择,并且有一列被选中,那么列中所有单元格的
aria-selected
都设置为 true
。
true
。如果禁用所有单元格的编辑功能,那么可以在网格元素上将 aria-readonly
设置为
true
。不提供编辑功能的网格,其任何元素上都不设置 aria-readonly
属性。
grid
角色未应用于 HTML table
元素,那么按照网格和表格属性所述,应该应用 aria-rowspan 或 aria-colspan 属性。
grid
角色的元素是 HTML table
元素,则无须对行和单元格应用 ARIA 角色,因为 HTML 元素具有隐含的 ARIA
语义。例如,HTML <TR>
隐含的 ARIA 角色是 row
。由 HTML table
元素构建的
grid
,如果包括跨多行或多列的单元格,必须使用 HTML 的 rowspan
和 colspan
属性(来定义),而不能使用
aria-rowspan
或 aria-colspan
属性。
grid
元素的 DOM 子元素之后呈现给辅助技术,除非 DOM 子元素也包含在 aria-owns
属性中。
Link(链接)widget 提供了一种对资源的交互式引用。 该目标资源可以是外部资源,也可以是本地资源,即资源可以在当前页面或应用的内部或外部。
强烈建议作者使用宿主语言提供的原生链接元素,比如 HTML 中具有 href
属性的 <A>
标签。与其他的 WAI-ARIA
小部件角色一样,将链接角色应用到元素上并不会让浏览器在该元素上使用标准链接行为,比如导航到链接目标或上下文菜单操作。
在使用具有 link
角色的元素时,提供这些特性是作者的责任。
链接示例:由 HTML 的 span
和
img
标签构成的链接 widget。
包含链接文本或图形的元素具有 link 角色。
Listbox(列表框)widget 呈现了一个选项列表,并允许用户选择一个或多个选项。允许选择一个选项的列表框是一个单选列表框,允许选择多个选项的列表框是一个多选列表框。
屏幕阅读器显示列表框时,他们可能会呈现列表中每个选项的名称、状态和位置。选项的名称是由浏览器计算出来的字符串,通常根据选项元素的内容计算。纯字符串(flat string)名称不包含任何语义信息。因此,如果选项包含语义元素,例如标题,屏幕阅读器用户是无法访问到该语义的。另外,列表框角色传达给辅助技术的交互模型不支持与选项内的元素交互。由于列表框 widget 的这些特性,它并没有提供一种可访问方式来呈现包含交互式元素(interactive element,例如链接、按钮或多选框)的列表。要呈现包含交互式元素的列表,请参阅 grid 模块。
为了让屏幕阅读器用户容易感知和理解,请避免使用非常长的选项名称。阅读选项时,选项的整个名称会作为单个语音单元朗读。如果单次按键操作会朗读大量信息,用户将难以理解。长名称通过增加朗读中断来抑制信息的感知,因为用户通常不得不重新朗读整个选项。而且,如果用户不理解屏幕阅读器说了什么,他们很难在列表框 widget 中实现按字、词、短语朗读。
如果选项集中每个选项名称都以使用相同的单词或短语开头,也会显著降低键盘和屏幕阅读器用户的可用性。对屏幕阅读器用户来说,滚动列表找到特定选项是非常费时的,因为他们必须在听到每个选项的差异之前重复听到某个单词或短语。例如,有一个选择城市的列表框,其选项的每个城市名称前面都有国家名称,如果每个国家都列出了很多城市,屏幕阅读器用户不得不在听完国家名称之后才听到城市名称。这种情况最好是有两个列表框,一个用于选择国家,一个用于选择城市。
select
元素中的 size
属性大于1的情况。optgroup
子项的 HTML select
元素的情况。
对于垂直向的列表框:
listbox
角色支持 aria-activedescendant
属性,在实现键盘导航时,它提供了一种在 option
元素之间移动 DOM 焦点的替代方法。详情请参阅使用
aria-activedescendant 管理合成组件中的焦点。
listbox
角色的元素。listbox
角色的元素中或由其拥有。
group
中的选项称为分组选项(grouped options),形成所谓的
选项组(option group)。如果一个列表框包含分组选项,那么:
listbox
角色的元素不是另一个 widget 的一部分,比如组合框,那么有一个由 aria-labelledby
引用的可见标签,或由 aria-label 属性指定的值。listbox
角色元素的 aria-multiselectable 属性置为
true
。否则,aria-multiselectable
设置为 false
,或隐含默认值为 false
。
aria-selected
表示,则不为任何选项指定 aria-checked
。或者,如果选择状态用
aria-checked
表示,则不为任何选项指定
aria-selected
。关于具体应该使用哪个属性,以及在同一个列表框中可能允许同时使用两种属性的不寻常条件的细节,请参见下面的“说明”。
true
。如果具有 listbox
角色的 aria-multiselectable 不为
true
,则每次只能选择一个选项。
false
。
listbox
角色元素的 aria-orientation 设置为 horizontal
。列表框的
aria-orientation
的默认值是 vertical
。
aria-selected
或 aria-checked
表示选择时,要考虑的一些因素是:
aria-selected
,对多选 widget 使用
aria-checked
。在没有其他因素使另一种约定更合适的情况下,这是一个推荐的约定。
aria-selected
和 aria-checked
的条件是极其罕见的。强烈建议避免设计一个需要多于一种状态的列表框
widget。如果要在一个列表框中使用这两种状态,需要满足以下所有条件:
aria-selected
的含义和作用与用户界面中的 aria-checked
的含义和作用不同。Menu(菜单)是向用户提供选择列表(如一组操作或功能)的 widget。 菜单 widget 的表现类似于本机操作系统菜单,例如从通常位于许多桌面应用程序窗口顶部的菜单栏中下拉的菜单。 菜单通常通过激活菜单按钮、在菜单中选择能够打开子菜单的选项,或通过调用命令(例如 Windows 中使用 Shift + F10 可以打开当前上下文特定菜单)来打开或使其可见。 当用户激活菜单中的选项时,除非该选项打开了子菜单(submenu),否则菜单通常会关闭。
一个始终保持显示的菜单是 menubar。 菜单栏通常是水平的,一般用于创建类似于许多桌面应用程序中靠近窗口顶部的菜单栏,为用户提供对一组一致命令的快速访问。
将 “…”(省略号)附加到菜单项标签上通常预示着该菜单项会打开一个对话框,例如,“另存为…”。
以下为描述键盘行为时的假设:
menubar
元素包含多个 menuitem
,menuitemradio
,或
menuitemcheckbox
元素。
menubar
中的 menuitem
元素包含带有垂直排列菜单项的子菜单。menuitem
元素具有子子菜单,其中的菜单项也是垂直排列的。在阅读以下描述时,还要记住:
menuitem
,menuitemradio
,或 menuitemcheckbox
角色的可聚焦元素,称为菜单项。menuitem
元素,则使用特定的角色名称。menu
角色。menu
,或当 menubar
获得焦点,
键盘焦点会置于第一项上。
如 § 6.6 组件内的键盘导航中所述,所有菜单项都是可聚焦的。
menuitem
元素上时,若其包含子菜单则打开子菜单,并将焦点置于该子菜单中的第一项上。menuitemcheckbox
元素上,在不关闭菜单的情况下切换其选中/未选中状态。menuitemradio
元素上且未选中时,在不关闭菜单的情况下,选中当前 menuitemradio
元素并取消选中同组中任何已选中的 menuitemradio
元素。menuitem
元素上并包含一个子菜单时,则打开子菜单并将焦点置于该子菜单中的第一项上。menuitem
元素上且不包含子菜单时,则激活此菜单项并关闭菜单。menubar
的 menuitem
上,并且 menuitem
有一个子菜单时,打开子菜单并将焦点置于该子菜单的第一项上。menu
元素上时,将焦点下移一项,(可选)当焦点在最后一项 menu
元素上时,将焦点跳转到到第一项。menu
元素上时,将焦点上移一项,(可选)当焦点在第一项 menu
元素上时,将焦点跳转到到最后一项。menubar
的 menuitem
上,并且 menuitem
有一个子菜单时,打开子菜单并将焦点置于子菜单的最后一项上。menubar
元素上时,将焦点移动到下一个菜单项,(可选)当焦点在最后一项 menu
元素上时,将焦点跳转到到第一项。menu
中和带有子菜单的 menuitem
元素上时,打开子菜单并将焦点放在其第一项上。menu
中和不包含子菜单的 menuitem
元素上时,执行以下3个操作:
menubar
元素中的下一个菜单项上。menuitem
元素上时,
可以在不移动焦点到子菜单的情况下,打开该 menuitem
元素的子菜单(推荐),
或打开 menuitem
元素的子菜单,并将焦点置于该子菜单中的第一项。
menubar
元素是不可见的,例如通过菜单按钮打开菜单这类场景,此时当焦点在没有子菜单的菜单项上时,Right Arrow 不会做任何事情。
menubar
元素上时,将焦点移动到上一个菜单项,(可选)当焦点在第一项 menu
元素上时,将焦点跳转到到最后一项。menu
元素中某个菜单项的子菜单上时,关闭此子菜单并将焦点聚焦到父 menuitem
元素上。menubar
元素中某个菜单项的子菜单上时,执行以下3个操作:
menubar
元素中的上一个菜单项上。menuitem
元素上时,
可以在不移动焦点到子菜单的情况下,打开该 menuitem
元素的子菜单(推荐),
或打开 menuitem
元素的子菜单,并将焦点置于该子菜单中的第一项。
menu
或 menubar
元素的第一个菜单项上。menu
或 menubar
元素的最后一个菜单项上menuitem
元素。menubar
元素内,则关闭其 menu
元素和所有打开的父 menu
容器。menubar
元素内,则关闭其 menu
元素和所有打开的父 menu
容器。menuitem
元素。
在这样的实现中,按下 Enter 与 Space 具有导航功能,例如加载新的内容,而在水平菜单栏中按下 Down Arrow 键可以打开与该
menuitem
元素相关联的子菜单。
menubar
垂直排列,项目在 menu
容器水平排列:
menu
元素是:
menuitem
元素一起被包含在同一个 menu
元素内。menuitem
之后的同级元素。menu
或者 true
。false
,反之则置为 true
。tabindex
属性为 -1
或 0
,同时设置 aria-activedescendant 属性为当前聚焦菜单项的 IDtabindex
属性设置为 -1
,但在菜单栏中,第一个菜单项的 tabindex
属性会置为
0
。
true
。
true
。menubar
的元素可以设置 aria-labelledby 属性来引用这个标签。如果没有,则通过设置 aria-label
属性给当前菜单栏提供一个标签。
vertical
。菜单栏的 aria-orientation
属性的默认值为 horizontal
。
menu
角色元素声明以下任一属性:
aria-orientation
属性设置为 horizontal
。菜单的
aria-orientation
属性的默认值为 vertical
。
如果在菜单容器上设置 aria-owns 属性来包含非自身 DOM 子节点的元素,则这些元素将在任何属于容器自身 DOM 子元素的项目之后,以其被引用的顺序出现在阅读顺序中。 管理焦点的脚本需要确保视觉焦点顺序与此辅助技术阅读顺序匹配。
菜单按钮是打开菜单的按钮。它的形态通常为一个带有向下箭头或三角形的按钮,用来提示激活按钮将显示菜单。
a
标签构成的菜单按钮,通过其打开的菜单,菜单项具有链接行为。button
标签制作的菜单按钮,其打开的菜单带有一系列操作或命令,可以通过
element.focus()
来管理菜单中的焦点。
aria-activedescendant
属性来管理其中的焦点。
button
角色的元素将 aria-haspopup 属性设置为 menu
或者 true
。button
角色的元素将 aria-expanded 属性设置为 true
。
当菜单被隐藏时,建议不指定 aria-expanded
属性。
如果需要在菜单隐藏时设置 aria-expanded
属性,则置为 false
。
button
角色的元素设置 aria-controls 属性,该属性可以关联一个具有 menu
角色的元素。
Meter(仪表)用于图形化地表示一个在固定区间内波动的数值。 例如,仪表可用于描述设备当前电量的百分比或汽车的油位。
meter
不应用于表达像目前的世界人口这样的数值,因为其最大值是没有意义的。meter
不应用于指示进度,如加载或任务完成百分比。
要表达进度,请使用角色为 progressbar 的组件。
不适用。
aria-valuemin
和 aria-valuemax
属性值之间。
aria-valuemax
属性的值。
aria-valuemin
属性的值。
aria-valuenow
属性的值以百分比形式显示。
当用户难以理解仪表上百分比形式的值时,可通过设置 aria-valuetext 属性为一个字符串,使仪表的值更容易理解。例如可以设置
aria-valuetext="剩余50%(预计还能使用6小时)"
来表达电池电量的值。
meter
的元素可以设置 aria-labelledby
属性来引用这个标签。如果没有,则通过设置 aria-label 属性给当前元素加上一个标签。单选组是一组可选中的按钮,被称为单选按钮,每次只能选中一个按钮。一些实现可能会初始化该组,使所有按钮处于未选中状态,以便强制用户在经过工作流中的某个点之前选中其中一个按钮。
本节介绍了为大多数单选组实现的键盘交互。对于嵌套在工具栏中的单选组的特殊情况,请参考后续相关章节(Toolbar)中键盘交互的描述。
上面描述的初始焦点行为,与一些浏览器为本地 HTML 单选组提供的行为略有不同。在某些浏览器中,如果没有选中任何一个单选按钮,使用 Shift + Tab 将焦点移动到单选按钮组,焦点将会置于最后一个单选按钮,而不是第一个单选按钮上。
因为方向键是用来在工具栏的各个元素之间进行导航的,Tab 键可以将焦点移入和移出工具栏。所以当一个单选组嵌套在一个工具栏内时,单选组的键盘交互与不在工具栏内的单选组的交互略有不同。例如,用户需要能够在所有的工具栏元素之间进行导航,包括单选按钮,而不需要改变哪个单选按钮被选中。所以,当用方向键在工具栏中浏览一个单选组时,被选中的按钮不会改变。嵌套在工具栏中的单选组的键盘交互方式如下。
工具栏中的单选按钮经常以一种看起来更像切换按钮的方式来设计。例如,请参阅简单的编辑器工具栏示例。
radio
元素的 aria-checked 设置为 true
。如果它没有被选中,则 aria-checked 设置为
false
。
radio
元素都由其内容标记,由可见标签 aria-labelledby 引用,或者有一个用 aria-label 指定的标签。
radiogroup
元素具有由 aria-labelledby 引用的可见标签,或者用 aria-label 指定的标签。
radiogroup
元素或 radio
元素的 aria-describedby 属性引用。
滑块是一个让用户从给定范围内选择值的输入控件。滑块通常有一个滑块拇指控件,可以沿着条形或轨道移动以改变滑块的值。
一些基于触摸的辅助技术的用户在使用实现此滑块模式的 widget 时可能会遇到困难,因为他们的辅助技术为操作滑块提供的手势可能尚未生成必要的输出。为了改变滑块的值,基于触摸的辅助技术需要响应用户手势,通过合成按键事件来增加和减少值。这是一个新的约定,某些辅助技术可能还没有完全实现。在考虑将其整合到生产系统之前,作者应在以触控为主要输入机制的设备上使用辅助技术对滑块 widget 进行全面测试。
aria-orientation
指定垂直方向,使用 aria-valuetext
传达温度输入的计量单位。
aria-valuetext
来传达五星评分量表输入的当前值和最大值。
aria-valuetext
来传达媒体播放器中时间的当前值和最大值,通过将总秒数转换为分和秒,使辅助技术用户容易理解这些值。
aria-valuenow
的值对用户不够友好,例如,用数字来表示星期几,可以将 aria-valuetext 属性置为使滑块值易于理解的字符串,例如,“星期一”。
vertical
。滑块的 aria-orientation
的默认值是 horizontal
。
多拇指控件滑块是具有两个或以上拇指控件的滑块,每个拇指控件可以在一组值中选择一个值。 例如,搜索产品时,用户可以使用两个拇指控件来设置搜索价格的上下限。 使用双拇指控件滑块的拇指控件设置最大和最小值时,不允许拇指控件交换(位置)。 例如,在价格范围选择器中,用于设置价格下限的拇指控件,可以设置的最大值受到用于设置价格上限拇指控件当前取值的限制。 反过来,用于设置价格上限的拇指控件,可以设置的最小值也会受到用于设置价格下限拇指控件当前取值的限制。 不过在一些多拇指控件滑块组中,每个拇指控件可以设置一个独立于其他拇指控件的值。
一些基于触摸的辅助技术的用户在使用实现此滑块模式的 widget 时可能会遇到困难,因为他们的辅助技术为操作滑块提供的手势可能尚未生成必要的输出。为了改变滑块的值,基于触摸的辅助技术需要响应用户手势,通过合成按键事件来增加和减少值。这是一个新的约定,某些辅助技术可能还没有完全实现。在考虑将其整合到生产系统之前,作者应在以触控为主要输入机制的设备上使用辅助技术对滑块 widget 进行全面测试。
多拇指滑块示例:演示用于设置酒店预订价格范围的双拇指控件滑块组。
aria-valuenow
的值对用户不够友好,例如,用数字来表示星期几,
可以将 aria-value
属性置为使滑块值易于理解的字符串,例如,“星期一”。
vertical
。
滑块的 aria-orientation
属性的默认值是 horizontal
。
调节按钮是一个输入 widget,它的值为一组离散值或离散值范围。例如,在一个允许用户设置闹钟的 widget 中,包含一个调节按钮,它允许用户选择一个从 0 到 59 的数字。
调节按钮通常有三个组件,包括显示当前值的文本字段(text field)、增加按钮和减少按钮。文本字段通常是唯一可获得焦点的组件,因为增加和减少功能可以通过键盘的箭头键实现。通常情况下,文本字段还允许用户直接编辑值。
如果调节按钮的可调节范围很大,也可以同时支持用默认步长(step)、更大步长来更改值。例如,在闹钟示例中,用户可以通过 Up Arrow 和 Down Arrow 每次变更 1 分钟,也能通过 Page Up 和 Page Down 每次变更 10 分钟。
日期选择器调节按钮示例:由三个调节按钮组成的日期选择器,分别代表日、月和年。
contenteditable
属性的元素提供这些功能。aria-valuenow
的值不便于用户理解,例如,用数字来表示星期几,则可以将 aria-valuetext 属性设置为使调节按钮的值易于理解的字符串,如“星期一”。
true
。
请注意,大多数实现会阻止输入无效值,但在某些情况下,阻止所有无效输入可能不切实际。
Switch(开关)是一个输入
widget,允许用户选择以下两个值之一:打开
或关闭
。开关类似于多选框和切换按钮,都可以用作二进制输入(binary
inputs)。它们间的区别在于开关只能用于二进制输入,而多选框和切换按钮允许实现选择支持第三种状态(中间状态)。多选框可以选中
或未选中
,可选地还能允许部分选中
状态。切换按钮可以按下
或未按下
,可选地还能允许部分按下
状态。
开关、多选框和切换按钮都支持二进制输入,因此在功能上它们通常可以互相替换。选择最符合用户界面的视觉设计和语义角色,例如,在某些情况下,打开或关闭
比选中或未选中
在语义上更容易被辅助技术用户理解,反之亦然。以用于打开或关闭灯光(turning
lights on or off)的 widget 为例,屏幕阅读器朗读出 灯光,已打开
(Lights switch on) 比已选中,灯光,多选框
(Lights checkbox
checked)更友好。但是,如果相同的输入位于一组标有以下哪项必须包括在你的起飞前程序中?
的输入中,已选中,灯光,多选框
会更好理解。
重要提示:改变开关的状态不会导致开关的标签发生改变,这一点至关重要。
div
元素实现的开关,用于打开和关闭通知首选项。 button
元素实现的 2 个开关,用于打开和关闭灯光。input[type="checkbox"]
元素实现的 2 个开关,用于打开和关闭辅助功能首选项。switch
角色的元素中包含的可见文本内容。switch
角色的元素上设置 aria-labelledby,其值引用可见标签的元素的 ID。switch
角色的元素上设置 aria-label。on
时,aria-checked 设置为 true
。off
时,aria-checked 设置为 false
。input[type="checkbox"]
开关元素,则使用 HTML 的 checked
属性而非
aria-checked
属性。
fieldset
元素中,而集合的标签包含在 HTML legend
元素中。
就像 HTML table
元素一样,WAI-ARIA 表格是包含一行或多行的静态表格结构,每行包含一个或多个单元格;它不是交互式 widget。因此,其单元格不支持聚焦、选择。
网格模式可用于实现具有表格结构的交互式 widget。
但是,表格通常用于呈现信息和交互式 widget 的组合。 由于表格不是 widget,因此表格中包含的每个 widget 都是页面 tab sequence 中的一个独立的断点。 如果 widget 的数量很大,用网格替换表格可以极大地减少页面 tab sequence 的长度,因为网格是一个可以包含其他 widget 的复合 widget。
与其他具有等效原生宿主语言的 WAI-ARIA 角色一样,
强烈建议作者尽可能使用原生 HTML table
元素。
这对于 table
角色尤其重要,因为它是 WAI-ARIA 1.1
的新功能。
因此,建议使用目标受众可能使用的每种浏览器和辅助技术组合来进行彻底的测试实施。
不适用。
table
元素或具有 rowgroup 角色元素的 DOM 子节点被其拥有。
row
元素的 DOM 子节点或被 row
元素拥有,并具有以下角色之一:
如果行或单元格通过 aria-owns
包含在表格中,
它们将在 table
元素的 DOM 子节点之后呈现给辅助技术,除非 DOM 子节点也包含在 aria-owns
属性中。
选项卡是一组分层的内容部分,称为选项卡面板,每次只显示一个内容面板。每个选项卡面板都有一个与之关联的选项卡元素,选项卡激活时显示面板。选项卡元素的列表沿着当前显示面板的一条边(最常见的是顶部边缘)排列。
用来描述这种设计模式的术语包括:
当选项卡界面初始化时会显示其中一个选项卡面板,与其关联的选项卡被特殊样式化以表示它是激活的。用户激活某个选项卡元素时,先前展开的选项卡面板隐藏,与该选项卡关联的选项卡面板变得可见,该选项卡被认为是“激活的”(active)。
对于选项卡列表:
tab
元素上。vertical
时:
tablist
角色的元素中。
tab
(关联的)内容面板的元素都具有 tabpanel 角色。tablist
角色元素的 aria-labelledby 设置为指向标签元素的值。否则,tablist
元素通过 aria-label 来设置标签。
tab
角色的元素都有指向其关联 tabpanel
元素的 aria-controls 属性。
true
,所有其他选项卡元素上则将其置为 false
。tabpanel
角色的元素都有指向其关联 tab
元素的 aria-labelledby
属性。tab
元素有弹出式菜单,其 aria-haspopup 属性设置为 menu
或 true
。tablist
元素是垂直方向呈现的,其 aria-orientation 属性设置为 vertical
。tablist
元素的
aria-orientation
属性默认值是 horizontal
。
Toolbar(工具栏)是一个容器,用于组合一系列控件(controls),如按钮、菜单按钮或多选框等。
当一组控件在视觉上呈现为一个组时,工具栏的作用可以用来向屏幕阅读器用户传达该组的存在和目的。同时将控件分组到工具栏中,也是减少键盘界面中 tab sequence 数量的一种有效方式。
最大化工具栏 widget 的优势(有几种方式):
工具栏示例:通过 roving tabindex 来管理焦点的工具栏,并包含以下几种类型的控件,包括切换按钮、单选按钮、一个菜单按钮、一个调节按钮(spin button)、一个多选框和一个链接。
vertical
。默认情况下工具栏是水平排列的。注:关于此设计模式的工作正在进行中,尚未达成工作组共识。进度和问题请关注 issue 128。
文字提示是元素获得键盘焦点或鼠标悬停其上时,显示的与元素相关的信息弹窗。它通常在一小段延迟后出现,并在按下 Escape 或鼠标移出时消失。
文字提示 widget 不会获得焦点。如需实现鼠标悬停后出现可聚焦元素的内容,可以通过非模态对话框模式实现。
文字提示的开发示例相关工作请看 issue 127。
Escape:关闭文字提示。
树形视图 widget 展示了一个分层的列表。层次结构中的任何项目都可以有子项,可以展开或折叠有子项的项目以显示或隐藏子项。例如,在一个使用树形视图显示文件夹和文件的文件系统导航器中,可以展开代表文件夹的项目以显示文件夹的内容,这些内容可能是文件、文件夹或两者皆有。
理解树形视图的术语包括:
当使用键盘在树形组件导航时,一个可视化的键盘指示器会告知用户哪个节点是聚焦的。如果树形组件每次只允许用户选择一个项目进行操作,则称为单选树(single-select tree)。在一些单选树的实现中,焦点项也具有选中状态;这种表现称为选择跟随焦点(selection follows focus)。然而,在多选树中,用户可以一个动作选择一个以上的项目,选中状态往往独立于焦点。例如,在一个典型的文件系统导航器中,用户可以移动焦点来选择任何数量的文件以进行下一步操作,如复制或移动。视觉设计时区分已选中的项目和拥有焦点的项目是很重要的。想了解与之相关的更多细节,请参阅关于聚焦和选中之间差异的描述,以及决定何时让选择自动跟随焦点。
aria-level
、aria-posinset
和 aria-setsize
属性。
aria-level
、aria-posinset
和 aria-setsize
的值。
aria-level
、aria-posinset
和 aria-setsize
属性。
对于一个垂直方向的树形组件:
tree
角色支持 aria-activedescendant
属性,在实现键盘导航时,它提供了一种在 treeitem
元素之间移动 DOM 焦点的替代方法。详情请参阅使用
aria-activedescendant 管理合成组件中的焦点。
tree
角色的元素中,或者由 tree
元素上设置的 aria-owns 属性引用。treeitem
角色的父节点元素,节点关闭时 aria-expanded 属性置为 false
,节点打开时置为
true
。端节点没有 aria-expanded
属性,因为如果它们有这个属性,辅助技术会错误地将它们描述为父节点。
tree
角色元素的 aria-multiselectable 属性设置为
true
。否则,aria-multiselectable
属性置为 false
,或者隐含默认值为 false
。
aria-selected
表示,则不为任何节点指定 aria-checked
。或者,如果选择状态用
aria-checked
表示,则不为任何节点指定
aria-selected
。关于具体应该使用哪个属性,以及在同一个树形组件中可能允许同时使用两种属性的不寻常条件的细节,请参见下面的“说明”。
true
。如果具有 tree
角色元素 aria-multiselectable 不为
true
,则每次只能选择一个节点。
false
。
tree
角色的元素有一个由 aria-labelledby 引用的可见标签或为 aria-label 指定的值。tree
元素是水平方向的,其 aria-orientation 设置为 horizontal
。tree
元素的
aria-orientation
属性的默认值是 vertical
。
aria-selected
或 aria-checked
表示选择时,要考虑的一些因素是:
aria-selected
,对多选 widget 使用
aria-checked
。在没有其他因素使另一种约定更合适的情况下,这是一个推荐的约定。
aria-selected
和 aria-checked
的条件是极其罕见的。强烈建议避免设计一个需要多于一种状态的树形
widget。如果要在一个树形中使用这两种状态,需要满足以下所有条件:
aria-selected
的含义和作用与用户界面中的 aria-checked
的含义和作用不同。
Treegrid(树形网格)widget
是一种由可编辑或可交互的表格信息组成的分层数据网格。
层次结构中的任何行都可以拥有子行,拥有子行的行可以展开或折叠以显示或隐藏子行。
例如,在用于显示 e-mail 邮件和邮件回复讨论列表的的 treegrid
中,带有回复的邮件统一放在可以展开的行中,以显示回复信息。
在树形网格中,行和单元格都是可聚焦的。无论单个单元格内容是否可编辑、可交互,每一行和每个单元格都包含一个可聚焦元素或本身是可聚焦的。
有一个例外情况是:如果列标题单元格不提供排序或筛选等功能,则它们不需要可聚焦。
支持所有单元格接收或包含键盘焦点一个重要原因是,当用户与网格交互时,屏幕阅读器通常处于其应用阅读模式,而不是文档阅读模式。
在应用模式下,屏幕阅读器用户只能听到可聚焦元素(focusable elements)和用以标记可聚焦元素的内容(content that labels focusable elements)。
因此,屏幕阅读器用户可能会无意中忽略 treegrid
中包含的那些不可聚焦的,或不是用来标记列或行的元素。
使用键盘导航 treegrid
时,visual keyboard indicator 会告知用户当前聚焦在哪一行或哪个单元格上。如果 treegrid
每次只允许用户选择一个项目进行操作,则称为单选 treegrid
,并且具有焦点的项目同时也处于选中状态。
然而,多选 treegrid
允许用户每次选择多个行或单元格进行操作,这种情况下选中状态与焦点无关。
例如,在一个分层 e-mail 讨论网格中,用户可以移动焦点来选择任意数量的行进行删除或移动操作。视觉设计时区分被选中的项目和拥有焦点的项目是很重要的。想了解与之相关的更多细节,请参阅关于聚焦和选中之间差异的描述。
treegrid
示例:用于导航 e-mail 收件箱的树形网格,演示了三种键盘导航模型——优先聚焦行、优先聚焦单元格和仅聚焦单元格。
以下按键通过在网格的行和单元格中移动焦点来提供 treegrid
导航。
当网格中的元素获得焦点时,例如用户用 Tab 将焦点移至网格后,实现 treegrid
(模式)使这些按键命令可用。
将焦点移至网格中可能会聚焦第一个单元格或第一行。
焦点是在单元格还是行上取决于作者的偏好以及是否支持行焦点,因为某些 treegrid
可能不支持为行提供焦点。
aria-expanded
属性的单元格上,则打开或关闭子行。否则,执行单元格的默认操作。treegrid
widget 移至下一个可聚焦元素。treegrid
导航键移动焦点时,焦点是设置在网格单元格内的元素还是单元格上,取决于单元格内容。请参阅聚焦于单元格还是单元格内的元素。
如果树形网格支持选择单元格、行或列,则以下按键通常用于这些功能。
关于剪切、复制和粘贴键的分配,请查阅 § 6.8 常用功能的按键分配约定。
treegrid
元素或具有 rowgroup 角色元素的 DOM 子元素或由其拥有。
row
元素的 DOM 子元素或被其拥有,并且具有以下角色之一:
row
是一个父行(parent row)。每个父行都在 row
元素或 row
中包含的单元格上设置了 aria-expanded 状态。未显示子行时 aria-expanded
属性设置为 false
,显示子行时设置为 true
。不控制子行显示的行没有 aria-expanded
属性,因为如果它们拥有这个属性,辅助技术将会错误地将其描述为父行。
treegrid
角色的多选树形网格,并且 aria-multiselectable 属性设置为
true
。否则,则称为单选树形网格,并且 aria-multiselectable
属性设置为 false
,或隐含默认值为
false
。
true
,并且它不会出现在树形网格中的任何其他行或单元格上。true
。false
。true
。
如果禁用所有单元格的编辑功能,与其在每个单元格上设置 aria-readonly
为 true
,不如直接在树形网格元素上将
aria-readonly
设置为 true
。
不提供单元格内容编辑功能的树形网格中任何元素都不设置 aria-readonly
属性。
treegrid
角色未应用于 HTML table
元素,那么按照网格和表格属性所述,应该应用 aria-rowspan 或 aria-colspan 属性。
table
构建的 treegrid
,如果包含跨多行或多列的单元格,必须使用 HTML 的 rowspan
和
colspan
属性(来定义),而不能使用 aria-rowspan
或 aria-colspan
属性。
treegrid
元素的 DOM 子元素之后呈现给辅助技术,除非
DOM 子元素也包含在 aria-owns
属性中。
注意: ARIA 1.1 引入了对 separator 角色的修改,因此它可在获得焦点时表现为 widget。 虽然此模式已被修改以符合 ARIA 1.1 规范,但是在完成符合 ARIA 1.1 规范的功能示例之前,工作组不会完成其审查。 进度和问题请关注 issue 129。
窗口拆分器是可在两个部分或窗格之间移动的 separator,使用户能够改变窗格的相对大小。 窗口拆分器可以是可调整的,也可以是固定的。 固定的窗口拆分器在两个位置之间切换,而可变的窗口拆分器可以调整到允许范围的任何位置。
窗口拆分器具有一个值,该值表示其中一个窗格的大小,在此模式中,该窗格称为主窗格。 当拆分器具有其最小值时,主窗格具有其最小尺寸,辅助窗格具有其最大尺寸。 拆分器具有与主窗格的名称匹配的可访问名称。
以图书阅读应用程序为例,该应用程序具有目录的主窗格和显示图书某一部分内容的辅助窗格。
这两个窗格由标有“目录”的垂直拆分器分隔。
当目录列表窗格具有其最大尺寸时,拆分器的值为 100
,
当目录列表窗格完全折叠时,拆分器的值为 0
。
注意,术语“主窗格”不描述窗格中内容的重要性或用途。
开发窗口拆分器 widget 示例的工作请参考 issue 130。
固定大小的拆分器无须实现方向键功能。
0
。100
。本章暂无中文版,详情请访问英文版 Landmark Regions
本章暂无中文版,详情请访问英文版 Providing Accessible Names and Descriptions
本章暂无中文版,详情请访问英文版 Developing a Keyboard Interface
本章暂无中文版,详情请访问英文版 Grid and Table Properties
本章暂无中文版,详情请访问英文版 Communicating Value and Limits for Range Widgets
presentation
Role本章暂无中文版,详情请访问英文版 Intentionally Hiding Semantics with the presentation Role
本章暂无中文版,详情请访问英文版 Roles That Automatically Hide Semantics by Making Their Descendants Presentational
本章暂无中文版,详情请访问英文版 Structural Roles
本章暂无中文版,详情请访问英文版 Change History
本章暂无中文版,详情请访问英文版 Acknowledgements
本章暂无中文版,详情请访问英文版 References