哪些 CSS 属性会影响可访问性树?

如何解决哪些 CSS 属性会影响可访问性树?

通过内容和展示的神圣分离,我认为 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 构建。

解决方法

重要的属性:

可见性

关于可见性的 CSS 由屏幕阅读器获取,因为假设您不希望人们与不可见的项目进行交互。否则,屏幕阅读器用户可以看到对“视力正常的用户”隐藏的整个部分,并为他们提供不同的体验。例如:

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

尺寸

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

内容属性

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

从技术上讲,屏幕阅读器应该阅读内容。

现在,由于我们作为开发人员已经将其用于大量样式技巧,因此他们现在改进了 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 之类的东西,但我在规范中找不到任何说明它们是否应该影响可访问性树的内容,而且我的测试很有限!

>

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

,

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


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

  • clip-path 属性:可用于对视力正常的用户隐藏内容。不从辅助功能树中删除内容。屏幕阅读器和键盘焦点仍可访问该元素。

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

  • display 属性:设置为 none 时从无障碍树中删除元素。它对有视力和无视力的访客隐藏。

  • display 属性:当设置为 flexblockgrid 并应用于 {{1} } 元素,可能会强制将表解释为 layout table,而不是数据表。

  • <table> 属性:设置为 font-size 时将对视力正常的访问者隐藏文本,但屏幕阅读器仍可访问。

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

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

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

  • position 属性:设置为 opacity 时可用于对视力正常的用户隐藏内容。不从辅助功能树中删除内容。屏幕阅读器和键盘焦点仍可访问该元素。

  • 0 属性:设置为 overflow 时可用于对视力正常的用户隐藏内容。不从辅助功能树中删除内容。屏幕阅读器和键盘焦点仍可访问该元素。

  • hidden 属性:当设置为 text-transform 时,可能会导致某些辅助技术在一个字母上读取较短的单词,就好像它是首字母缩略词一样.

,

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

.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(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>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res