Html 创建带有分隔符/子标题的可访问列表
我正在尝试确定创建具有子标题(或组分隔符/可折叠标题,如果愿意)的可访问手风琴/列表的最佳方法 为了说明这一点,这是默认设置的外观(示意图): 有些项目是可点击的(并通过更改背景颜色和光标提供提示),有些则不是(如“列表项目13”) 某些(或所有)子标题可能是可折叠的(稍后添加一些附加提示): 现在,可以通过几种可能的方式实现该结构: 选项1。让标准和可访问性见鬼去吧Html 创建带有分隔符/子标题的可访问列表,html,accessibility,Html,Accessibility,我正在尝试确定创建具有子标题(或组分隔符/可折叠标题,如果愿意)的可访问手风琴/列表的最佳方法 为了说明这一点,这是默认设置的外观(示意图): 有些项目是可点击的(并通过更改背景颜色和光标提供提示),有些则不是(如“列表项目13”) 某些(或所有)子标题可能是可折叠的(稍后添加一些附加提示): 现在,可以通过几种可能的方式实现该结构: 选项1。让标准和可访问性见鬼去吧 <ul> <div class="header"><a href="...">Hea
<ul>
<div class="header"><a href="...">Header 1</div>
<li><a href="...">List item 11</a></li>
<li><a href="...">List item 12</a></li>
<li><span>List item 13</span></li>
<div class="header"><a href="...">Header 2</div>
<li><a href="...">List item 21</a></li>
<li><span>List item 22</span></li>
</ul>
- 清单项目13
- 清单项目22
这个确实有用。它是不可访问的,也不能通过HTML验证,但它可以工作
选项2。嗯,至少它通过了验证程序
<ul>
<li class="header"><a href="...">Header 1</a></li>
<li><a href="...">List item 11</a></li>
<li><a href="...">List item 12</a></li>
<li><span>List item 13</span></li>
<li class="header"><a href="...">Header 2</a></li>
<li><a href="...">List item 21</a></li>
<li><span>List item 22</span></li>
</ul>
- 清单项目13
- 清单项目22
这一个通过了验证,并且在一定程度上可以访问,但不允许在标题和常规可单击列表项之间进行区分(就屏幕阅读器而言)
选项3。TL;DR
<ul>
<li>
<a class="header" href="...">Header 1</a>
<ul>
<li><a href="...">List item 11</a></li>
<li><a href="...">List item 12</a></li>
</ul>
</li>
<li>
<a class="header" href="...">Header 2</a>
<ul>
<li><a href="javascript:;">List item 21</a></li>
<li><span>List item 22</span></li>
</ul>
</li>
</ul>
-
-
- 清单项目22
这一个,或者是一些经过深思熟虑的变化,似乎就是其中之一。可访问,因为我假设屏幕阅读器应该正确读取外部或内部项目符号,并通过验证
它只是需要更多的PITA代码和维护。从JS和CSS的角度来看,尤其是如果它是一个插件,打算扩展和定制
所以问题是——如果有,上面哪一个会更好。或者,最终的手风琴/列表实现是什么?(根据我的经验,这可能是一个白日梦)第三个选项在可访问性方面远远优于其他两个选项。如果手风琴/列表确实有很多内容,那么在每个列表项中添加标题(
,
,等等)可能是值得的。这将为页面提供更多的语义结构,这将有助于使用辅助技术的用户
<h1>Some sections</h1>
<ul>
<li>
<h2><a class="header" href="...">Header 1</a></h2>
<ul>
<li><a href="...">List item 11</a></li>
<li><a href="...">List item 12</a></li>
</ul>
</li>
<li>
<h2><a class="header" href="...">Header 2</a></h2>
<ul>
<li><a href="javascript:;">List item 21</a></li>
<li>List item 22</li>
</ul>
</li>
</ul>
某些部分
-
-
- 清单项目22
第三个选项也是使用JavaScript进行风格设计和操作的最佳选择,因为它具有层次性
隐式剖切
评论中有一个关于隐含和明确部分的讨论,所以我想我会解决它。我试图下载来测试这一点,但不幸的是,它似乎没有显示在酒吧。以下是我的理解:
HTML5中的分段根元素是:
后面的
仍然是1.1标题1的一部分
<!-- start 1. Some sections -->
<h1>Some sections</h1>
<ul>
<li>
<section>
<!-- start 1.1. Header 1 -->
<h2><a class="header" href="...">Header 1</a></h2>
<ul>
<li><a href="...">List item 11</a></li>
<li><a href="...">List item 12</a></li>
</ul>
</section>
</li>
<li>
<!-- end 1.1. Header 1 -->
<section>
<!-- start 1.2. Header 2 -->
<h2><a class="header" href="...">Header 2</a></h2>
<ul>
<li><a href="javascript:;">List item 21</a></li>
<li>List item 22</li>
</ul>
</section>
</li>
</ul>
<!-- end 1. Some sections -->
部分章节
-
-
- 清单项目22
也就是说,一旦你开始一个子部分,你就不能结束它,直到你开始另一个部分,所以
将包含在'1.1'的末尾。标题“1”,也包含在其父节“1”中。“某些部分”
工具书类
部分
然后(在列表中使用标题时)。@unor这是从哪里获得的?根据W3C-任何流内容(H2是)都可以是li
的内容。以上是完全有效的HTML5。@ZenMaster:在语法上是允许的。但这将是文件大纲的一个问题:新章节的开始(→ 标题所介绍的开场白li
),仍然是上一节的一部分。如果您明确地使用部分
(或任何其他部分元素),则该部分的开始和结束将被明确指定。@unor不确定我是否遵循。如果H2位于不同的流动元件中,为什么它仍然是上一节的一部分?@DanielImms给出了令人惊叹的答案和解释。然而,@unor似乎意味着下一个“外部”li
,这让我大吃一惊,并引发了讨论的大部分。接受。你能举一个实际的例子吗?嗯。。。什么都可以。标题为字母的项目列表,该部分中的项目以字母开头。或任务列表,任务根据优先级分为多个子部分。你的选择。
<!-- start 1. Some sections -->
<h1>Some sections</h1>
<ul>
<li>
<section>
<!-- start 1.1. Header 1 -->
<h2><a class="header" href="...">Header 1</a></h2>
<ul>
<li><a href="...">List item 11</a></li>
<li><a href="...">List item 12</a></li>
</ul>
</section>
</li>
<li>
<!-- end 1.1. Header 1 -->
<section>
<!-- start 1.2. Header 2 -->
<h2><a class="header" href="...">Header 2</a></h2>
<ul>
<li><a href="javascript:;">List item 21</a></li>
<li>List item 22</li>
</ul>
</section>
</li>
</ul>
<!-- end 1. Some sections -->