似乎没有任何明确的答案或资源,因此您只能获得意见。这是我的:
我会首先考虑如何标记整个表单。我认为the semantic form style described in MDN article 是一个很好的起点。特别是表单在逻辑上是表单控件列表的部分,因此您应该有 <ul> 和 <li> 元素以语义顺序包装控件。但是,我认为它有一个问题部分,它使用逻辑标记,如
<label><input>text</label>
单选按钮,但是
<label>text<input></label>
用于文本输入。我非常希望标记顺序不会根据输入类型(复选框/单选按钮与文本/电子邮件/密码)而改变。要在实践中做到这一点,您可能希望始终使用标记,如
<li class="checkbox">
<label for=id1>text</label>
<input id=id1>
</li>
然后您可以使用例如样式来设置样式li.checkbox { display: flex; ... } 并根据需要重新排序标签和视觉输入。显然,class 仅用于样式,但不需要用于语义。如果浏览器曾经实现过:has(),那么就根本不需要class。
至于输入的帮助文本,理论上,你会想要使用
<li class="checkbox">
<label for=id1>text</label>
<input id=id1>
<label for=id1 class=help>help content here</label>
</li>
因为按照规范,应该可以将多个标签附加到单个输入。但是,据我所知,这在实践中不适用于需要辅助功能的盲人常用的软件。
因此,下一个问题是您认为以下所有群体应如何使用此帮助文本?
- 有视力但不支持 JavaScript 的用户。 (请注意,该组包括大多数搜索引擎。)
- 不支持 JavaScript 的盲人。
- 有远见且支持 JavaScript 的用户。 (请注意,该组包括一些搜索引擎。)
据我所知,没有一个好的答案可以完美地满足所有 3 个群体的需求。请注意,对于另一个组“支持 JavaScript 的盲人”的实际支持,您可以使用任何您想要的标记并使用 ARIA 属性使其可访问。总的来说,我能想到的最好的如下:
<li class="checkbox">
<label for=id1>text</label>
<input id=id1 aria-describedby=id2>
<aside id=id2>help content here</aside>
</li>
这应该足以将帮助内容附加到辅助工具的输入中,帮助内容是语义上的附加内容,因此<aside> 对盲人和视觉用户都应该没问题,您只能使用 CSS 来制作 @ 987654334@ 仅在输入获得焦点时可见。另请注意,<aside> 允许任何内容寻求帮助,包括 iframe 中的视频,而不仅仅是文本。当然,如果您需要用户在<aside> 元素内单击,则不能使用input:focus 来切换元素可见,但您需要使用某种JavaScript 支持。确切的详细信息取决于您最想迎合哪个群体,以及您是否希望所有群体都可以使用帮助文本。
此标记还包含您根据 JavaScript 的需要对其进行整理所需的所有信息。对于某些非 JavaScript 样式选项,您可能希望将标签和输入包装在一些包装器元素中,以便您可以将它们定位为与 <aside> 元素分开的组。在这种情况下,标记就像
<li class="checkbox">
<div>
<label for=id1>text</label>
<input id=id1 aria-describedby=id2>
</div>
<aside id=id2>help content here</aside>
</li>
可能是一个不错的选择。如果需要,您可以通过选择器 form li.checkbox>div 定位该无类 <div> 元素。然后可以使用例如display:grid 或 subgrid 用于 li.checkbox 和例如display:flex li.checkbox>div 可以很好地定位所有内容。但是,如果您这样做,您将无法简单地通过使用input:not(:focus) + aside { display: none; } 之类的样式来很好地切换帮助文本的可见性。如果您将display:grid 用于li.checkbox,我认为您可以在没有包装器<div> 的情况下生存,因为与flex 不同,它允许在2D 中定位内容。
如果您需要支持有远见的用户但不支持 CSS,那么我没有好的解决方案。使用上面提到的语义列表标记会导致除表单输入之外的项目符号,这对于非 CSS 用户来说可能看起来很混乱。