【问题标题】:Disable placeholder text to be read by all accessibility API(screen reader)禁用所有可访问性 API(屏幕阅读器)读取的占位符文本
【发布时间】:2020-09-21 04:41:27
【问题描述】:

有些屏幕阅读器会读取占位符值,有些则不会。有没有一种方法可以为所有屏幕阅读器禁用读取占位符值(在 HTML 输入的上下文中)。尤其是IOS屏幕阅读器读取占位符值,这样的话,同样的信息会重复两次。

我想要的是为屏幕用户显示占位符,为屏幕阅读器用户显示隐藏标签。

编辑:当我问这个问题时,这是第一次研究可访问性,只是为了解决一个问题。在进一步探索中,我发现我们可以只使用隐藏标签并将其与用于属性的输入元素相关联。这里是 w3 文档link

【问题讨论】:

  • placeholder 不能替代标签。使用标签。
  • @Quentin WCAG address this subject 并在不鼓励的情况下授权使用占位符,说明标签 不是在这种程序意义上使用的,而只是指一个文本字符串在视觉上非常接近组件。这个问题需要更多关注。
  • @Quentin 我要求您在投票/评论之前仔细阅读描述。我在描述中已经明确提到“我想要的是为屏幕用户显示占位符,为屏幕阅读器用户显示隐藏标签”。你本可以提供很多有用的评论/答案。另外,我请你建议我是否可以给这个问题一个更好的标题。

标签: html input accessibility placeholder


【解决方案1】:

根据Understanding Success Criterion 2.5.3: Label in Name

因此,在没有任何其他附近文本字符串的情况下(如前面列表中所述),如果输入包含占位符文本,则此类文本可能是名称中标签的候选者。这通过可访问的名称计算(稍后讨论)和实际意义上都支持,即在没有提供可见标签的情况下,语音输入用户可能会尝试使用占位符文本值作为与输入交互的方式

只要您不提供视觉标签,辅助技术(例如语音输入)就会使用占位符文本。禁用输入辅助来为输出辅助提供更多用户体验会适得其反。

当字段为空时,您完全可以使用模拟占位符行为的可视标签(采取适当的预防措施,使字段在字段被填充后可在输入辅助下使用)。

【讨论】:

  • 这很有见地。谢谢。
  • 此处引用的同一段还指出“请注意,输入字段中的占位符文本不被视为提供标签的适当方式。HTML5 规范声明‘不应将占位符属性用作替代项到<label>。' ”。 w3.org/WAI/WCAG21/Understanding/label-in-name.html 据我所知,并非所有屏幕阅读器/浏览器组合都支持 placeholder 属性。
  • @Josh 是的,这正是所问的问题。我建议的占位符仿真解决了这个问题并解决了输入和输出辅助的任何问题。
  • @Adam - 也许我误解了你的答案。在我看来,您似乎在说 placeholder 属性可用于标记输入字段,辅助技术将使用 placeholder 就像使用 <label> 元素一样。我错过了什么吗?
  • @Josh 不,这是完全相反的方法:使用语音输入辅助的用户应该能够使用视觉标签(即使唯一的视觉标签是占位符文本)。因此,使用可访问标签模拟 placeholder 行为是比使用原生 placeholder 属性更好的解决方案,该属性支持低且字段不为空时不再可见。
【解决方案2】:

对于我在问题中提到的要求

我想要的是为屏幕用户和隐藏标签显示占位符 适用于屏幕阅读器用户。

最好的方法是添加一个隐藏标签并将输入元素与属性关联到相应的标签。

<label for="search" class="visuallyhidden">Search: </label>
<input type="text" name="search" id="search" placeholder>
<button type="submit">Search</button>
.visuallyhidden {
      border: 0;
      clip: rect(0 0 0 0);
      height: 1px;
      margin: -1px;
      overflow: hidden;
      padding: 0;
      position: absolute;
      width: 1px;
    }

另外,您可以简单地将标签应用样式隐藏为display: none

<label style={{display: 'none'}} for="search"> Search: </label> 

您可以关注w3.org document。真的值得一看文档。

【讨论】:

    【解决方案3】:

    如果你真的想发挥创意,理论上你可以使用 JS 来管理占位符属性。它会稍微减慢页面的加载速度,但是您可以在输入获得焦点时删除占位符属性,并在输入失去焦点时重新添加它。这将具有禁用辅助技术的占位符属性的效果(至少在交互式表单模式下)。有视力的游客可能不会注意到差异。这是example in a fiddle。我在 NVDA/Chrome 中进行了测试,它工作正常,但我不能说任何其他屏幕阅读器/浏览器组合。

    // on document load, add the placeholder text
    document.addEventListener("DOMContentLoaded", function(){
       myInput.setAttribute("placeholder", myPlaceholder)
    });
    
    // when receiving focus, remove the placeholder text
    myInput.addEventListener('focus', (event) => {
        myInput.removeAttribute("placeholder");
    });
    
    // when losing focus, re-add the placeholder text
    myInput.addEventListener('blur', (event) => {
       myInput.setAttribute("placeholder", myPlaceholder)
    });
    

    正如其他人所说,使用占位符不是使用标签的合适替代品。如果您真的不喜欢标签的外观,您可以position them off-screen or use the clip technique 并继续使用占位符。缺点是一些屏幕阅读器可能会同时阅读标签和占位符,这并不理想,但过度描述总比描述不足好。如果某些内容仅出现在某些浏览器/屏幕阅读器组合上,我个人会同意阅读两次,并且我的代码在其他方面有效并符合 WCAG 要求。

    【讨论】:

    • 感谢您的回答。我不想得到一些非凡的东西。 “我想要的是为屏幕用户显示占位符,为屏幕阅读器用户显示隐藏标签”,正如我在问题中解释的那样,在进一步挖掘中,我发现这可以通过添加隐藏标签并将其与属性关联到各自的输入来完成谢谢.
    • 我认为您的问题是在询问“一种可以为所有屏幕阅读器禁用读取占位符值的方法”。我相信我的解决方案可以解决该任务。当大多数屏幕阅读器用户是无视力的访问者时,我不确定“为屏幕用户显示占位符”是什么意思。
    猜你喜欢
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 2021-12-08
    相关资源
    最近更新 更多