我的DOM中有以下代码:

<fieldset> 
  <legend id="language-legend">What languages do you know?</legend>
  <p id="language-description">
    You can select one or more.
  </p>
  <div class="form-check">
    <input name="language" class="form-check-input" type="checkbox" value="python" id="language-checkbox-1" aria-labelledby="label-1 language-legend" aria-describedby="language-description">
    <label id="label-1" class="form-check-label" for="language-checkbox-1">
      Python
    </label>
  </div>
  <div class="form-check">
    <input name="language" class="form-check-input" type="checkbox" value="javascript" id="language-checkbox-2" aria-labelledby="label-2 language-legend" aria-describedby="language-description">
    <label id="label-2" class="form-check-label" for="language-checkbox-2">
      JavaScript
    </label>
  </div>
  <div class="form-check">
    <input name="language" class="form-check-input" type="checkbox" value="c++" id="language-checkbox-3" aria-labelledby="label-3 language-legend" aria-describedby="language-description">
    <label id="label-3" class="form-check-label" for="language-checkbox-3">
      C++
    </label>
  </div>
</fieldset>

我正在做以下工作:

  • 使用<fieldset><legend>对相关复选框进行分组
  • 每个复选框都有相同的name,即name="language"
  • 每个复选框由<legend>和实际的<label>元素标记,使用aria-labelledby标签.
  • 每个复选框都由<p>使用aria-describedby标记来描述.

我是否正确使用了所有aria个标签?此表单字段是否完全可用?

EDIT

双子座建议重写如下:

过度咏叹调标签:

  • 对于每个复选框,在aria-labelledby中同时包含<legend>个元素和<label>个元素通常是多余的.<legend>已经为<fieldset>中的所有复选框提供了组标签.
  • 依靠屏幕阅读器的视觉关联来推断复选框和图例之间的关系.

移动咏叹调—描述由<fieldset>:

  • 该描述适用于整个复选框组,而不是单个的每个复选框.
  • <fieldset>元素上放置aria—detailed by ="language—Description",而不是每个复选框.
<fieldset aria-describedby="language-description"> 
  <legend>What languages do you know?</legend>
  <p id="language-description">
    You can select one or more.
  </p>
  <div class="form-check">
    <input name="language" class="form-check-input" type="checkbox" value="python" id="language-checkbox-1">
    <label class="form-check-label" for="language-checkbox-1">
      Python
    </label>
  </div>
  <div class="form-check">
    <input name="language" class="form-check-input" type="checkbox" value="javascript" id="language-checkbox-2">
    <label class="form-check-label" for="language-checkbox-2">
      JavaScript
    </label>
  </div>
  <div class="form-check">
    <input name="language" class="form-check-input" type="checkbox" value="c++" id="language-checkbox-3">
    <label class="form-check-label" for="language-checkbox-3">
      C++
    </label>
  </div>
</fieldset>

这样真的更好吗

推荐答案

是的,双子座的代码在可访问性方面更好.

增加太多的aria-*是矫枉过正的.当HTML标记无法提供良好的可访问性时,ARIA最适合用于可访问性.

你的代码有正确的语义HTML,这是足够好的可访问性.

  • 您的复选框有标签,
  • 分组在字段集下,
  • 带有图例和段落描述.

这是一个很好的语义HTML,而不是使用普通的div和span.


添加过多的aria-*将导致屏幕阅读器重复过多的信息,并可能导致最终用户的听力疲劳.传达给用户的信息必须简短、准确和易懂,这样他们才能在不浪费时间的情况下完成任务.

现在设想一个屏幕阅读器用户使用您的站点.对于您的标记,以下内容大致是屏幕阅读器将读出的内容,

1. What languages do you know?
2. You can select one or more.
3. Input Checkbox - Python - What languages do you know? - You can select one or more.
4. Input Checkbox - JavaScript - What languages do you know? - You can select one or more.
5. Input Checkbox - C++ - What languages do you know? - You can select one or more.

最终用户将听到多余的信息,这浪费了他们的时间,并且不会为他们试图在您的站点上实现的任务增加更多的价值/帮助.连续四次听What languages do you know? You can select one or more很容易导致听力疲劳.

现在双子座的标记将像下面这样读出,

1. What languages do you know?
2. You can select one or more.
3. Input Checkbox - Python
4. Input Checkbox - JavaScript
5. Input Checkbox - C++

短小精悍,易懂易懂.屏幕阅读器用户可以快速完成他们的任务(与此表单交互),并继续他们的下一个任务.


您对语义HTML的使用是很好的,这对于可访问性来说已经足够了.额外的aria不需要.我会建议甚至删除aria-describedby attr从双子座的标记.

当Description元素在DOM中很远时,例如深度嵌套的后代元素、sibling 元素、隐藏元素,甚至是不共享共同祖先的元素.你可以使用诸如描述之类的不相关的元素与aria-describedby.

但是在你的标记中,描述元素<p>,紧跟着图例,屏幕阅读器将按该顺序大声读出,这再次是语义HTML的一个很好的使用和 struct 化.但如果你还想在fieldset上添加一个描述,那么上面的aria-describedby就可以了.


为了更好的访问性,试着像最终用户一样体验您的网站,在这种情况下像屏幕阅读器用户.可以从辅助功能设置(所有主要平台现在都有这个功能)启用VoiceOver/TalkBack,然后浏览您的网站,看看是否有任何大声读出的文本是太多的信息,或者您是否在任何重复的信息上感到听力疲劳.

Html相关问答推荐

当ul为Flex时,使ul元素在指定高度内可垂直滚动

值更新时旋转数字动画

在窄屏幕上显示表格,每个单元格占一行

如何在页面太短时使<;img&>缩小而不发生y溢出

有没有一种方法可以很容易地将这个div从底部:0转换到顶部:0?

Django HTML标记-Merge for Loop with Conditional语句

UL 的行为就像它不属于任何类别

如何在悬停时使矩形按钮上的边框变圆

如何使用jQuery将我制作的通用头部和底部加载到多个HTML文件中?

Bootstrap 轮播内容在箭头之间不显示

CSS flex:0 0 auto创建了1像素的间隙

使用HTML和CSS构建简历网站.无法使body元素内的div元素跨越整个网站高度

使用图像自定义 CSS 网格边框

a with