aria初探(一)

之前在学习和工作当中碰到的一些有关无障碍的学习心得,比较杂,做一下小结。

(1)tabIndex:

  当使用键盘时,tabindex是个关键因素,它用来定位html元素。

tabindex有三个值:0 ,-1, 以及X(X里32767是界点,稍后说明)

原本在Html中,只有链接a和表单元素可以被键盘访问(即使是a也必须加上href属性才可以),但是aria允许tabindex指定给任何html元素。

当tabindex=0时,该元素可以用tab键获取焦点,且访问的顺序是按照元素在文档中的顺序来focus,即使采用了浮动改变了页面中显示的顺序,依然是按照html文档中的顺序来定位。

当tabindex=-1时,该元素用tab键获取不到焦点,但是可以通过js获取,这样就便于我们通过js设置上下左右键的响应事件来focus,在widget内部可以用到。

当tabindex>=1时,该元素可以用tab键获取焦点,而且优先级大于tabindex=0;不过在tabindex>=1时,数字越小,越先定位到。

在IE中,tabindex范围在1到32767之间(包括32767)

在FF, Chrome无限制,不过一旦超出32768,顺序跟tabindex=0时一样。

这个估计跟各个浏览器对int型的解析有关。

(2)Aria

WAI网站对它的描述是“WAI-ARIA, the Accessible Rich Internet Applications Suite, defines a way to make Web content and Web applications more accessible to people with disabilities. It especially helps with dynamic content and advanced user interface controls developed with Ajax, HTML, JavaScript, and related technologies. 

       可以看出,它用来标识页面中涉及到动态交互的地方,这些交互通常是由js和相关技术来实现的,例如浮出层,对话框弹出,下拉列表以及伪元素等。 

aria由一套属性组成,属性分为role以及对应的states和properties,aria将html元素分为六种role,每种有对应的states和properties,但有一些是共用的,比如

举个伪元素例子,

<div role="radio" aria-checked="true" aria-label="单选2" tabindex="0">单选tabindex="0"</div>

这个div模拟了radio的功能,在平时读屏软件是分辨不出来的,但是加上role及aria-checked状态,在读屏软件(NVDA)中读出来就是:

再举个动态交互的例子,这是etao(一淘)主页的菜单代码

NVDA读出来就是:

这里用到了menubar和menuitem角色,用来标识这是个菜单,同时使用了aria-haspopup属性,表示这个菜单有子菜单。

wai-aria文档对Haspopup的解释是“Indicates that the element has a popup context menu or sub-level menu.”值为trun/false,我将其改为1或0,也没有发现有影响,应该是可以的,不过还是遵从标准比较好。

******************************哗啦啦的分界线*****************************************

目前我们用到比较多的aria是aria-label和aria-labeledby,(可见etao),这两个元素用来对元素进行注释,aria-labelledby的值是id值,用来设定多个注释,aria-label的值是字符串。

从第一个图中可以看出,aria-label是通用的属性,但是实际上目前读屏软件都不支持在span上使用aria-label

这一点比较郁闷,因为淘宝上很多列表内的金额,数目等信息是用span实现的,不能给span添加注释,但是div可以。

使用aria-label时需注意,

(1) 同时使用aria-label和label for时,忽略后者。

(2) 同时使用aria-label和aria-labelledy时,忽略前者

(3) IE不支持对input使用aria-label,但是支持aria-labelledby。

(4) 使用aria-labelledby时,即使对应的注释文本被隐藏,依然能读出来。

例如:

<label id="labeltext" for="Text1" style="display:none">隐藏的姓名:</label>

<span id="specialtext" style="display: none">隐藏的解释</span>

<input type="text" id="Text1" aria-labelledby="labeltext specialtext" aria-label="专门解释" title="XYZ" />

NVDA读出来就是

用label for注释时隐藏的label也可以读出来,不过兼容性稍差,在FF4.0.1中NVDA不能读。

(5) 实际运用注释时通常在title和aira之间徘徊,因为两者的功能类似,读屏软件都能读出来,但是title会浮出一个提示层,aria不会,不过title的兼容性比较好,它是标准属性

所以在具体应用中需要有所取舍,我认为,在不影响用户体验的情况下,尽量用title。一些不能用的地方,例如列表中的li,就选择用aria-label,aria主要还是在用于解释交互行为方面比较强大。

******************************淅沥沥的分界线*****************************************

还有一些tip:

(1) label for针对表单元素和div有效,span不行

(2) 表单元素中input type=button,不用加注释,读屏软件可以读出value

(3) 不是所有的title读屏软件都读,a,span以及button的title个别情况下不读,a,span在IE下直接读标签里的内容,button读value值

(4) a标签必须加上href属性之后才能定位,否则就要用到tabindex.

其它的属性可以在以后的项目中慢慢探索。

注意:

(1)aria只是用在html中的一系列属性,其作用是解释标签行为和状态,要实现动态效果还是需要js。

    (2)aria要发挥效果,需要浏览器和AT(assistive tool,包括读屏软件,屏幕放大器等)的共同作用,浏览器先映射aria到操作系统,操作系统通知 AT ,AT再处理这些标签,

