编者按:本文作者:安佳,360 搜索事业部的前端开发工程师,W3C CSS 工作组成员。

原文:https://www.a11ywithlindsey.com/blog/beginning-demystify-aria

当我在 DEV(https://dev.to/)上发布了《为什么可访问性不是边缘案例》(https://dev.to/lkopacz/3-reasons-why-accessibility-is-not-an-edge-case-3da4)时,我收到一个评论,说希望可访问性更容易实现些。其实我还蛮好奇他们认为的难点是什么,因为我一直有在关注 HTML 和 CSS 的最佳实践,所以我自己没有觉得学习可访问性是有挑战的。当对方回复(https://dev.to/marek/comment/882m)了之后,我了解到原来主要的痛点是 ARIA。

我看到很多关于 ARIA 的疑惑,比如什么时候该用它、什么时候不该用它、ARIA 的这些属性都是什么意思、所有的这些属性有一个列表吗、等等。我在考虑写一个关于 ARIA 的系列,可能每周写几个 ARIA 属性、如何使用它们、我是否喜欢它们等内容。在我了解所有的 ARIA 属性之前,我真的需要先聊聊 ARIA 的用途,以及我认为你不应该用它来做什么。

ARIA 到底是什么

ARIA 是一组属性,你可以将它们添加到元素中,以赋予元素额外的上下文和含义。这对许多事情是很有用的。以下是我认为 ARIA 很有帮助的实例:

  • 告诉你正在动态加载内容

  • 提醒用户有重要的信息弹出

  • 告诉屏幕阅读器状态变了

  • 当有需要时添加一些额外的上下文

关于 ARIA 的文档实在是让人望而生畏。我学习 ARIA 的方法是:打开一个常用的应用程序,比如 Twitter。接着,检查元素,在 HTML 中搜索 aria 并查看所有属性。然后,打开屏幕阅读器,真正地听一下当我到达某个特定元素时,它是怎么朗读的。例如,当我在 Mac 上使用 VoiceOver 打开 Twitter 主页时,这是我右上角的个人资料图片对应的 HTML 标签:

注意:为了方便阅读,我删除了一些属性和类

这里有两个 ARIA 属性role="button"和aria-haspopup="true"。那么,当我使用屏幕阅读器时,这意味着什么呢。

首先,VoiceOver 说的是“配置文件和设置,弹出按钮”

接着,VoiceOver 说“你当前正在一个弹出按钮上,要显示选项列表,请按 Control-Option-Space”

你会注意到单词“弹出按钮(Pop up button)”。如果该链接上没有这两个属性,它将会读成是一个链接<a>。老实讲,我认为用<button>标签更合适,因为在阅读时,我不能使用链接的href属性值/settings,它表现地就像一个按钮一样。知道它是一个弹层交互的上下文对屏幕阅读器非常有帮助。

我会说,当我第一次构建网页时,通常会犹豫是否要使用 ARIA。你可能已经注意到,我批评了这个标签的使用而会替换成另一个标签。除非有必要添加上下文,否则我会试图避免使用 ARIA。这就是为什么在我的技术文章中,从零编写的代码,最初的时候你都不会看到 ARIA 属性。我这么做的原因有很多...

ARIA 不是什么

我在会议上第一次介绍 ARIA 的时候,出席的一位盲人开发人员质疑了我。这当然不好。是因为很多时候 ARIA 永远不应成为可访问性的焦点,特别是现在我们有 HTML5。HTML5 解决了屏幕阅读器过去常常面临的许多语义化问题。

ARIA 不是什么呢?它不是:

  • 语义化 HTML 的替代品

呃...这是我能想到的全部。用个示例说明下我的意思。如果你不喜欢<button>的默认样式,但你喜欢它所有的内置功能,下面的 HTML 不会神奇地使所有按钮默认生效:

<div role="button">

  Open Menu

</div>

假设上面的按钮有个点击事件。如果你有阅读我的文章《改进键盘可访问性的3个简单提示》(https://www.a11ywithlindsey.com/blog/3-simple-tips-improve-keyboard-accessibility),你就会知道,按钮内置了一些默认功能。如果不做任何其他操作,所有做的这些只是宣称这是一个带有屏幕阅读器的按钮。但是,你无法用键盘激活它。所以下一步是确保我们有一个`tabindex`。我们试试吧。

<div tabindex="0" role="button">

Open Menu

</div>

现在,我们可以使用点击事件了吗?我们来试试吧。给它取个 ID,方便 JS 定位:

<div tabindex="0" id="button" role="button">

  Open Menu

</div>

现在,我将在这里编写一些基本的 JavaScript,看它是否有效。

const button = document.getElementById('button')

button.addEventListener('click', () => alert('clicked!'))

说明:点击 div,会弹出一个 alert 框。然后按 tab 键时不能接收到焦点

从 gif 图可以看出,ARIA 角色或tabindex并没有修复它。我们必须在按钮上监听一个按键事件。我要和你一起调试这个,这样我们就可以了解有多少额外的工作了。

button.addEventListener('keypress', e => {

console.log(e)

})

控制台输出的结果是:

考虑下我们在这里做了什么。我在按钮上添加了一个按键事件,并检查了事件对象中的属性。这很重要,因为如果我们想要复制一个按钮,我们必须记下当我们有按键事件时我们正在按什么键。内置的 HTML 按钮行为适用于按键 Enter 和空格键。当我们查看控制台日志时,我们想要使用e.code。所以我加个条件判断,将代码更新为:

button.addEventListener('keypress', e => {

if (e.code === 'Enter' || e.code === 'Space') {

alert('pressed!')

}

})

虽然这不是最具挑战性的事情,但更容易将<div>变成一个<button>。您可以使用 CSS 来摆脱默认样式,总体而言,这将让你的生活更轻松易用!

结论

我喜欢考虑 ARIA 的方式是上下文(context)。有时你不需要额外的背景-- HTML 肯定是足够的。有时它可能会更好,特别是如果它是一个自定义小部件。关于特定属性及其作用,我将在未来对 ARIA 做更多的工作 - 主要是因为文档可能有点令人生畏。干杯!

如果你对此内容有疑问,请随时在 Twitter (https://twitter.com/LittleKope/) 上与我联系!

关于奇舞周刊

《奇舞周刊》是360公司专业前端团队「奇舞团」运营的前端技术社区。关注公众号后,直接发送链接到后台即可给我们投稿。

[译] 揭开 ARIA 的神秘面纱相关推荐

  1. 了解黑客的关键工具---揭开Shellcode的神秘面纱

    2019独角兽企业重金招聘Python工程师标准>>> ref:  http://zhaisj.blog.51cto.com/219066/61428/ 了解黑客的关键工具---揭开 ...

  2. [转]揭开正则表达式的神秘面纱

    揭开正则表达式的神秘面纱 关闭高亮 [原创文章,转载请保留或注明出处:http://www.regexlab.com/zh/regref.htm] 引言 正则表达式(regular expressio ...

  3. 揭开PC-Lint9的神秘面纱

    前言 今天,又定位了一个令人懊恼的C++内存使用异常问题,最终结果,竟然是减少接口类的方法后,为了避免编译错误,顺手添加的强制类型转换导致的. 对于这样的问题,我们碰到很多很多次了.没有这样的问题,我 ...

  4. 未来已来?揭开量子计算机的神秘面纱

    从第一台现代计算机ENIAC的诞生到个人PC时代的降临,从互联网概念的提出到移动互联的疾跑,在这个信息年代里,变革正以前所未有的速度改变着我们熟悉的世界.熟悉的生活. 作为个人,我们早已习惯于智能计算 ...

  5. ASP.NET 运行时详解 揭开请求过程神秘面纱

    对于ASP.NET开发,排在前五的话题离不开请求生命周期.像什么Cache.身份认证.Role管理.Routing映射,微软到底在请求过程中干了哪些隐秘的事,现在是时候揭晓了.抛开乌云见晴天,接下来就 ...

  6. linux操作系统说课稿,信息技术《揭开LINUX的神秘面纱》教案范文

    信息技术<揭开LINUX的神秘面纱>教案范文 教学目标: 1.会启动LINUX系统: 2.会关闭LINUX系统: 3.LINUX基本界面的认识. 教学重点: 1.会启动LINUX系统: 2 ...

  7. 冰河浅析 - 揭开木马的神秘面纱(下)

    冰河浅析   -   揭开木马的神秘面纱(下)     作者:·   shotgun·yesky 四.破解篇(魔高一尺.道高一丈)         本文主要是探讨木马的基本原理,   木马的破解并非是 ...

  8. 揭开木马的神秘面纱 2

    揭开木马的神秘面纱zz 2 离冰河二的问世已经快一年了,大家对于木马这种远程控制软件也有了一定的认 识,比如:他会改注册表,他会监听端口等等,和一年前几乎没有人懂得木马是什么东   西相比,这是一个质 ...

  9. 【翻译】揭开HTML5的神秘面纱

    写在前面的话: 这篇文章摘自Mozilla官网,主要针对HTML5和本地应用发表了一些.没有设计到技术,所以基本是逐字翻译,但愿我蹩脚的英语水平能把大师的 Chris Heilmann的思想整理明白. ...

最新文章

  1. Unicode,UTF-32,UTF-16,UTF-8到底是啥关系?
  2. 【学习笔记】超简单的多项式反三角函数(含全套证明)
  3. 收藏 | 应对程序员面试,你必须知道的8大数据结构
  4. 函数式编程语言python-用Python进行基础的函数式编程的教程
  5. 1.9 可避免误差-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
  6. 计算机视觉基础:图像处理(上)
  7. zookeeper源码分析之四服务端(单机)处理请求流程
  8. 一步一步asp.net_页面静态化管理
  9. nutshell_Nutshell中的Java 8语言功能-第2部分
  10. 文科女生单招学计算机,文科女生走单招学什么专业好
  11. java annotation 实现_在Java中如何实现自己的annotation
  12. DOM 事件深入浅出(一)
  13. 蓝桥杯2017年第八届C/C++省赛C组第七题-Excel地址
  14. Python3自动生成MySQL数据字典的markdown文本的实现
  15. 问题PermissionError [Errno 13] Permission denied解决方法
  16. mysql中dint,请教一下Dint和Real型变量在使用过程中出现的问题
  17. Egyptian Miracle Technical Service Support
  18. 阿里程序员常用的 15 款开发者工具
  19. _混沌系统的FPGA实现
  20. 压力测试Jmeter+badboy

热门文章

  1. iCoremail企业邮箱移动办公新突破
  2. MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O
  3. Statistical Analysis:关联度分析之灰色关联分析软件
  4. 不忘初心 牢记使命 拉卡拉支付积极履行社会责任
  5. 测试项目启动与研读需求文档
  6. JS中的void 0是什么意思?
  7. Java毕业设计_集美大学诚毅学院校友录系统设计与开发
  8. 编写名为censor的函数,用来把字符串中出现的每一处字母“foo”替换成“xxx”。例如,字符串“food fool”会变为“xxxd xxxl”。再不失清晰性的前提下程序越短越好
  9. 网易(weather)天气预报接口
  10. 安卓系统源码编译系列(一)——下载安卓系统源码教程