【问题标题】:Is a role="group" valid under a role="tree"角色=“组”在角色=“树”下是否有效
【发布时间】:2021-02-06 02:03:21
【问题描述】:

假设我有一个角色=“树”的元素。在此之下,我有一个元素 role="group",其中包含用于多级树的 role="treeitem" 或 role="group" 元素。

<... role="tree">
    <... role="group">
        <... role="treeitem">
        <... role="treeitem">
        <... role="group">
            <... role="treeitem">
            <... role="treeitem">

这里的问题是可访问性测试工具抱怨角色为“tree”的元素必须包含一个角色为“treeitem”的子元素。

查看spec,它说

Required Owned Elements:    
        group → treeitem
        treeitem

我该如何解释?树是否应该直接包含树项?树是否可以有一个包含树项的组,但树没有角色“treeitem”的直接子项?

-- 编辑--

这是完整的html

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Test Tree A11y</title>
    </head>
    <body>
        <div role="main">
            <!-- tree contains a group which contains treeitems/group -> treeitems -->
            <ul role="tree">
                <ul role="group">
                    <li role="treeitem">Banana</li>
                    <li role="treeitem">Mango</li>
                    <ul role="group">
                        <li role="treeitem">Banana-2</li>
                        <li role="treeitem">Mango-2</li>
                        <li role="treeitem">Orange-2</li>                    
                    </ul>
                </ul>
            </ul>

            <!-- tree contains a treeitems or groups which contains treeitem -->            
            <ul role="tree">
                <li role="treeitem">Banana</li>
                <li role="treeitem">Mango</li>
                <ul role="group">
                    <li role="treeitem">Banana-2</li>
                    <li role="treeitem">Mango-2</li>
                    <li role="treeitem">Orange-2</li>                    
                </ul>
            </ul>
        </div>
    </body>
</html>

这里的问题是

具有角色“树”的元素是否应该必须包含一个或多个“树项”? 它可以包含一个包含“treeitems”的“组”吗?

在第一棵树中

  • Tree 有一个组,没有角色 treeitem 的直接子代
  • 该组有树项目和一个有其他树项目的组 这被报告为错误 WCAG 1.3.1。 但是,屏幕阅读器似乎工作正常

在第二棵树中

  • 树有一个树项和一个组,该组具有其他树项

在规范中,我找不到明确的声明,即树必须包含 1 个或多个具有角色树项的 DIRECT 子项。所以我不确定第一棵树是否存在实际可访问性问题,以及第一棵树是否违反规范。

FWIW,有一个名为 JSTree 的控件使用第一棵树中所示的样式,我正在争论这是否是一个真正的问题。谢谢。

【问题讨论】:

  • 您能否添加您的实际 HTML 而不是伪 HTML,因为没有看到您如何正确构建它,很难给出指示。必须至少有一个treeitem,但它可以有一个由它控制的group 兄弟,这就是为什么grouptree 的有效后代。如果您可以给我们一个您认为应该可以工作但验证器失败的 HTML 示例,我们可以更好地解释。
  • @GrahamRitchie,谢谢。我编辑了帖子并添加了更多细节。感谢您的回复

标签: accessibility wai-aria accessibility-insights


【解决方案1】:

简答

虽然将group 作为tree 的直接后代是有效的HTML 和WAI-ARIA,但如果它没有与相应的treeitem 关联,则不是预期或推荐使用。

由于tree 的构造方式不同,它是role="tree" 的允许子代。

长答案

首先,将role="group" 作为role="tree" 的唯一后代是完全“有效的”(它是有效的标记)。

尽管有效,但它不是推荐的处理方式,并且可能会导致意外行为,具体取决于所使用的屏幕阅读器和浏览器组合。

关键是在WAI-ARIA best practices document 中声明:

每个根节点都包含在具有角色树的元素中,或者由树元素上设置的 aria-owns 属性引用。

因此,当您将顶级节点放入role="group" 时,您就违反了此规则,除非您为组中的每个treeitems 分配一个ID,然后在role="tree" 上使用aria-owns。此时group 无论如何都会变得毫无意义,因为您已经绕过它。

如果不推荐,为什么允许role="group" 作为role="tree" 的后代?

现在您可以争辩说,如果将 group 作为 role="tree" 中的顶级项目无效,那么一开始就不应该允许它。

但是,role="group" 允许在顶层的原因是您可以设置一个treeitem 来打开一个group,并且这些可以在同一级别(兄弟姐妹)。

我想我可以用一个例子来最好地解释这一点:-

代码示例 1 - 有效,因为 group 有父 treeitem,因此不充当根节点。

<div id="tree1" role="tree" tabindex="-1">
  <div role="treeitem" aria-owns="pizzaGroup" aria-expanded="false" tabindex="0">Pizza Toppings</div>
  <ul role="group" id="pizzaGroup">
      <li role="treeitem">Cheese</li>
      <li role="treeitem">Pepperoni</li>
      <li role="treeitem">Onion</li>
   </ul>
</div>

在上面的示例中,第一个 div 充当treeitem,组由它控制。与aria-owns 建立关联。

它声明它必须包含group -&gt; treeitem 的原因是因为不允许空组。

以上是role="tree" 的有效示例,但如果您可以避免使用support for aria-owns is not great,我不建议使用该模式。

公认的做法是将group 嵌套在treeitem 本身中,并始终使用&lt;ul&gt;&lt;li&gt;。大多数屏幕阅读器会自动将子节点与父节点关联,而那些仍然无法让用户锻炼关系的屏幕阅读器会很好地支持嵌套的&lt;ul&gt;&lt;li&gt;

示例 2 - 使用 &lt;ul&gt;&lt;li&gt; 的推荐模式示例

