【问题标题】:Which CSS properties affect the accessibility tree?哪些 CSS 属性会影响可访问性树?
【发布时间】:2021-05-03 14:38:12
【问题描述】:

由于内容和表示的神圣分离,我认为 CSS 被屏幕阅读器忽略了。这种幼稚的假设是错误的。

  • 似乎有许多从 CSS 中隐藏内容的方法,例如 display:none;visibility:hidden; 甚至 width:0; height:0;,会从可访问性树中删除隐藏的元素。它们的内容不可聚焦,例如通过 tab 键,屏幕阅读器不可见。

    [ 除此之外: 可访问性通常需要隐藏元素,同时让屏幕阅读器可以访问它们:例如用于跳过链接、替代文本或仅在使用屏幕时才有意义的显示/隐藏机制。要真正做到这一点,您需要CSS trickery,例如将元素移出屏幕很大的距离。显然,这些是公认的方法,由WebAIMMDN 使用和提倡。例如,还可以查看 Google 搜索结果页面上跳过链接的 CSS。 ]

  • 我还发现通过content 属性添加的文本,通常用于附加装饰字符::before::after 元素,确实出现在可访问性树中(对我来说,Firefox 将其显示为“静态文本” )。

    [ 旁白: 这通常是不受欢迎的,因为添加的文本由无意义的字符组成,这些字符恰好呈现为视觉上漂亮的符号,并具有适当的字体。 ]

我的问题在标题中:哪些 CSS 属性(或值)会影响可访问性树?

当然,CSS 管理演示文稿,对大多数视觉障碍​​(阅读障碍、近视、各种色盲……或任何人)都很重要。但我没想到 CSS 对盲人用户也很重要。我认为只有 HTML 给出的语义内容对他们来说很重要,而可访问性树完全是由 HTML 构建的。

【问题讨论】:

  • AOM(可访问性对象模型)是 DOM 的一个子集,因此任何从 DOM 中删除元素的类很可能也将其从 AOM 中删除。这里有一篇好文章:developer.mozilla.org/en-US/docs/Learn/Accessibility/…。基本上不显示:没有需要阅读的元素,并且不要将 html 样式设置为其他目的(例如使用 div 作为按钮)。语义 HTML 是一个很好的起点(检查一下!),没有 aria 标签比糟糕的标签更好。

标签: css accessibility hide screen-readers web-accessibility


【解决方案1】:

重要的属性:

可见性

关于可见性的 CSS 被屏幕阅读器拾取,因为它假定您不希望人们在不可见的情况下与此项目进行交互。否则,屏幕阅读器用户可以看到对“有视力的用户”隐藏的整个部分,并为他们提供不同的体验。例如:

  • display: none - 普遍支持,如果元素具有此属性,则假定您不希望 任何人 看到它。
  • visibility: hidden - 相同,但一些非常老的屏幕阅读器可能仍然会选择这个
  • opacity: 0 - 效果不如某些屏幕阅读器可能仍然会选择,但大多数人会忽略。
  • visibility: collapse - 在表格上使用,不确定它的支持程度,但它应该被浏览器(以及可访问性树)解释为 visibility: hidden

尺寸

如果某物的高度为 0 像素或宽度为 0 像素,则它是不可见的。出于这个原因,应用了相同的规则,如果“有视力的用户”看不到它,那么屏幕阅读器用户也不想看到它。

内容属性

这在不同的浏览器和屏幕阅读器组合中确实不一致。您可能会在辅助功能树中看到它,但这并不意味着它会被屏幕阅读器使用。

问题是技术上的屏幕阅读器应该阅读内容。

现在,由于我们作为开发人员已将其用于大量样式技巧,因此他们现在改进了 content 属性以具有替代文本。 It only has 70% browser support at the moment 和屏幕阅读器支持会更差,但最终问题会自行解决。

要在这方面领先一步,您需要做的就是在显示的内容和替代文本之间添加一个斜线:

.myClass:after{
    content: "❤" / "favourited item";
}

CSS 定位

从技术上讲,情况正好相反,CSS 用于更改视觉设计(并使其符合逻辑顺序),但 DOM 顺序不正确。

因此,尽管这不是一个影响可访问性树项的 CSS,但它与我认为我会提到它的方式密切相关。

如果您使用 CSS 网格并更改网格项的位置,您最终可能会得到 DOM 顺序为 1,2,3 但视觉顺序为 2,1,3。

现在,如果逻辑阅读顺序是 2、1、3,那么屏幕阅读器用户可能会感到非常困惑,因为所有内容都以错误的顺序阅读。

同样的原则适用于float: rightflex-direction: reverse

负边距也会导致一些问题。例如,在尝试以视觉方式隐藏文本时(当您提到仅屏幕阅读器的文本时)注意边距 - some browsers actually tried to correct for negative margins 并表示内容被乱序读取。

如果您正在寻找当前仅针对屏幕阅读器用户视觉隐藏内容的最佳实践,我建议您阅读 this answer

结论

我想就是这样,但可能还有其他我没有想到的。

本质上,CSS“泄漏”到 HTML 中的原因是 CSS 如何影响页面上的内容,而可访问性背后的一个核心理念是“为使用辅助技术的人提供尽可能相似的体验/信息”。

