HTML 4 很容易理解,并提供了可以以富有想象力的方式使用的特性。通过将这些功能与级联样式表(CSS)和 JavaScript 等其他语言结合使用,开发人员可以做越来越复杂的事情,推动用户交互模型的发展。
随着 Web 2.0 类型的内容(如 AJAX、动态内容更新和更多客户端处理)的出现,我们看到各种优秀的、复杂的应用正在从通常语义受限的标记语言中开发出来。
这种新一波光滑的小部件——有时是奇怪的交互模型——经常给用户带来许多挑战。如果用户有残疾,挑战会更大,因为用户可能无法从键盘访问重要的小部件功能,或者内容更新可能会在屏幕阅读器用户上丢失。早在 HTML5 之前,许多 web 设计者就开始真正关心可访问性,并寻找方法来确保他们的网站和应用可以被最广泛的受众使用。于是像网络标准项目这样的草根运动诞生了。一个活跃而充满活力的社区出现了,他们将改善用户体验和设计质量的挑战视为战斗的号角。
那么 HTML5 有什么新的地方,和 HTML 4 有什么不同?首先,HTML5 的设计不仅仅是标记文本或超文本标记语言。(如果你认为是这样,我原谅你。)其次,许多新的 API 现在包含在新的规范中,乍一看,它们似乎根本不属于文档标记语言。
这些 API 多种多样,包括 Web 工作器(一种独立于任何用户界面脚本在后台运行脚本的 API)、Web Storage(类似于 HTTP 会话 cookies,用于在客户端存储结构化数据)和 Web Sockets(用于与服务器端进程的双向通信)。当你考虑到通过<video>和<audio>元素对视频和音频的原生“在浏览器中”支持时——这标志着从 Flash 等浏览器插件解决方案以及新的 2D 绘图 API <canvas>的重大转变——很明显,HTML5 远远不仅仅是一种文档标记语言,而是超越其他早期版本的 HTML 的一次巨大飞跃。
注新增的功能是一件喜忧参半的事情。有了这些新的语言特性,对于作者和用户来说,将会有更多的功能,但也更复杂。然而,在用户界面设计以及如何对项目进行编码方面采用最佳实践将对你大有裨益。所以,虽然感觉有点像你不得不重新开始,但我希望你会明白,事情并不完全是那样的。你会有更多的选择,当然,也会学到一些东西。我也希望你可能知道的关于使用 HTML 4 和 CSS/JavaScript 的组合来使东西变得可访问的好东西仍然经常适用。不要担心保持事情简单——只要为正确的工作使用正确的工具就可以让你走得很远。
HTML5 语法
在语法方面,HTML5 是一种戴着两顶帽子的语言。它可以写成 HTML 和 XML(也称为 XHTML,是 HTML 的 XML 序列化,或者换句话说,是 HTML 的类似 XML 的版本,将 XML 语法的一些规则引入 HTML)。
根据您自己的需求,您可能需要为您的用户提供更严格的格式良好的 XML 类型文档。这样做需要使用 XML 解析器,它用于处理 XML 文档。或者,由语法上更宽松的 HTML 组成的内容可能满足您的需要,在这种情况下,您可以使用 HTML 解析器。“更宽松的 HTML”指的是可能有点马虎但仍然有效的代码。
html 5<!DOCTYPE >
在 HTML 和 XHTML1 的早期版本中,文档是 HTML 还是 XHTML 主要是由 DOCTYPE 定义的(DOCTYPE 是网页标题中的一种可怕的代码,没有人真正知道它是做什么的,它看起来神秘而无意义,尽管它不是这两种东西)。DOCTYPE 实际上是让机器来处理的,作为一种识别文档内容应该符合的词汇表的方式。
在以前的版本中,您有以下文档类型:
对于 HTML 4.01 严格:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
对于 HTML 4.01 过渡版:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
或为 XHTML 1.0 严格版
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
或 XHTML 1.0 过渡版
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
在 HTML5 中,就简单多了。下面是新的 HTML5 文档类型:
<!DOCTYPE html>
这很简洁,当然也很容易记住。还有其他的优势。例如,您不再需要像在以前的 HTML 版本中那样引用 DTD(文档类型定义),所以它非常优雅,并将在所有较新的浏览器中触发标准模式。
一些文档类型历史
触发怪癖模式是开发人员用来确保向后兼容旧浏览器的一种技术。之所以需要这样做,是因为不同浏览器在呈现代码时的实际特性,以及像 W3C DOM 这样的技术规范的不良或不完整的实现。
我希望现在有了 HTML5,我们越来越接近“作者一次,然后发布到许多设备/平台”的模式。如果你不记得所有这些,那你应该觉得自己很幸运——这一点都不好玩,而且让 web 开发变得很痛苦。如果你记得所有这些,喝一杯烈酒。如果你想深入了解,请访问[en.wikipedia.org/wiki/Quirks_mode](http://en.wikipedia.org/wiki/Quirks_mode)。
注意在 XHTML 中,实际上并不需要 DOCTYPE,但是当你有一个所谓的多语言文档(这是一个既可以作为 XHTML 又可以作为 HTML 的混合文档)或者你需要在文档中声明实体引用(符号、数学符号、语言字符等等)时,你可能需要使用一个 DOCTYPE。
HTML5 表单上的< 】 element provides a field for the user to input data. In HTML5, it has new types and attributes. You might have some predefined input that you require from the user that you can define as option values (such as a 】 type, as shown in the next example). We’ll look at this in more detail in 第八章。<input list="guitars" /> <datalist id="guitars"> <option value="Fender <option value="Gibson"> <option value="Martin"> <option value="Gretsch"> </datalist>
这本书在总体基调上特别关注向后兼容性,并试图帮助你支持所谓的遗留用户代理,或更老的浏览器和 at。以一种既支持理解 web 内容的新用户代理,也支持不理解 web 内容的新用户代理的方式来处理 web 内容的标记和设计(通过给他们一些东西来让他们了解语义),是渐进增强的基础,这是一种更开明的设计方法。
注意在整本书中,我经常建议你借用其他更注重可访问性的语言,比如 WAI-ARIA,因为这是一种非常有用的方式来弥补你的项目中语义可访问性的差距。无论如何,WAI-ARIA 现在也正式成为 HTML5 规范的一部分,它是用来描述小部件的角色、状态或其他属性的完美工具。它在浏览器和 AT 中的支持也有所改进。
还有一些有趣的技术可以用在 HTML5 中,比如特征检测。作为作者,这允许您查询您的 web 内容所服务的用户代理,以便查看给定的浏览器是否支持 HTML5 的特定功能,然后为该浏览器提供该内容——或者如果浏览器不提供支持,则不提供该内容。如果这对您来说有点可怕,有一些工具,比如 Modernizr,可以帮助您完成大部分工作。
具有可访问性意味着设计者必须仔细考虑他或她如何在视觉上呈现内容(在清晰的设计和颜色对比方面),以及网站的底层语义结构如何适应残疾人,或者复杂的动态控件如何被残疾人使用。这些“约束”的效果是,设计者必须理想地只使用适合手头任务的任何开发技术、元素或属性——正确工作的正确工具。这种方法在开发 HTML5 web 内容时非常重要(稍后当我们查看像<canvas>这样的新元素时将会演示这一点)。
这给编写 HTML5 带来了一些挑战,因为它在浏览器和 AT 中的支持才刚刚开始。然而,当浏览器实现它们时,AT 技术也随之而来。发生这种情况是因为供应商可以看到某些功能正在被使用,因此他们会选择支持什么以及这将如何影响用户体验。最终,好消息是,随着 HTML5 的出现,工具包得到了极大的扩展,尽管当涉及到如何标记 web 项目时,您可能会经常面临选择过多的问题。
然而,网页可访问性并不仅仅与盲人计算机用户有关。当你在网上看到很多关于这两个主题的讨论时,不要陷入只把网页可访问性与盲人和屏幕阅读器联系起来的陷阱。“如果它与屏幕阅读器一起工作,它就是可访问的”这个想法只是部分正确。但这有点像说,“函数 x 在 HTML5 规范中是这样定义的,因此你应该这样做,它就会工作。”在理想世界中,是的,它肯定可以工作,但是在现实世界中,你必须考虑浏览器,它对任何给定功能的支持,以及用户模式(或交互方法——他们是 AT 的视力正常的用户还是盲人用户,等等)。).
在网页内容中使用清晰、简洁的语言对有阅读障碍的人有很大的帮助,你使用的字体也是如此。患有诵读困难症的人在使用包含记号或尾巴的字符时会遇到问题,这些字符出现在大多数衬线字体中。有些字母上的上行和下行的大小(如 p 上的下行和 b 上的上行)会混淆,所以字符的视觉形状必须清晰。诵读困难的人依靠这个视觉线索来帮助他们区分字母。
提示要了解 at 的精彩介绍,请观看杰夫·莫耶的 AT boogie 视频和海克·霍辛顿的动画。好玩又有教育意义,可以在[inclusive.com/assistive-technology-boogie](http://inclusive.com/assistive-technology-boogie)找到。
有许多不同的屏幕阅读器可用,如 JAWS、Window-Eyes、免费的开源 Linux 屏幕阅读器(ORCA)和免费的 NVDA,以及已经与 Mac OS X 捆绑在一起的不断改进的 VoiceOver。还有其他的,如 Dolphin 的 Dolphin Supernova、Serotek 的 System Access 和 Ai Squared 的 ZoomText 放大镜/阅读器。接下来是一些更常用的屏幕阅读器的概述。这不是对可用产品的详尽介绍,不同的包基本上做同样的事情。人们使用什么很大程度上取决于预算和偏好。
口
JAWS for Windows 是最常用的屏幕阅读器之一,由美国自由科学公司开发。JAWS 代表带语音的工作访问,它是一款昂贵的软件,专业版的价格约为 1000 美元。
也有许多可用的 JAWS 脚本,它扩展了它的功能以允许访问一些定制的接口和平台。JAWS 最初是一个基于 DOS 的程序。由于其使用宏和快速访问内容和功能的能力,它越来越受欢迎。
大约在 2002 年,这种能力被引入到更加图形化的 Windows 环境中,增加了使用快捷键在网页中导航以及将焦点放在 HTML 元素(如标题)上的功能。这种功能和用户与屏幕阅读技术的交互已经成为可访问 web 开发的基石。
随着时间的推移,JAWS 的功能不断扩展,能够查询页面中使用的字体,指定哪些 web 元素具有焦点,以及更多高级功能,如 tandem ,允许您远程使用他人的屏幕阅读器来访问计算机。Tandem 对于故障排除和远程可访问性测试非常有用。
JAWS 12 引入了虚拟功能区,用于 Microsoft Office 和其他应用,并引入了对 WAI-ARIA 的支持。
首先,JAWS 在与网络内容交互时使用所谓的虚拟光标。所以你实际上不是直接与网页本身交互,而是与页面刷新时加载的页面的虚拟版本或快照交互。虚拟光标还用于阅读和导航 Microsoft Word 文件和 PDF 文件,因此您将在这里学到的一些技巧可以在导航可访问的脱机文档时应用。
注意使用 JAWS,与网页内容的交互包括使用一个离屏模型(OSM) ,其中来自页面的 HTML 内容被临时缓冲或存储,屏幕阅读器与之交互,而不是直接与页面交互。然而,有时候,当使用 DOM 时,其他屏幕阅读器不再使用屏幕外模型,因为它被认为有点过时和有问题。所以直接与 DOM 交互更好。现在不要太担心这个,因为我将在第四章“理解可访问性 API、屏幕阅读器和 DOM”中更详细地介绍它当我们讨论动态内容和使用 JavaScript 时,屏幕阅读器如何使用 OSM 和与 DOM 交互的细节变得很重要。
JAWS 提供了一种轻松浏览网页的杀手锏。当您打开 Web 浏览器(例如 Internet Explorer (IE))时,只需按一个键就可以跳转到您选择的页面上的任何 HTML 元素。要查找页面上的标题,请按 H;对于所有表格,请按 T;对于表单控件,请按 F;等等。按下这些键中的任何一个超过一次将导致文档源顺序中的下一个期望的元素被宣布并被给予焦点。这是一个很棒的方式来浏览网页,使用标题来导航,跳过内容的各个部分,并快速聚焦到你想要的任何元素!
您还可以将 VO 命令分配给触控板手势和数字键盘等,以较少的按键次数执行常用任务。你可能想要模仿滑动手势来在 HTML 项目之间导航,例如当使用 iPhone 和 VoiceOver 时(这是一种能够浏览网页的非常酷的方式)。稍后我会在这方面说得更多。VoiceOver 实用工具用于根据您的需要调整屏幕阅读器。
提示 VoiceOver 提供了几种导航网页的方法。第一个是默认的 DOM 顺序,它允许您按照我前面描述的方式导航,比如从一个标题到另一个标题或者从一个链接到另一个链接。导航顺序由项在代码中出现的源顺序决定。第二个选项是对项目进行分组,这让你可以使用像左右滑动或上下滑动这样的手势来获得页面的空间感和项目的位置。虽然这可能对一些盲人用户有用,但对开发人员来说,测试页面的可访问性并不真正有用。所以我会选择 DOM Order 选项。
我建议保留页面加载选项,如图 2-17 所示。
图 2-17。更多 VoiceOver 网络选项
最后一个选项我们将稍微调整一下。这是 Web 转子的“偏好设置”面板,这是 VoiceOver 中的一项重要功能,需要您理解,因为它是新一波基于手势的交互的核心。
使用腹板转子
Web Rotor 是一种使用简单手势访问特定类型的 HTML 和其他元素的方式。如图图 2-18 、图 2-19 、图 2-20 和图 2-21 所示,这是一个虚拟表盘,你可以通过分别在比如 6 点钟和 12 点钟的位置按下拇指和食指,然后顺时针或逆时针转动手指来访问它。当你继续转动时,你会看到一个显示各种选项的刻度盘。当您选择了特定类型的内容(如链接或标题)时,您可以通过触控板使用简单的推送手势(向右或向左)来导航。每个手势将突出显示源代码中出现的所需项目,在你滑动时将它们输出为语音。相当整洁。
你可能意识到这种功能已经是 Windows 操作系统和 Mac OS X 的一部分,并想知道为什么有人会把自己的血汗钱花在一个专用的软件包上。专用软件包和操作系统功能之间的区别在于质量和清晰度,当您将 SuperNova 或 ZoomText 等屏幕放大产品与内置操作系统产品进行比较时,这一点非常明显。事实是,当您使用(并真正推动)操作系统的放大功能时,您可能会看到伪像,更重要的是,模糊的文本在高放大级别下可能会变得难以辨认。
在这一章,我介绍了一些不同类型的残疾,或者我应该说,我们看了不同范围的能力。我们还研究了各种可以帮助人们使用电脑和网络的技术。在接下来的几章中,我们将会看到 JavaScript,然后是一种叫做 WAI-ARIA 的新的可访问性标记语言,它可以与 HTML5(以及 HTML 的早期版本)结合使用,以创建可访问的、丰富的互联网应用。我们还将通过研究离屏模型来更详细地了解屏幕阅读器是如何工作的,您将了解 DOM 和可访问性 API。*
本章介绍了使用这些语言进行可访问性设计的一些常用方法,以及开发适用于每个人的动态内容——注意一些基本的良好的脚本实践。我们还将看看当前更加易于访问的 JavaScript 库。这一章也给了你一个很好的基础来帮助你过渡到可访问的 HTML5 开发,因为这里涉及的很多内容同样适用于 HTML 4 和 HTML 5。我还将概述一些在开发以支持旧的辅助技术(AT)时可能仍然需要使用的向后兼容技术。
如果你需要一本关于 JavaScript 的入门书籍,我推荐 Christian Heilmann 的书,他写了大量关于这个主题的文章,是可访问性方面的专家,还有 Jeremy Keith 和 Jeffrey Sambells 的《DOM Scripting:Web Design with JavaScript and the Document Object Model 》( friends fed,2010 ),也很棒。本章假设你有一些脚本经验,但是如果不是很高级也不要担心——你会得到大概的概念。
HTML 4 中只有两种元素可以单独通过键盘接收焦点:<ahref>锚标签和<form>控件。如前所述,键盘可访问性是可访问 web 开发的基础。在 HTML5 中,许多控件已经可以在 Opera 11、Safari 5、IE 9、Firefox 6 和 Chrome 13 等几个主要浏览器上通过键盘访问——全部或部分。这些包括<audio>元素;<datalist>元素;<color>输入元素;<date>输入元件;<date and time>输入元件;<month>、<number>、<range>和<搜索>输入元素;以及<time>, <week>和<summary>元件。
尽管可聚焦元素和控件的调色板不再那么有限,但值得注意的是一些用于使元素在浏览器中可聚焦的技术,因为它们仍然非常有用——特别是在向后兼容较旧的 at 和尚不(或不愿)支持 HTML5 的浏览器等问题上。
您还应该意识到,虽然 HTML5 中的许多新控件可以通过键盘访问,但这并不意味着它们是完全可访问的。为此,他们的角色和其他信息需要通过辅助技术的可访问性 API 公开。我刚刚列出的几个新的 HTML5 控件还没有出现这种情况。
开发可访问脚本内容的首要原则之一是渐进增强的理念。根据这一原则来构建网站,你可以像看待 CSS 一样看待你的脚本——你可以将它们分成各自的文件或层。你的 HTML 是内容层,CSS 是表示层,JavaScript 是行为层。这种思考脚本的方式已经得到了很好的证明,并且很有意义,因为它有助于代码管理,并且使项目移交更容易,更少混乱。作为一个额外的好处,它对使用 AT 的残疾人有好处,因为基本内容总是可用的,并且不完全依赖脚本来工作。这意味着逐渐增强的内容也可以更容易地被你喜欢的搜索引擎解析。
注你可以把谷歌搜索引擎想象成一个盲人用户。它将解析人们在表面上看不到的代码——就像屏幕阅读器一样——然后运行它神奇的算法并返回结果。所以在你的设计中善待残疾人,你也会为大 g 服务。
当您分离您的内容时,您从一个可访问的网页(结构良好的 HTML 内容、正确标记的表单控件、合适的替换文本等等)开始,为您的所有表示性内容添加一个单独的 CSS 文件,然后向站点的各个方面添加 JavaScript 功能,以增强其对可以正确处理它们的用户代理的功能。
在 CSS 中,你编写全局定义的声明,使用它们通过<div>元素或者id或者class属性(也称为钩子)来控制外观,然后告诉浏览器以不同的方式呈现它。您可以添加更多谨慎的挂钩,然后在您的 CSS 文件中编写表示规则,而不是在 HTML 中添加大量繁琐的 CSS 代码。你可以用同样的方式思考 JavaScript。一个好的做法是在 JavaScript 文件中定义全局行为,这些行为将自己附加到 HTML 中的 ID 和类挂钩上,这样这些行为将(如果愿意的话)级联到 HTML 文件中。
注意,你可以给你的 id 和类名起一个类似于的名字,比如 popup 或者 expand_menu ,这在你编码的时候很容易理解。或者您可以借用现有的 ID 和类名。例如,考虑这个片段:<a href="http://www.somewebsite.com" class="expand_menu">Expand me</a>
注意向钩子添加许多 JavaScript 事件的正确方法是定义元素,然后是事件,最后是动作。有几种方法可以做到这一点,比如getElementbyId、getElementsByTagName(当你想将几个具有相似行为的元素作为目标时)和getAttribute。每种方法都可以用来遍历 HTML 文档的 DOM 寻找特定的 id、元素类型或属性。然后在文档加载时对它们做些什么。添加window.onload=prepareLinks();函数还将确保您的 JavaScript 不会在页面加载之前触发。如果你的脚本在一个外部文件中,这一点很重要,因为它可能会在你的 HTML 文件之前加载。
常见的 JavaScript 可访问性问题
注意术语事件处理程序将在接下来的章节中大量使用。事件处理程序实际上是包含响应事件而执行的程序语句的方法,因此事件处理程序和方法可以互换使用。事件处理程序被添加到您的 HTML 代码中,并通过某种用户交互来激活或触发。它们也可以由浏览器本身触发,例如,当页面加载时,或者当网页的某个部分使用 XHR 对象异步更新时(这在 AJAX 开发中很常见)。
Lack of Control: Taking the previous example a step further, if a webpage has been developed with only onClick methods, these functions often are not accessible to a keyboard user. The user might not be able to use the widgets/controls at all and therefore is blocked out of the web site. This can also be an issue when content is hidden or removed on certain events and the user either cannot undo an action or just can’t get to some content.
发生了太多事情:过度工程化、过度烹饪的界面如今变得越来越常见。随着用户体验在这个看似无限选择的时代变得越来越重要,它们越来越不被容忍。当用户对一个网站有不好的体验时,他们很幸运不必回头,并且有大量的竞争网站很乐意收购他们的业务。当一个组织是一个公共部门或联邦机构时,情况就不同了,他们有义务确保他们的 web 界面符合某种标准。
<p> Here is a my <a href="http://www.myusefulpopup.html" target="_blank">really interesting and useful pop box [Opens in new Window] </a></p>
为了确保您的popUp函数适度降级,请使用真实的 URL(如前面的示例所示)。
以下示例调用一个名为popUp的函数,它采用如下所示的一般形式:
<script type="text/javascript"> function popUp(X) { window.open(X); } </script>
以下是内联示例(这些示例不是最佳实践,但在此用于说明目的):
<a href="http://www.myusefulpopup.html" onclick="popUp('http://www.myusefulpopup.html'); return false;"> Here is my really interesting and useful pop box [Opens in new Window] </a>
<a href="http://www.myusefulpopup.html" onclick="popUp(this.getAttribute('href')); return false;"> Here is my really interesting and useful pop box [Opens in new Window] </a>
或者您可以使用 snazzier 版本:
<a href="http://www.myusefulpopup.html" onclick="popUp(this.href); return false;"> Here is my really interesting and useful pop box [Opens in new Window] </a>
需要记住的一点是,href值是一个真实的 URL,所以当脚本关闭时,它仍然可以工作。这些是内联脚本或者包含在代码中的脚本的例子。最好将脚本放在一个单独的文件中,就像处理 CSS 一样,然后在头文件中指向该文件,引用 id、引用类名,或者像 JavaScript 允许的那样搜索元素 id 和类型。
关于如何用可访问且不引人注目的 JavaScript 替换 NOSCRIPT 的有趣文章,请参阅 Frank M. Palinkas 关于 Dev 的文章。歌剧在[dev.opera.com/articles/view/replacing-noscript-with-accessible-un](http://dev.opera.com/articles/view/replacing-noscript-with-accessible-un)上演。
例如,WAI-ARIA live 区域用于经常更新的页面,如股票行情和聊天记录。JAWS 首选项确保 ARIA 属性值没有设置为 off。如果它是打开的,屏幕阅读器将自动检测是否有更新,并将宣布更新或更改的内容。这真的很有用,因为屏幕阅读器用户在任何给定的时间都不必关注他碰巧浏览的页面的任何部分。
这种不失去焦点并发布实时更新的问题是一个强大而有用的新功能,可以实现更完整的用户体验。此外,值得注意的是,不干扰用户的焦点是可访问 web 开发的一个重要部分,应该注意支持这一点——尤其是在开发大量脚本化的应用时。
提示打破当前焦点的一个常见方法是强制进行不必要的页面刷新。所以尽量减少这些,尽可能在客户端进行更多的表单验证。或者,如果您使用脚本来更改 DOM 并添加新内容,请将此功能包装在一个活动区域中!
实时区域属性
正如任何生活方面的交流(人类之间),当一个人试图告诉你一些事情或做一些事情时,你不想成为话匣子或粗鲁地打断她。实时区域能够以不会不必要地打扰用户的方式设置中断级别。这些区域可以设置为关闭,礼貌,或主张。大多数情况下,您可能会使用礼貌值,但有时您想对屏幕阅读器用户说,“这真的很重要,您必须马上了解这一点”,因此您会将该值改为 assertive。曾经有一个rude属性用于 live 区域!
在前面的示例中,ARIA 角色区域被添加到父元素<div>中。这使得它是“活的”ID of "SingleLiveRegion”为您的数据源提供挂钩。使用aria-live="polite"会导致只有当用户完成与网页的交互时才会宣布小工具的更新内容——因此用户在使用屏幕阅读器浏览网页的正常过程中不会被打断。
一个没有视力的人无法在视觉上建立这种联系,除非以某种方式描述这个物体,否则手卷图形或整个部件的身份是未知的。当 AT 的用户激活它时,该用户可以期待什么?因此,描述元素是什么和它的功能是可访问 web 开发的核心,也是将语义正确应用于这些控件的核心。
如果您使用原生 HTML 控件,您应该知道它们具有固有的语义,这些语义用于描述一个元素以及当与 at 一起使用时它将做什么。如果没有,ARIA 是提供这些语义的一个很好的方式。以下是如何使用一些新的 ARIA 属性实现这一点的示例。
您可能对可访问性海报儿童/摇滚明星很熟悉,它是<img>元素的alt属性。这是大多数开发人员在开始学习无障碍 web 开发时要学的第一件事。这是您使用替代文本描述图像的地方。您还可以通过在图形中添加替代文本来描述图像对辅助技术的作用(当它的行为类似于链接时)。描述性图像采用以下形式:
<img src="dir/somegraphic.jpg"alt="Picture of Ruairí bouncing in his bouncer!"> or for functional images of <a><img src="dir/button_graph.png" alt="Submit your personal info"></a>
<div> <label for="imei">IMEI Code</label> <input type="text" name="imei" id="imei" aria-describedby="imeidesc"> <span class="cue" id="imeidesc"> International Mobile Equipment Identity: 15-digit code to identify a mobile phone, found by dialing *#06# </span> </div>
你可以更进一步,添加一些老式的 HTML 可访问性魔法,将一些控件包装在<fieldset>和<legend>中,以添加一些更有用的数据。(参见图 3-6 和清单 3-5 。)这样做有助于屏幕阅读器用户(以及视力正常的人)理解表单控件是如何分组的。当键盘将焦点放在<legend>和<fieldset>元素中的各个输入字段上时,屏幕阅读器就会宣布这种关系。这两个元素也受到较老的 AT 的良好支持,它们使您的表单更加向后兼容和健壮。
JAWS 还支持 ARIA 拖放属性aria-grabbed和aria-dropeffect。这些可以被添加到对象中,屏幕阅读器将能够通知用户该项目是可抓取的、已抓取的还是可放下的。击键 WINDOWS 键+CTRL+EQUALS 打开 ARIA 拖放对话框,其中显示了页面上可拖放对象的列表。
结论
在这一章中,我们很好地介绍了一些可访问的 JavaScript 技术,以及优秀的 WAI-ARIA 规范。我们讨论了在 web 站点和应用中使用脚本时需要了解的一些基础知识。更先进的技术可以建立在坚实的基础上。你可以构建复杂的脚本化界面,我希望这一章有助于向你展示你的方法和其他东西一样重要。在下一章,我们将看看屏幕阅读技术是如何工作的,在 DOM、可访问性 API 和离屏模型(OSM)方面发生了什么。
四、理解可访问性 API、屏幕阅读器和 DOM
在本章中,我们将更详细地考虑屏幕阅读器是如何工作的,并看看辅助技术(at)用来访问 web 内容的 DOM 和可访问性 API。理解这一点很重要。虽然有些东西看起来有点抽象或学术,这一章对你构建可访问的 HTML5 内容并不重要,但它会有所帮助。从设计上来说,它也很短。
当你看到网络内容和 AT interaction 的具体细节时,事情就复杂了。这一章让你对各种平台可访问性 API 之间发生的事情有一个大概的了解,并看看动态 DOM 更新和正确应用语义来描述定制控件。
正如我提到的,我至少花了两到三年的时间来掌握屏幕阅读器的实际工作方式,从研究用户交互模型和熟悉 JAWS 击键到理解幕后发生的事情。这只是从屏幕阅读器的角度来看——不要管数据是如何在各种 API 之间转换的!所以,如果你在海上感到有点失落,也不用担心。这一章是我试图用一种我希望几年前有人为我做的方式向你解释事情。
什么是 API?
一个 API 就是一个应用编程接口。这是一个框架或一组规则,提供用任何给定语言编程所需的代码、函数或词汇。API 可以被认为是一个代码库,你用它来告诉软件,比如浏览器或辅助技术,去做一些事情。
例如,浏览器将以 HTML5 编写的 web 内容转换为文档对象模型(DOM)。网页的这个 DOM 与浏览器使用的布局引擎相关联。然后,浏览器从布局引擎和 DOM 获取信息,以支持操作系统(OS)平台可访问性 API。该 API 允许辅助技术监控和查询浏览器向其公开的任何可访问性信息。
在我们更详细地研究 API 本身之前,我们需要后退一点,讨论第一个易访问性模型:离屏模型,或 OSM。它的开发是为了让早期的屏幕阅读器和盲文输出设备能够访问可视桌面和第一个图形用户界面(GUI)。对屏幕外模型的了解将有助于您更广泛地理解这些相关技术是如何交互和表现的。
早期的基于 DOS 的系统,或者命令行界面系统,因为是基于文本的,所以很容易使用。用户输入到系统中的信息,以及系统返回的信息,可以很容易地在内存缓冲区中捕获并合成为语音。这种语音输出是通过使用我在第二章“理解残疾和辅助技术”中谈到的共振峰合成来实现的。文本字符串和数据等字符存储在缓冲区(或内存存储区)中,屏幕阅读器可以轻松地直接访问这些缓冲区,然后以语音形式输出给最终用户。
注关于一段非常有趣的屏幕阅读器历史,我推荐 Richard Schwerdtfeger 的论文《让 GUI 说话》,他是 IBM 辅助功能软件组的 CTO,也是著名的辅助功能专家。Rich 还与杰出的 Jim Thatcher 博士一起工作,他开发了第一个 DOS 屏幕阅读器和第一个基于 GUI 的 PC 屏幕阅读器。你可以在ftp://service.boulder.ibm.com/sns/sr-os2/sr2doc/guitalk.txt拿到这篇论文。
对于基于 GUI 的系统,离屏模型的工作方式是捕获关于要在屏幕上可视化呈现的控件的信息,然后创建一个单独的页面版本(离屏模型——因此得名)。然后,屏幕阅读器与这个 OSM 交互,并使用其内容作为输出最终用户可以理解的语音的基础。
您可以将离屏模型想象成任何给定时间的屏幕快照。正在发生的是一种被称为屏幕抓取或挂钩图形调用的技术。如今,对于桌面系统,操作系统提供了公开和检索这些信息的工具,但是是应用及其用户界面组件通过 API 公开这些信息。
现代编程语言允许使用对象和元素的描述,屏幕阅读器可以通过可访问性 API 锁定这些描述。然后,当用户通过键盘获得焦点时,屏幕阅读器将这些名称和属性作为语音输出给用户。正如我提到的,对于桌面应用来说,维护 OSM 的需求已经减少,但并没有完全消失,在开发人员忽略了标记控件的语义的情况下,它仍然是有用的。因此,OSM 可能仍然会发挥支持作用,为屏幕阅读器提供尽可能多的信息,从而促进更完整的用户体验。
如今,并不是所有的屏幕阅读器都主要使用 OSM 来与网络交互。OSM 被视为过时的技术。此外,维护一个 OSM 在技术上很困难,对开发人员来说也是一个挑战。例如,当您第一次尝试自己测试网页时,您可能会发现很难理解屏幕阅读器是怎么回事。你会失去你在页面上的位置,或者发现在某些时候很难知道屏幕阅读器的焦点在哪里。(会发生的。)这有助于理解你首先不是直接与浏览器互动,而是与这个第三位互动。
注意在与 Web 交互时,实际上“第三位置”是 DOM 和可访问性 API 输出的组合——以及一些屏幕阅读器的 OSM。当你第一次接触这些东西时,最初认为它们代表着同样的东西会有所帮助。它们并不相同,但实际上结合起来创造了“第三个位置”所以它作为一个抽象概念是有用的——这样你的脑袋就不会爆炸。
前面我们讨论了像 JAWS 这样的屏幕阅读器在与 Web 交互时使用的各种光标。电脑虚拟光标是 JAWS 用来浏览网页的主要工具。该虚拟光标实际上指向虚拟缓冲区中的内容数据库——实际上是 osm 和 API 调用组合的可用内容的缓存。屏幕上可视化内容的缓冲允许 at 用户浏览屏幕内容。因此,虚拟光标代表屏幕阅读器用户的浏览点,当视力正常的用户浏览网页时,它可能与焦点不匹配。
您可能还记得我之前谈到过屏幕阅读器使用的表单模式。像 JAWS 这样的屏幕阅读器使用虚拟光标,这样用户可以通过按 H 键、G 键(对于图形)或 B 键(对于按钮)来导航标题,或者在页面上调出链接对话框。这是可能的,因为虚拟光标已经捕获了击键,将它们用作导航控件。那么当你想在网页上输入一些数据的时候呢?显然,您不能同时使用屏幕阅读器的这些导航功能。
记住这就是为什么有像 JAWS 这样的屏幕阅读器的表单模式。在窗体模式下,屏幕阅读器从使用 PC 虚拟光标切换到直接与浏览器交互。这将禁用虚拟光标,并允许屏幕阅读器用户直接在表单中输入数据。
这种表单模式也给 web 开发人员带来了一定的挑战,因为当开发人员在表单模式下工作时,通过 PC 虚拟光标可以获得的重要数据可能不可用。这些丢失的数据可能是关于如何填写表单的说明等等。在表单模式下,应该注意表单验证和更新屏幕内容,这样屏幕阅读器用户就不会错过您需要给他们的指示或反馈,比如丢失输入数据等等。
注在现实中,用户代理,可能是浏览器或某种辅助技术,在构建 web 文档的图片或模型时有几种选择。它可以直接与 DOM 交互,或者使用离屏模型,或者它可以通过平台可访问性 API 获得关于这些不同节点及其状态和属性的信息。我之前提到过一些可访问性 API,比如 MSAA、iAccessible2、苹果可访问性 API 等等。
可访问性 API 是如何工作的?
可访问性 API 充当浏览器、DOM 和 AT 之间的网关或桥梁。为了让辅助技术能够理解 DOM 的内容,需要将这些内容映射到可访问性 API 中的相应角色。API 就像一个过滤器,帮助在任何给定的时间了解 DOM 中发生的事情。实际的 API 做的不止这些,因为它不是完全静态的。它可以促进用户界面组件和辅助技术之间的动态交互。
注意 AJAX 开发人员将熟悉XMLHttpRequest或XHR对象,它们可以通过减少对服务器的调用来促进更多的客户端功能,并有助于创建更加动态和响应更快的 web 应用。
虽然客户端更新很棒,是一个真正的进步,但 AJAX 或 Web 2.0 应用中的动态内容更新对更注重可访问性的开发人员提出了挑战。开发人员如何让 AT 知道部分页面内容已经更新?如何以一种不引人注目的方式做到这一点?在 WAI-ARIA 出现之前,这非常棘手,因为虚拟缓冲区的更新必须是强制的,用户才能看到 DOM 中的任何变化。现在这已经不是什么大问题了,因为虚拟缓冲区每隔几毫秒就会自动更新一次,所以 DOM 的变化可以更可靠、更快速地传递给用户。
注意对于一些关于这个问题的屏幕阅读器历史,如果你喜欢放松一点,我推荐以下 Gez Lemon 和 Steve Faulkner 在[www.Juicystudio.com](http://www.Juicystudio.com)发表的文章。Gez 和我也写了关于这个主题的文章,并在英国利兹的一次技术会议上提交了一篇论文,会议由大约五个人组成,我们是其中的两个人。所以这个主题确实有广泛的吸引力,哈哈!
在本章中,您学习了可访问性 API、DOM、屏幕阅读器如何通过可访问性 API 从 DOM 接收信息,以及旧的但仍在使用的离屏模型。在未来的章节中,我们将更多地使用易访问性 API 而不是 OSM。如前所述,屏幕阅读器不是 AT 现有的唯一部分,但它是最复杂的部分之一。在接下来的章节中,当我们继续更详细地研究 HTML5 时,我们在这一章中所涉及的领域肯定会对你更好地理解 at 是如何处理代码有很大的帮助。此外,我希望你能更好地理解为什么你有时可能需要提供一些额外的东西来支持旧的,例如,不使用更高级的 API。
在这一章中,你将开始更详细地了解 HTML5 规范,尤其是与可访问接口的开发最相关的方面。有许多新的 API 进行后台客户端/服务器处理和数据存储,可以用于丰富、响应迅速的应用,但您将看到的主要是 HTML5 影响用户可访问性的方面。
您还将看到新的 HTML5 元素和用于定义文档轮廓和新的结构形式的语义。
HTML5:有什么新消息?
HTML 的早期版本是相对简单的文档标记语言。它们允许文档被链接和引用,并为构建内容提供语义以支持小范围的浏览器和平台。这种多样的内容范围很广,从数据表到通过简单链接提供交互的内容(这实际上是 Web 的核心),再到表单控件,以及一些非常简单的媒体——实现了嵌入式图形。
但是真的是这样。这些项目构成了早期 HTML 标记语言能力的基础。聪明的人随后想出了压缩音频和视频的方法,比如使用 Flash、Silverlight、Maccies 的 QuickTime 或 PC heads 的 RealPlayer 等插件(以及这些插件的真正乐趣)。这些技术使得 Web 能够被用作像动画内容和视频这样的富媒体的平台。
从可访问性的角度来看,最终结果是浏览器或辅助技术(at)供应商支持或不支持的内容似乎有点武断。例如,CSS2 在浏览器中得到广泛支持绝对需要几年时间。当它最终被支持时,它通常只得到部分支持,这导致了错误和故障(例如“盒子模型渲染不一致”)。在 AT 的世界里也有同样的特性。例如,< table>元素的<scope>属性使得在 HTML4 中创作更易访问的数据表比使用更受支持的<headers>和for/id方法要快得多。然而,对它的支持是如此之少,不幸的是,这种更简单的创作方法不能被依赖。
新的 HTML5 语义
HTML 是一种很大程度上与意义相关联的语言。有些您已经熟悉的控件具有固有的行为(如通过键盘可点击或激活的链接等),但这些行为是由用户代理(如浏览器)处理的。底层代码提供了一个基本结构,允许核心内容(通常是文本)被广泛的设备消费。这一内容层为“一次创作,发布到多种设备”的模式提供了实用的基础,该模式为电子通信提供了巨大的优势,实现了互操作性,而无需在过多的设备之间进行大量定制。
注意html 5 规范对元素的使用非常严格。
当您想到语义对互操作性和可访问性的重要性时,前面的观察确实有意义。想想我们已经讨论过的关于结构化内容在支持可访问性架构和通过可访问性 API 向 at 传递可用信息方面的重要性。如果你的头还疼的话,我很抱歉,但这一切现在应该清楚一点了。
有些人自称了解可访问性,但实际上他们是规范狂热者,可能是验证吸血鬼。符合任何一种方法都不能保证可访问性、良好的可用性或积极的用户体验。所有这些开发工具真正能做的是表明开发人员在编写符合正式发布的语法的代码时知道她在做什么,但它们不一定在用户代理支持方面考虑用户体验,也不一定在浏览器或 at 上工作。唯一有助于开发人员理解实际情况的是用户测试或熟练使用屏幕阅读器的体验。在这一点上,开发人员自己的测试可能有助于发现什么时候工作或者不工作。这种知识非常重要,因为它基于用户体验的主观现实。
"下表定义了适用于 HTML 元素的强本机语义和相应的默认隐式 ARIA 语义。第一列中的每个 HTML 语言特性(元素或属性)暗示了同一行第二列的单元格中给出的 ARIA 语义(角色、状态和/或属性)。当多个行应用于一个元素时,必须应用定义角色的最后一行中的角色,并且必须组合所有行中的状态和属性。以下是这一工作方式的详细列表。”1
注意一般情况下,我描述的情况在没有@alt或者@title的地方会触发所谓的启发式评估。一个启发式是经验法则或评估方法。试探法是各种事物的核心,从学习计算机科学时可能学到的基本逻辑,到更高级的算法设计。不要被这个术语所困扰,只要想想“一套规则”有时,当启发式评估被触发时,屏幕阅读器也会查看网页中周围的 HTML 内容。
During the summer of 2011, Fiachra, Dara and I climbed the three highest mountains in
Ireland. This was a stupendous day where the challenge of summiting the three peaks of
Carrauntoohil, Beenkeragh & Caher was too much to resist!
The Coomloughra Horseshoe
The three peaks are ringed within in a large horseshoe shaped valley and present a very
challenging climb even for experienced hill walkers. We also had fantastic views of the
MacGillycuddy Reeks from Beenkeragh's high, exposed summit. The weather was also very
beautiful and we totally lucked out as we couldn't have asked for a clearer day to see the
spectacular views. We walked over Beenkeragh Ridge with its yawning drops and navigated the
equally spectacular Caher Ridge, with the Black Valley far below, before descending from Caher
into Coomloughra Glen.
Remember to bring water
It was a very hot day and after 4 hours or so we ran out of water! Fortunately we came across some fresh mountain streams in the Coomloughra Glen and could top up our water bottles
[…]
`
如果我想在第一段中包含图片,并且我想把这一段作为文本描述,我可以像清单 6-2 中所示的那样编码。
清单 6-2。在帖子中包含一张图片
`
My big climb this summer (2011)
Climbing the three highest mountains in Ireland
****During the
summer of 2011, Fiachra, Dara and I climbed the three highest mountains in Ireland. This was a
stupendous day where the challenge of summiting the three peaks of Carrauntoohil, Beenkeragh &
Caher was too much to resist!
The Coomloughra Horseshoe
The three peaks are ringed within in a large horseshoe shaped valley and present
a very challenging climb even for experienced hill walkers. We had fantastic views of the
MacGillycuddy Reeks from Beenkeragh's high, exposed summit. The weather was also very
beautiful and we totally lucked out as we couldn't have asked for a clearer day to see the
spectacular views. We walked over Beenkeragh Ridge with its yawning drops and navigated the
equally spectacular Caher Ridge, with the Black Valley far below, before descending from Caher
into Coomloughra Glen.
Remember to bring water
It was a very hot day and after 4 hours or so we ran out of water! Fortunately
we came across some fresh mountain streams in the Coomloughra Glen and could top up our water
bottles […]
`
那么刚才显示的代码中发生了什么呢?我使用博客文章的内联文本来描述图像,通过它们的 id 指向 block 的内容。在本例中,我分别给了每个<p>元素一个 IDtext1、text2和text3。对于支持aria-describedby的用户代理(如前一章所述,许多新的屏幕阅读器都支持,那些不支持的只会忽略它),在图像和描述之间创建一个编程连接意味着一旦图像获得焦点,描述就会被公布。此外,有一些方法可以增强这种基本行为——例如,通过向图像添加一个@alt文本描述,并将其与aria-describedby代码相结合。这看起来有点像清单 6-3 中的代码。(我省略了博文代码的第一部分和最后一部分。)
清单 6-3。增强图像描述
`
Climbing the three highest mountains in Ireland
****During the summer of 2011, Fiachra, Dara and I climbed the three
highest mountains in Ireland. This was a stupendous day where the challenge of summiting the
three peaks of Carrauntoohil, Beenkeragh & Caher was too much to resist!
The Coomloughra Horseshoe
This three peaks are ringed within in a large horseshoe shaped valley and
present a very challenging climb even for experienced hill walkers. We had fantastic views of
the MacGillycuddy Reeks from Beenkeragh's high, exposed summit. The weather was also very
beautiful and we totally lucked out as we couldn't have asked for a clearer day to see the
spectacular views. We walked over Beenkeragh Ridge with its yawning drops and navigated the
equally spectacular Caher Ridge, with the Black Valley far below, before descending from Caher
into Coomloughra Glen.
<img src="Ruairi.jpg alt="Ruairi smiling and playing on the couch at home with his large purple Owl friend Minerva. There is a likeness in their big Moon heads!" />
Two friends together, Ruairi and Minerva`
<figure><img src="josh_drawing_creation.png" alt="A large colourful pen and ink drawing with a cosmic theme of creation" aria-describedby="creation" /><figcaption>‘Creation by Joshue 0 Connor (1993)</figcaption></figure>
‘Creation’ by Joshue O Connor (1993)
In a past life Josh was far more interested in playing guitars, painting, and in general
larking about than he was with computers.
Here is some more background about his artwork for those interested […]
This drawing illustrates the mystery of creation. It shows a large flaming
triangle that holds a bright radiating sun at its apex, and a stylised smiling moon sits at
its base in opposition. At the heart of the triangle there sits an exploding planet with the
ancient Vedic symbol of creation the AUM at its heart. The image sits on a background framed
of stars and small spaceships fly by randomly in the distance.
`
在 HTML 文档中找到的较长描述的例子稍微好一点。这种方法确实给了作者多一点呼吸的空间,也有希望还图像一个公道。是否是合适的描述,是否传达了图像同样的视觉丰富性?你是法官。可以说,图像功能越多,提供合适的替代文本就越容易,模糊性就越小。
如您所见,@longdesc是一种链接到当前页面或另一个页面上的更长描述的机制。说浏览器和 AT 对它的支持很差可能有点过了,但支持肯定不是很好。它在学术界之外也很少使用。对于那些认为它有用的人来说,它是有用的——如果一个元素很好地服务于一个用例,即使它的应用不是完全通用的,我对保留或改进元素功能或在规范中保留一个元素没有问题。但那是我。
然而,它确实有一些优势,尽管 ARIA 很棒,HTML5 也在许多领域取得了进步,但目前都没有提供对@longdesc的全功能替代。@longdesc有一张王牌,它可以用来引用离页 URI,还可以提供结构化内容作为文本描述。不幸的是,它在浏览器中的实现和最终的用户体验往往还有许多不足之处。然而,这可能与其实现有关,而不是不需要一个更长的描述机制。这是 HTML 工作组中的一个热门话题,您可能会发现它正在重新浮出水面。
<img src="disability_types.png" alt="Most user testing is done with blind and vision impaired people, and the least with Deaf users and people with Dyslexia" />
<img src="benefits_of_usertesting.png" alt="Graph outlining the benefits of user testing" aria-describedby="benefit_test" />
然后在 HTML 文件的更深处,我可以有一个段落提供更丰富的描述,以及一些注释:
<p id=“benefit_test”> From this research we can see that practitioners feel some of the main benefit of user testing with people with disabilities is discovering usability issues with the interface, navigation, structure, functionality and so on. User testing as an awareness raising exercise for developers in order to first hand experience the diverse needs of people with disabilities and therefore gaining a greater understanding of how things work from the users perspective, is also an outcome of the research"</p>
对于图 6-7 ,它着眼于用户测试的规模,更容易描述。
图 6-7。测试组规模
<img src="test_sizes"alt="The majority of test group sizes are between 8 12 users." />
<a><img src="buy_this_guitar.png" alt="Here is a nice graphic of a Gibson Guitar stylized with some creative Photoshop filters, and using a groovy font called Rosewood /></a>
不要。你只要说它的功能是什么——字面意思,“买这把吉他。”
<img src="buy_this_guitar.png"alt="Buy this Guitar" />
该插件是第三方解决方案。它不是浏览器自带的,而且是专有的。然而,它看起来并没有消失。HTML5 并不是进入游戏领域的唯一技术;Adobe 已经有了通过虚幻引擎(UE3)开发 Flash 的计划。现在,您可以在 Flash 环境中玩丰富的 3D 游戏。因此,焦点肯定会从视频平台转移到丰富的沉浸式游戏平台。
Flash 中的可访问性问题
如果您使用的是较新的屏幕阅读器,只需开发人员稍加努力,许多 Flash(尤其是 Flex 内容)都是可以访问的。然而,从可访问性的角度来看,Flash 存在一些实际问题(这可能是因为它不是“浏览器固有的”技术)。最明显的问题是无法使用键盘轻松地切换到 Flash 视频内容,还有一个相当反常的问题是无法切换出来(即使您设法进入了)。具有讽刺意味的是,这在 Internet Explorer 中并不是一个问题,但它确实会影响大多数其他浏览器。解决方法很复杂,因为您必须使用脚本来阻止用户返回。
这个例子的 JavaScript 代码(实际上同时使用了 a #和 tabindexed <div>)非常简单,但是当它最终工作起来的时候,一切看起来都很简单!
看看你是否能弄清楚清单 6-11 中发生了什么。
清单 6-11。添加播放、停止、静音、前进和后退功能的代码
`window.onload=function(){
var video = document.getElementById('access_video');
var play = document.getElementById('play');
var stop = document.getElementById('stop');
var mute = document.getElementById('mute');
var forward = document.getElementById('forward');
var back = document.getElementById('back');
// Script needed to attach the onclick events with the functional buttons.
// Remember even though the event is called onclick it still works from the
// keyboard.
一个字体生成器和一个可能的 sIFR 替代品。在[cufon.shoqolate.com/generate/](http://cufon.shoqolate.com/generate/)可用。Roger Johannes 在[www.456bereastreet.com/archive/200905/cufon_and_screen_readers/](http://www.456bereastreet.com/archive/200905/cufon_and_screen_readers/)撰写了关于 Cufón 和屏幕阅读器的文章。
有一个很好的列表,列出了使用<canvas>开发的游戏、小工具等等,可以从[www.w3.org/html/wg/wiki/AddedElementCanvas](http://www.w3.org/html/wg/wiki/AddedElementCanvas)获得。在这里你还可以找到很多关于<canvas>的讨论链接,以及当试图让这个绘图 API 更容易使用时所面临的挑战。
注一个屏幕阅读器是一个线性输出设备。这意味着它一次向用户输出一部分信息。对于一个没有视力的用户来说,如果他对 HTML 内容有一个完形的看法,你需要使用适当的代码来帮助他。这通常是通过编写内容的文本概述并以编程方式将其与表格相关联来实现的,以便当表格获得焦点时会显示出来。在这一章的后面我会详细说明如何做到这一点。
An overview of upcoming animal sanctuary workshops in 2012
`
使用表格的<caption>元素或标题有助于帮助屏幕阅读器理解表格是什么。如果你考虑一个有五个或六个(甚至更多)数据表的网页,以这种方式添加<caption>真的很有用。一个有视力的人可以快速浏览网页,并找出所有这些表格是什么。如前所述,屏幕阅读器用户可以通过选择各种 HTML 元素——如标题和链接——使用 AT 来浏览网页。他们可以使用页面上的任何<table>元素做同样的事情。例如,在 JAWS 中按下 T 键会导致 AT 将用户从第一个表跳到最后一个表(然后再跳回来)。如果每个表格上没有合适的<caption>,屏幕阅读器只是宣布“table”、“table”,并让用户知道表格有多少行、列等等,但它不能告诉用户表格是做什么用的。添加<caption>填补了空白。带有合适的<caption>的数据表宣布焦点上的内容。因此,如果我建议的包含六个表的页面上的所有表都有<caption>元素,屏幕阅读器用户可以很容易地找到她要找的东西——因为当每个表获得焦点时,<caption>元素的内容就会被公布。整洁!
我们要看的第一种方法稍微费时一些,但我认为它更可靠。我们将在表格 HTML 的header和ID元素之间创建关联。这是一种将数据单元格的内容与其相应的标题相关联的方式。这样做将导致屏幕阅读器在向用户宣布单元格的内容之前宣布数据单元格在的哪一列。
要创建标题/ID 关联,首先要处理标题,然后处理表体。
从给每个标题一个唯一的 ID 开始;给标题一个与内容相同的 ID 是完全可以的。关于我的动物保护区即将举办的研讨会,我的标题标识如下:
Header #1 = "课程"
标题#2 = "开始"
标题#3 = "结束"
标题#4 = "成本"
Header #5 = "Extras "
在 HTML 代码中,标题如下所示:
`Course
Start Date
End Date
Cost`
Additional content included in 它可以是以下内容或类似内容:
`Course
Start Date
End Date
Cost
Included Extras`
如果您对任何命名约定感到满意,您当然可以使用它。关键是标题 id 是唯一的,因为它们用于创建与表数据的编程关联(正如您将看到的)。对我来说,他们有关系似乎更自然,但这并不重要。现在您已经有了合适的标题 id,接下来您可以将表体中每一行的单元格内容映射到一个合适的标题,如清单 7-1 所示。
清单 7-1 。映射单元格内容
`Course
Start Date
End Date
Cost
Included Extras
How do you start an Animal Sanctuary
June 10
June 16
650 Euros
includes lunches, one dinner and extensive materials.
Working with Dogs: A beginners workshop
April 12
April 16
300 Euros
includes lunches, and materials.
[…]`
使用标题/ID 组合的最终可访问表
通过查看清单 7-1 中的例子,你能看出标题和数据单元内容之间的关联是如何建立的吗?
图 7-1 是决赛桌的屏幕截图。
图 7-1 。可访问数据表示例
清单 7-2 显示了最终完全编码的样本(也有合适的<caption>元素)。
清单 7-2 。可访问表方法 1 的最终表代码
`
Animal Sanctuary workshops
An overview of upcoming Animal Sanctuary workshops in 2012
Course
Start Date
End Date
Cost
Included Extras
How do you start an Animal Sanctuary
June 10
June 16
650 Euros
includes lunches, one dinner and extensive materials.
Working with Dogs: A beginners workshop
April 12
April 16
300 Euros
includes lunches, and materials.
Massage for You & Your Animals
September 29
October 4
400 Euros. A Half day session is 220 Euros.
includes lunch, and book.
Yoga with Animals
May 18
May 21
300 Euros
includes lunch, dinner and book.
A Creative Artistic workshop and Retreat
June 18
June 23
500 Euros
includes lunch, dinner and art supplies.
Why Compassion for Animals matter: Philosophy and Animals
应该构建复杂的表吗?当然,你可以为跨越多列或多行的数据单元格设置标题,但是你真的需要确保在更复杂的表格中嵌入标题(见图 7-5 )并使用适当的 id 在这些标题和数据单元格之间创建编程关联。
尽管随着技术的进步,有更高级的 HTML 标记方法承诺更容易创作或只是“更好”,但在实践中,这里概述的简单方法是您应该坚持的。对于更复杂的表——使用@scope 是最理想的——记住它仍然没有得到很好的支持。因此,即使一个标记方法可能是“好的”(从纯编码的角度来看),并且在语义上有意义,你仍然必须小心,并且测试,测试,测试。困难在于 at 供应商需要赶上作者正在做的事情和规范建议的事情。其实@scope里没什么新东西。它已经存在很多年了。
注意关于新的 HTML5 表格语法,我必须承认最初我对它有着复杂的感情。然而,当我编写前面的例子时,我发现更简洁的语法首先更容易编写,然后当我检查代码时也很好。我喜欢它在网格中思考的方式。您可以在您选择的编辑器中布置代码,就像您可视化地布置数据表中的表格单元格一样。当然,您也可以用 HTML 4 做到这一点,但是新的语法要简单得多,并且使得可视化解析代码变得更加容易。虽然一开始不太情愿,但发现自己惊喜万分。
In the next table the number of animals we have in care are given in the first column,
Number in Care, the animal type is in the second column, Animal Type, and the third column
shows the number that are available currently.
The number of animals in care that we have and that are available for immediate re-
housing.
虽然在表的正上方有一个详细的描述是一个好主意(如果需要,屏幕阅读器的用户将能够更容易地发现它,因为它非常接近表),但它仍然有缺陷。这是因为在代码中没有显式的编程关联。正如您现在所知道的,屏幕阅读器用户可以使用他们的 AT 浏览 web 内容,所以显式关联非常有帮助,因为一旦表获得焦点,它就会被宣布。清单 7-6 中的会发生这种情况。
In the next table the number of animals we have in care are given in the first
column, Number in Care, the animal type is in the second column, Animal Type, and the third
column shows the number that are available currently.
Table outlining the number of animals we have in care are given in the first column,
Number in Care, the animal type is in the second column, Animal Type, and the third column
shows the number that are available currently.
The number of animals in care that we have and that are available for immediate
re-housing.
the number of animals we have in care are given in the first column, Number in Care, the
animal type is in the second column, Animal Type, and the third column shows the number that
are available currently.
The number of animals in care that we have and that are available for immediate re-
housing.Help
the number of animals we have in care are given in the first column, Number in Care, the
animal type is in the second column, Animal Type, and the third column shows the number that
are available currently.
注意你在 HTML5 中遇到的很多东西都是从 Web 超文本应用技术工作组(WHATWG)的 Web Forms 2.0 规范移植过来的。这个想法是 Web Forms 2.0 是 HTML 4 中表单特性的扩展。Web Forms 2.0 提供了新的输入字段、用于定义约束的属性、用于声明性重复表单部分的重复模型、新的 DOM 接口以及用于验证和依赖项跟踪的 DOM 事件。Web Forms 2.0 也是记录现有实践的一种尝试。如果你喜欢一些书呆子火车定位,把你的浏览器指向[www.whatwg.org/specs/web-forms/current-work](http://www.whatwg.org/specs/web-forms/current-work)。
HTML 4 中的<fieldset>和<legend>元素背后的想法是它们给你的表单更多的结构。< fieldset>元素用于按主题对表单控件进行分组,<legend>就像是<legend>元素的父元素<fieldset>的内容标题。有点拗口!如果你还记得,我们已经在第三章的中看到了这些元素的使用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?