如果浏览器和AT有一方对aria支持不好,效果就不好,经过我测试,FF支持的是比较好的。而读屏软件中 NVDA的比较好,国内争渡,永德不错。

另外,IE6是不支持aria的。

最后附上aria的role及对应states和properies的图,链接中是SVG格式的。

参考:

http://www.ibm.com/developerworks/cn/web/wa-aj-web20/

http://www.ibm.com/developerworks/cn/web/1003_sunqy_access/

http://www.w3.org/TR/wai-aria/rdf_model

http://webaim.org/techniques/forms/controls

时间: 2024-10-27 19:07:38

aria初探(一)的相关文章

进阶之初探nodeJS

一.前言 在"初探nodeJS"随笔中,我们对于node有了一个大致地了解,并在最后也通过一个示例,了解了如何快速地开启一个简单的服务器. 今儿,再次看了该篇随笔,发现该随笔理论知识稍多,适合初级入门node,固萌生一个想法--想在该篇随笔中,通过一步步编写一个稍大一点的node示例,让我们在整体上更加全面地了解node. so,该篇随笔是建立在"初探nodeJS"之上的,固取名为"进阶之初探nodeJS". 好了,侃了这多,那么我们即将实现一个

从273二手车的M站点初探js模块化编程

前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数据. 273这个M站点是产品推荐我看的.第一眼看这个产品时我就再想他们这个三次加载和翻页按钮的方式,那么小分页的pageIndex是怎么计算的.所以就顺便看了下源码. 提到看源码时用到了Chrome浏览器的格式化工具(还是朋友推荐我的,不过这个格式化按钮的确不明显,不会的话自行百度). 三次加载和分

[转载]HDFS初探之旅

转载自 http://www.cnblogs.com/xia520pi/archive/2012/05/28/2520813.html , 感谢虾皮工作室这一系列精彩的文章. Hadoop集群(第8期)_HDFS初探之旅 1.HDFS简介 HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的,可以运行于廉价的商用服务器上.它所具有的高容错.高可靠性.高可扩展性.高

MongoDB初探系列之二:认识MongoDB提供的一些常用工具

在初探一中,我们已经可以顺利的将MongoDB在我们自己的机器上跑起来了.但是在其bin目录下面还有一些我们不熟知的工具.接下来,将介绍一下各个小工具的用途以及初探一中MongoDB在data文件夹下创建的文件的用途. 1.bin目录下面的各种小工具简介及使用方式 bsondump.exe 用于将导出的BSON文件格式转换为JSON格式mongo.exe mongoDB的客户端 mongod.exe 用于启动mongoDB的Server mongodump.exe 用于从mongodb数据库中导

Asynchronous Pluggable Protocols 初探

Asynchronous Pluggable Protocols,异步可插入协议,允许开发者创建可插协议处理器,MIME过滤器,以及命名空间处理器工作在微软IE4.0浏览器以及更高版本或者URL moniker中.这涉及到Urlmon.dll动态链接库所公开(输出)的可插协议诸多功能,本文不进行深入的原理讲解,只对它其中之一的应用进行解析,那就是如何将一个应用程序注册为URL协议. 应用场景: tencent协议: 当我们打开"tencent://message/?uin=要链接的QQ号 &qu

重新认识HTML,CSS,Javascript 之node-webkit 初探

今天我们来系统的.全面的 了解一下前端的一些技术,将有助于我们写出 更优秀的 产品 出来. 什么是HTML? HTML 是用来描述网页的一种语言. HTML 包含一些根节点,子节点,文本节点,属性节点,组成, 它通过一系列预定义标签来描述网页结构,如: <title>This is title</title> ,这个表明该网页的标题是 This is title. 什么是CSS? CSS 指层叠样式表 (Cascading Style Sheets),它描述浏览器显示如何显示htm

java进阶06 线程初探

线程,程序和进程是经常容易混淆的概念. 程序:就是有序严谨的指令集 进程:是一个程序及其数据在处理机上顺序执行时所发生的活动 线程:程序中不同的执行路径,就是程序中多种处理或者方法. 线程有两种方法实现 一:继承Thread 覆盖run方法 package Thread; public class Thread1 { public static void main(String[] args){ MyThread1 thread1=new MyThread1(); thread1.setName

数据加密解密初探

在一次网络通信或者是进程通信中,如果传输数据采用明文的方式,那么很容易被第三方"窃听"到,安全性难以保障. 而所谓加密是让数据从明文变成密文,传输过程中是密文,传送过去之后对方接收到的也是密文.--可以理解为密文就是乱码,看不出内在的任何意义,通常也都是逐位对应的. 在接收方接收到密文之后只有把它还原为原来的样子才可以理解对方说的具体是什么,此过程就叫做解密. 所谓系统的安全要实现的目标应该包括:机密性-confidentiality,完整性-integrity 和可用性-availa

Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用

一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性,不得不说下Http协议.我们常常听到说,Http是一个无状态协议,同一个会话的连续两个请求互相不了解,他们由最新实例化的环境进行解析,除了应用本身可能已经存储在全局对象中的所有信息外,该环境不保存与会话有关的任何信息.之所以我们在使用ASP.NET WebForm开发中会感觉不到Http的无状态特