令人惊讶的是transformbackface-visibility: hidden; etc. do not seem to have any effect on screen readers 之类的东西,但我在规范中找不到任何说明它们是否应该或不应该影响可访问性树的内容,而且我的测试受到限制!

最后我把“有视力的用户”放在引号里,因为很多屏幕阅读器用户有合理的视力,有些人有完美的视力并使用一个来帮助理解,在解释时比较“有视力”和“无视力”更容易原则。

【讨论】:

  • 问题是技术上屏幕阅读器应该阅读内容。 ==> 值得商榷。我可以争辩说,因为它是在 CSS 中的,所以它只是装饰性的内容,所以不应该被阅读。
  • 哦,我重新阅读了我写的内容,我可以看到我不清楚的地方。根据用户代理规范 content 应该添加到可访问性树中,但显然根据 WCAG(和常识)它不应该用于重要信息,因为有些人没有启用 CSS/他们自己的样式床单。我个人认为它根本不应该用于任何信息,应该纯粹是装饰,但我们必须与时俱进,修补不良习惯,所以浏览器必须现在将内容属性的 alt 部分解析为 DOM 的一部分(因此它可以位于可访问性树中)。
【解决方案2】:

值得注意的是,这些行为高度依赖于浏览器的实现。并非每个浏览器/屏幕阅读器组合都适用。屏幕阅读器的行为可能因产品而异。


  • background-image 属性:当给定的图片 URL 对屏幕阅读器不可见时,因为无法添加替代文本。

  • clip-path 属性:可用于向有视力的用户隐藏内容。不从可访问性树中删除内容。屏幕阅读器和键盘焦点仍然可以访问该元素。

  • content 属性:与伪元素选择器一起使用时,可用于将纯文本内容注入可访问性树。

  • display 属性:当设置为 none 时,会从可访问性树中删除元素。它对有视力和无视力的游客是隐藏的。

  • display 属性:当设置为flexblockgrid 并应用于<table> 元素时,可能会强制将表格解释为@ 987654321@,而不是数据表。

  • font-size 属性:当设置为 0 时,将对有视力的访问者隐藏文本,但屏幕阅读器仍然可以访问。

  • height 和/或width 属性:当设置为0 的值时,对有视力和无视力的访问者是隐藏的。当这些属性的值设置为 > 0 时,未显示的区域只会对有视力的访问者隐藏——屏幕阅读器仍然可以访问它们。 max-heightmax-width 的行为相似。

  • list-style 属性:当设置为 none 时,可能会更改某些屏幕阅读器/浏览器组合宣布列表中项目数量以及访问者正在阅读的当前项目的方式。

  • position 属性:应谨慎使用,因为它会影响阅读顺序,阅读顺序必须遵循 DOM 顺序。

  • opacity 属性:当设置为 0 时,可用于向有视力的用户隐藏内容。不从可访问性树中删除内容。屏幕阅读器和键盘焦点仍然可以访问该元素。

  • overflow 属性:当设置为 hidden 时,可用于向有视力的用户隐藏内容。不从可访问性树中删除内容。屏幕阅读器和键盘焦点仍然可以访问该元素。

  • text-transform 属性:当设置为 uppercase 时,可能会导致某些辅助技术以一种字母的形式读取较短的单词,就好像它是首字母缩略词一样。

【讨论】:

  • 内容属性:当与伪元素选择器一起使用时,可用于将纯文本内容注入可访问性树。 ==> 并非总是如此,要非常小心:它通常由 NVDA 读取,而不是 Jaws。最好避免它,因为您不能 100% 假设它会或不会出现在可访问性树中。
【解决方案3】:

要隐藏某些内容,但不是为了便于访问,您可以使用这些类。使用 1px 的宽度和高度以获得最佳效果。

.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}
.sr-only-focusable:active,
.sr-only-focusable:focus {
  position: static;
  width: auto;
  height: auto;
  overflow: visible;
  clip: auto;
  white-space: normal;
}

示例如何在您的 html 中使用它

<nav>
  <ul
    <li class="active">Home <span class="sr-only">is active item</span></li>
    <li>Products</li>
    <li>Contact</li>
  </ul>
</nav>

【讨论】:

  • 这没有回答问题,OP 想知道 CSS 的哪些部分会影响可访问性树,而不是如何在视觉上隐藏某些东西以便它仍然可以访问。即使他们确实希望我 would recommend a more robust class 使用现代技术而不是 margin="-1px" 这会导致问题,而 clip-path 因为 clip 已被弃用(尽管我们仍然需要它用于旧版浏览器)。另外.sr-only-focusable:focus 部分的目的是什么?
  • css 是适用于任何平台上旧版和现代浏览器的跨浏览器。如果这会导致问题,那么使用此类的所有 BS 4 网站都会出现问题。
  • 他们确实有问题!这就是问题所在,因此我给出的答案的标题是“一个更好的替代 bootstrap sr-only 类!” ? 呵呵。另外,第二部分是什么意思,因为我不知道如何使它们仅对屏幕阅读器具有焦点?快速阅读我链接到的答案,它解释了为什么我更改了 3 个属性。它还可以一直运行到 IE6,所以你不会有任何问题(除非你喜欢痛苦并且想建立一个在 IE5 上运行的网站,当然??)
猜你喜欢
  • 2015-10-20
  • 2012-02-21
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 2013-12-11
相关资源
最近更新 更多