最好的学习是总结 - 总结 Accessibility 项目的从零到一

最近Accessibility 的项目已经做了一个release了,phase1 正式结束,phase2 准备开始,觉得自己应该总结一下Accessibility项目总体怎么做的,以及踩过哪些坑...

项目准备

Team 总共由10名开发,四名QA,一名PM,一名支持的Scrum Master,还有一名支持的Designer 组成,第一阶段开发时长为一个release,一个release 为五个Sprint,每个Sprint 为2周

开发测试工具

aXe - The demo link

WAVE 

第一周:

开发任务:做Accessibility 技术研究:什么是Accessibility?用什么技术实现?Best Practice?如何测试?听力障碍,视觉障碍,肢体障碍的不同需求

QA任务:通过WAVE 等工具扫描现在的页面,列出所有有问题的地方,并分类

第二周:

开发任务:互相分享讲解Accessibility 技术要点,将要点归类,建立相关User Story, User Story 分为两类 - 核心代码需要修改的Ticket以及分散在各个组件中修改的ticket

QA任务:根据开发的归类将扫描出来的问题添加到各个分类Ticket 下,单独出现的问题单独分类建Ticket

共同任务:将发现的问题列在Google doc 上,并添加简单描述

问题分类以页面为单位列出了 路径,问题位置,期望表现和实际表现,分配给谁,备注,PM提供的对应文本,问题状态,QA测试状态

第三周:

开发任务:合并重复的问题并分配开发任务,开始着手核心代码部分修改

QA任务:合并重复问题,同时将Google Doc上未添加到ticket 的部分添加到ticket 

Note: 这里其实JIRA Ticket 相当于按照组件功能将任务分类,Google Doc 上是按页面内容将任务分类,这里的工作实际上是将页面分类的任务分对应功能分类下

第四周:

开发任务:每个开发take1-3 个User Story,着手核心部分代码修改

Note: Doc中问题描述应与Ticket 描述关键词符合,比如 label 部分,assign 了label ticket 的同学便可以直接搜索label 关键词找到所有label 相关的部分,同时,开发在开始干活儿的时候将doc 中该部分状态标注为inprogress,这样别的同学就不会重复地去看这个问题,改完了标注done,QA同学就知道这部分可以测了

QA任务:写test case,遇到新的问题,与开发沟通并添加到Doc和ticket上

第五周:

开发任务:完成核心部分代码修改,已经完成的同学开始熟悉模块部分的需求

QA任务:验证已经完成了的核心部分修改,并提bug

第六周:

开发任务:模块部分任务根据Google Doc 列出来的任务大家按需自取,取走的任务将自己名字写在assign 一栏

Note:开发应及时更新任务的状态,方便QA以及其他同学及时了解,同时看见相同类型的任务,或者改一个地方可以覆盖相关所有类型的模块的任务,应在doc 上同样assign 到自己名字下面,避免重复修改

QA任务:继续验证核心部分修改

第七周:

开发任务:继续完成模块部分任务,修改核心部分代码改出来的bug,如果需要,修改核心部分组件以适应模块组件的任务

QA任务:验证已经完成的Ticket

第八周:

开发任务:基本完成模块部分开发任务,协助QA 继续用多种工具扫面页面遗漏部分

QA任务:验证已经完成的Ticket,扫描页面遗漏部分

第九周:

开发任务:要求完成全部开发任务,修bug,将内容总结成文档

QA任务:验证已完成的TIcket,扫描页面遗漏部分

第十周:

开发任务:要求关掉所有ticket,所有bug,准备文档,把Accessibility 加入未来功能开发的必要规范,同时把规范内容对公司内其他相关组员进行培训

QA任务:验证以已完成的ticket 以及bug,反复测试确保‘闭着眼睛也能用我们的产品’,协助开发总结文档。

Accessibility 规范

1. 尽量用语义化的tag,如 button 代表操作,a 代表链接


2. 如果无法第一条规范,需添加role且保证role 的内容语义与节点所司功能相符