<ul role="tree">
    <li role="treeitem" aria-expanded="false" tabindex="0">
    <span>Pizza Toppings</span>
        <ul role="group">
            <li role="treeitem">Cheese</li>
            <li role="treeitem">Pepperoni</li>
            <li role="treeitem">Onion</li>
        </ul>
    </li>
</ul>

希望这能回答为什么无障碍工具抱怨没有treeitem 以及为什么您可以group 作为tree 的子级,但前提是它由关联的treeitem

最后的想法

在您的示例中,您没有为树提供标签。不要忘记为主要元素添加标签role="tree",可以是可见标签和aria-labelledby="yourLabelID"(首选),也可以是aria-label="description of tree"

在聊天讨论后更新

如果只有指导更清楚!

正如我所指出的,我对“根节点”的支持信息仍然不清楚,公平地评论它仍然可以解释为 group 可以是该定义中的根节点。

然而在definition of a treeview 的更深处,再加上另一条规则,有足够的清晰度可以确认group 实际上根本不可能被算作根节点!

这些是树中节点的定义:

节点 树中的一个项目。

根节点 树底部的节点;它可能有一个或多个子节点,但没有父节点。

子节点 有父节点的节点; 任何不是根节点的节点都是子节点。

父节点 具有一个或多个子节点的节点。它可以打开(展开)或关闭(折叠)。

采取以下规则:

每个子节点都包含在一个元素中或由其拥有孩子。

因此,在任何情况下都不能将group 算作根节点(或任何节点),它不能有父节点,因此违反了上述规则。

让我解释一下为什么会这样,以及为什么你永远不能将 group 视为根节点:

您将treeitem 添加到group 的第二次必须满足以下条件:

  • 它必须是子节点,因为它不是根节点。
  • 每个子节点必须由role="group" 包含或拥有,该role="group" 必须由作为新添加的treeitem 的父节点的节点包含或拥有。
  • 根项目可以没有父节点,我们的group 需要parent 才有效。

示例 3 - 无效,因为 group 没有父节点并且必须充当根节点(它不能)。

<div role="tree">
     <!--this group is a root level node and does not have a parent node. -->
     <div role="group">
         <!--This treeitem must be within a "group" as it is a child node. -->
         <!--This means that the "group" above contains it and that means the group above must be owned or controlled by something.-->
         <!--This treeitem can never have a parent as root level nodes cannot have a parent node.-->
         <div role="treeitem">item</div>

     </div>
 </div>

就我而言,以下内容消除了所有歧义:

每个作为树节点的元素都有角色treeitem。

所以我最初的前提是正确的,为什么 group 被允许作为 tree 中的顶级项目。

事实上更清楚的是,一个组永远不会成为根节点(或者根本就不能成为一个节点,因为你不能拥有role="treeitem group"!),而group 的唯一原因是显示为 tree 的直系后代是,如果它是具有 treeitem 控制它的兄弟姐妹(它是父级),正如我最初所说的那样。

【讨论】:

  • 完全没有问题,来帮忙!
  • 抱歉,您误读了“根节点”的概念。根节点的角色可以是treeitemgroup。根节点被定义为“树根节点”,仅此而已。当节点在角色tree DOM 元素之外时使用aria-owns(请参阅同一段落中的注释)
  • 更新了我的答案以包含更多信息。我可以理解为什么您可能会认为,从我给出的示例中,希望以上更清楚地证实group 不能是root node
  • @GrahamRitchie,这感觉就像我回到了原点,我确信我错过了一些东西。让我再次说明这一点,看看我是否可以更清楚地说明这一点。 1.我完全同意为什么“根节点”不能是一个组。 RootNode,无论如何都有“树”的作用。 2. 在您的示例中,根节点没有角色“treeItem”的直接子节点。直接子元素是具有来自 DOM 树透视的角色“组”的元素。 3. 根节点(DOM 视角)的唯一子 div 是一个组,它作为具有角色“tree Item”的元素。我是否在解释我的示例中的第一棵树是有效的?
  • 您是在谈论最后一个示例,因为该示例旨在说明如果一个组不属于另一个组,为什么它不能成为顶级项。如果您指的是那个,我更新中的最后一个示例确实无效?
【解决方案2】:
Required Owned Elements:    
        group → treeitem
        treeitem

treeitem 的文档将帮助你理解这个主题

作者必须确保角色为 treeitem 的元素包含在角色为 grouptree 的元素中或归其所有。

这意味着tree 项的叶子必须全部为treeitem

那些treeitem 可以直接在tree 项或group 项的任何级别下。

treeitem 下不能有 treeitem

【讨论】:

  • 谢谢,但这不是问题
  • 你的评论很粗鲁。您的问题是“树是否应该直接包含树项?树是否可以有一个包含树项但树没有角色“树项”的直接子项的组?”。答案是“那些树项可以直接在树项下或任何级别的组项下。”。这意味着第一个“不一定”,第二个是“是”(任何级别的组项目)
  • 我不是故意粗鲁的。谢谢你们的cmets。也许我没有正确描述我的问题。问题不在于树项的规则。问题是关于一棵树是否必须包含一个或多个作为子项的树项。它可以包含一个具有树项的组吗?再次感谢
  • 简单来说:你的例子是完全有效的。两组的争议较小(因为有一组没有太大的兴趣),但我猜你的工具仍然会报告错误,而它不应该。
  • 似乎有不同的解释,规范也不清楚。我可以看到树必须包含 1+ 个树项和 0+ 个组的论点。在这种情况下,只有当您有 2 级树项时,您才会有一个组。很高兴看到规范中的明确声明,这样我就可以确定这是我的代码或可访问性检查器中的错误
猜你喜欢
  • 2021-02-24
  • 2021-09-08
  • 2018-01-01
  • 2021-04-06
  • 1970-01-01
  • 2016-08-26
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多