3. 对手风琴折叠的元素,加上合理的 aria 属性,标明元素状态。

4. 如果是html 原生 tag 就没必要添加无谓的role或者aria- 属性,因为原生tag已经添加好属于自己的属性了

Note, 这并不代表你一定不能加,相反,有的情况下你需要添加相关属性避免冲突

5. 避免用原生态的语义化标签如 h1 - h5 来做排版,因为阅读器会把这些语义化标签也读出来,如果你一定要用,记得加上 role="presentation"去消除阅读内容

6. 任何支持鼠标操作的地方都应该支持键盘 ‘tab’ 过去。

7. 图片:

    7-a. 对于视觉障碍的用户,图片是无法传达任何信息的,这时候屏幕阅读器tab到图片的时候就会读图片的alt 属性的内容,所以,添加一个生动的alt属性,是给视觉障碍的用户展示一副多彩页面的关键。如果是background image 的情况怎么办呢,在加background image 的 标签加一个 role = ‘img' 然后再加上 aria-ablel 去描述这个图片就可以了。

    7-b. 如果这个图片没有任何意义,只是吃瓜图片来占位置的话,我们应该给它标出来,用 (alt="") 或者 role="presentation" 或者 role="none"

8. 关于Icon,特别是字体图标

    8-a. 如果是纯装饰性字体图标,要手动添加 aria-hidden 去防止无意义的阅读 (这里插一句嘴,如果是无意义的纯字符装饰,也应该arir-hidden 起来 ,比如 user | work | about) 中间的面包屑分割线应该包起来,hidden 掉)

    8-b. 如果这个icon 是有意义的,需要添加一些东西让icon 能被正常读出来

        i. aria-hidden 属性

        ii. 用一个不会影响页面布局的标签 如 span (或者其他标签修改css 让它不会出现在页面)包上文字

        iii. 通常还要再加一个 title 属性

9. 避免用 Click here 做外部链接,直接用 内容做链接

10. Form 内容应该有合适的label,或者"aria-label","aria-labelledby" 属性

11. 标签不可滥用,不要把label 当 标题用,更不能叠用。用label 的时候 label 标签要添加for 属性,切它对应的标签要添加独立id 与for 属性值对应。做一组标签的标题的时候尽量用 legend,需要整理格式的时候用 Block

12. 在表单里面以一组形式出现的表单元素必须用<fieldset> 和 <legend> 去做他们的标题,或者可以用一个 role = group 的标签把它们包起来

13. 如果一个原生元素不支持focus,且没有合适的HTML 标签去替换它,用 tabindex=0 去支持focus,原则上来说"tabindex > 0" 是不允许出现的。

14. 用键盘导航应该有正确的业务逻辑

15. Id 属性应该要独特,否则会冲突。WMC 的FormGroup中,testAutomationID 最好也是独立的,因为如果Id 如果没定义的话,它会自动根据 testAutomationId 生成

16. Form 的 error 应该由Form 组件 自动生成,不应在组件外自己写

17. Iframe 元素都应该由一个 title 属性去描述iframe 里面的内容。如果iframe 里面含有不可读的内容,仍然应该根据标准添加title,但记得吧这些无意义的内容用aria-hidden="true" 隐藏起来

18. 不可见但又需要被读出来的内容,用 "sr-only" css class

19. Table 永远要加一个header

20. 如果一个 form control 有inline 错误信息,这个信息应该能被读出来

21. 所有新页面应该添加以下 <meta> 来激活zooming 功能

项目总结

项目技术上困难度不高,难点在于1. 技术分散。 2. 页面众多,部分修改适合以功能分类,部分修改适合以页面分类,分类不清楚的话极易造成重复修改 3. 测试任务繁重,基本要把项目所有部分涵盖 4. 由于项目修改涵盖范围广,最终代码Merge的时候跟其他项目组的代码冲突极多。

经过phase1 的总结,在phase2 中,QA同学已列出页面上问题已经从页面分类转变为类型分类,整个团队对整体业务逻辑和组件功能的熟悉程度都上升很快

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容