2019-06-04 08:05:25 -07:00
# Accessibility in Angular
2021-04-04 10:45:50 -04:00
# Angular 中的无障碍功能
2019-06-04 08:05:25 -07:00
The web is used by a wide variety of people, including those who have visual or motor impairments.
A variety of assistive technologies are available that make it much easier for these groups to
interact with web-based software applications.
In addition, designing an application to be more accessible generally improves the user experience for all users.
2021-04-04 10:45:50 -04:00
Web 会被各种各样的人使用,包括有视觉或运动障碍的人。有多种辅助技术能使这些人更轻松地和基于 Web 的软件应用进行交互。另外,将应用设计得更易于访问通常也能改善所有用户的体验。
2019-06-04 08:05:25 -07:00
For an in-depth introduction to issues and techniques for designing accessible applications, see the [Accessibility ](https://developers.google.com/web/fundamentals/accessibility/#what_is_accessibility ) section of the Google's [Web Fundamentals ](https://developers.google.com/web/fundamentals/ ).
2021-04-04 10:45:50 -04:00
关于如何设计无障碍应用的问题和技术的深入介绍,请参阅 Google [网络基础知识 ](https://developers.google.com/web/fundamentals/ )的[无障碍功能 ](https://developers.google.com/web/fundamentals/accessibility/#what_is_accessibility )部分。
2019-06-04 08:05:25 -07:00
This page discusses best practices for designing Angular applications that
work well for all users, including those who rely on assistive technologies.
2021-04-04 10:45:50 -04:00
本页讨论了设计 Angular 应用的最佳实践,这些实践对所有用户(包括依赖辅助技术的用户)都适用。
2020-04-10 21:23:48 +05:30
< div class = "alert is-helpful" >
For the sample app that this page describes, see the < live-example > < / live-example > .
2021-04-04 10:45:50 -04:00
本页所描述的范例程序,参阅< live-example > < / live-example > 。
2020-04-10 21:23:48 +05:30
< / div >
2020-01-11 18:10:12 +08:00
2019-06-04 08:05:25 -07:00
## Accessibility attributes
2021-04-04 10:45:50 -04:00
## 无障碍属性( Attribute)
2019-06-04 08:05:25 -07:00
Building accessible web experience often involves setting [ARIA attributes ](https://developers.google.com/web/fundamentals/accessibility/semantics-aria )
to provide semantic meaning where it might otherwise be missing.
2020-04-28 16:26:58 -04:00
Use [attribute binding ](guide/attribute-binding ) template syntax to control the values of accessibility-related attributes.
2019-06-04 08:05:25 -07:00
2021-04-04 10:45:50 -04:00
建立无障碍的 Web 体验通常会涉及设置 [ARIA 属性( Attribute) ](https://developers.google.com/web/fundamentals/accessibility/semantics-aria ) 以提供可能会丢失的语义。使用 [Attribute 绑定](guide/attribute-binding模板语法来控制与无障碍性相关的属性( Attribute) 值。
2019-06-04 08:05:25 -07:00
When binding to ARIA attributes in Angular, you must use the `attr.` prefix, as the ARIA
2020-04-22 17:03:13 -04:00
specification depends specifically on HTML attributes rather than properties of DOM elements.
2019-06-04 08:05:25 -07:00
2021-04-04 10:45:50 -04:00
在 Angular 中绑定 ARIA 属性( Attribute) 时, 必须使用 `attr.` 前缀,因为 ARIA 规范针对的是 HTML 属性( Attribute) , 而不是 DOM 元素的属性( Property) 。
2019-06-04 08:05:25 -07:00
```html
<!-- Use attr. when binding to an ARIA attribute -->
< button [ attr . aria-label ] = " myActionLabel " > ...< / button >
```
Note that this syntax is only necessary for attribute _bindings_ .
Static ARIA attributes require no extra syntax.
2021-04-04 10:45:50 -04:00
注意, 此语法仅对于属性( Attribute) *绑定*是必需的。静态 ARIA 属性( Attribute) 不需要额外的语法。
2019-06-04 08:05:25 -07:00
```html
<!-- Static ARIA attributes require no extra syntax -->
< button aria-label = "Save document" > ...< / button >
```
2021-04-04 10:45:50 -04:00
NOTE:
注意:
2019-06-04 08:05:25 -07:00
< div class = "alert is-helpful" >
By convention, HTML attributes use lowercase names (`tabindex` ), while properties use camelCase names (`tabIndex` ).
2021-04-04 10:45:50 -04:00
按照约定, HTML 属性( Attribute) 使用小写名称( `tabindex` ),而 Property 使用 camelCase 名称( `tabIndex` )。
2020-04-28 16:26:58 -04:00
See the [Binding syntax ](guide/binding-syntax#html-attribute-vs-dom-property ) guide for more background on the difference between attributes and properties.
2019-06-04 08:05:25 -07:00
2021-04-04 10:45:50 -04:00
关于 Attribute 和 Property 之间差异的更多背景信息,请参阅[模板语法](guide/html-attribute-vs-dom-property一章。
2019-06-04 08:05:25 -07:00
2021-04-04 10:45:50 -04:00
< / div >
2019-06-04 08:05:25 -07:00
2021-04-03 09:52:53 -04:00
## Angular UI components
2020-01-11 18:10:12 +08:00
2021-04-04 10:45:50 -04:00
## Angular UI 组件
2019-06-04 08:05:25 -07:00
The [Angular Material ](https://material.angular.io/ ) library, which is maintained by the Angular team, is a suite of reusable UI components that aims to be fully accessible.
The [Component Development Kit (CDK) ](https://material.angular.io/cdk/categories ) includes the `a11y` package that provides tools to support various areas of accessibility.
For example:
2021-04-04 10:45:50 -04:00
由 Angular 团队维护的 [Angular Material ](https://material.angular.io/ ) 库是旨在提供完全无障碍的一组可复用 UI 组件。[组件开发工具包( CDK) ](https://material.angular.io/cdk/categories )中包括 `a11y` 软件包,该软件包提供了支持无障碍领域的各种工具。例如:
2019-06-04 08:05:25 -07:00
* `LiveAnnouncer` is used to announce messages for screen-reader users using an `aria-live` region. See the W3C documentation for more information on [aria-live regions ](https://www.w3.org/WAI/PF/aria-1.1/states_and_properties#aria-live ).
2021-04-04 10:45:50 -04:00
`LiveAnnouncer` 用于使用 `aria-live` 区域向屏幕阅读器用户朗读消息。关于 [aria-live 领域的 ](https://www.w3.org/WAI/PF/aria-1.1/states_and_properties#aria-live )更多信息,请参阅 W3C 文档。
2019-06-04 08:05:25 -07:00
* The `cdkTrapFocus` directive traps Tab-key focus within an element. Use it to create accessible experience for components like modal dialogs, where focus must be constrained.
2021-04-04 10:45:50 -04:00
`cdkTrapFocus` 指令能将 Tab 键焦点捕获在元素内。使用它可为必须限制焦点的模态对话框之类的组件创建无障碍体验。
2019-06-04 08:05:25 -07:00
For full details of these and other tools, see the [Angular CDK accessibility overview ](https://material.angular.io/cdk/a11y/overview ).
2021-04-04 10:45:50 -04:00
关于这些工具和其它工具的完整详细信息,请参阅 [Angular CDK 无障碍功能概述 ](https://material.angular.io/cdk/a11y/overview )。
2019-06-04 08:05:25 -07:00
### Augmenting native elements
2021-04-04 10:45:50 -04:00
### 增强原生元素
2019-06-04 08:05:25 -07:00
Native HTML elements capture a number of standard interaction patterns that are important to accessibility.
When authoring Angular components, you should re-use these native elements directly when possible, rather than re-implementing well-supported behaviors.
2021-04-04 10:45:50 -04:00
原生 HTML 元素捕获了许多对无障碍性很重要的标准交互模式。在制作 Angular 组件时,应尽可能直接复用这些原生元素,而不是重新实现已获良好支持的行为。
2019-06-04 08:05:25 -07:00
For example, instead of creating a custom element for a new variety of button, you can create a component that uses an attribute selector with a native `<button>` element.
This most commonly applies to `<button>` and `<a>` , but can be used with many other types of element.
2021-04-04 10:45:50 -04:00
例如, 你可以创建一个组件, 它使用属性( Attribute) 选择器指向原生 `<button>` 元素,而不是为各种新按钮创建自定义元素。通常这适用于 `<button>` 和 `<a>` ,但也可以用于许多其它类型的元素。
2020-10-02 12:35:47 +02:00
You can see examples of this pattern in Angular Material: [`MatButton` ](https://github.com/angular/components/blob/50d3f29b6dc717b512dbd0234ce76f4ab7e9762a/src/material/button/button.ts#L67-L69 ), [`MatTabNav` ](https://github.com/angular/components/blob/50d3f29b6dc717b512dbd0234ce76f4ab7e9762a/src/material/tabs/tab-nav-bar/tab-nav-bar.ts#L139 ), [`MatTable` ](https://github.com/angular/components/blob/50d3f29b6dc717b512dbd0234ce76f4ab7e9762a/src/material/table/table.ts#L22 ).
2019-06-04 08:05:25 -07:00
2021-04-04 10:45:50 -04:00
你可以在 Angular Material 中看到此模式的范例:[`MatButton` ](https://github.com/angular/components/blob/master/src/material/button/button.ts#L66-L68 ), [`MatTabNav` ](https://github.com/angular/components/blob/master/src/material/tabs/tab-nav-bar/tab-nav-bar.ts#L67 ), [`MatTable` ](https://github.com/angular/components/blob/master/src/material/table/table.ts#L17 )。
2019-06-04 08:05:25 -07:00
### Using containers for native elements
2021-04-04 10:45:50 -04:00
### 将容器用于原生元素
2019-06-04 08:05:25 -07:00
Sometimes using the appropriate native element requires a container element.
For example, the native `<input>` element cannot have children, so any custom text entry components need
to wrap an `<input>` with additional elements.
While you might just include the `<input>` in your custom component's template,
this makes it impossible for users of the component to set arbitrary properties and attributes to the input element.
Instead, you can create a container component that uses content projection to include the native control in the
component's API.
2021-04-04 10:45:50 -04:00
有时要使用的原生元素需要一个容器元素。例如,原生 `<input>` 元素不能有子元素,因此任何自定义的文本输入组件都需要用其它元素来包装 `<input>` 。尽管你可能只在自定义组件的模板中包含 `<input>` ,但这将使该组件的用户无法为 `input` 元素设置任意 Property 和 Attribute。相反, 你可以创建一个使用内容投影的容器组件, 以将原生控件包含在组件的 API 中。
2019-06-04 08:05:25 -07:00
You can see [`MatFormField` ](https://material.angular.io/components/form-field/overview ) as an example of this pattern.
2021-04-04 10:45:50 -04:00
你可以把 [`MatFormField` ](https://material.angular.io/components/form-field/overview ) 作为该模式的例子。
2019-06-04 08:05:25 -07:00
## Case study: Building a custom progress bar
2021-04-04 10:45:50 -04:00
## 案例研究:构建自定义进度条
2019-06-04 08:05:25 -07:00
The following example shows how to make a simple progress bar accessible by using host binding to control accessibility-related attributes.
2021-04-04 10:45:50 -04:00
以下范例显示如何通过使用宿主( host) 绑定来控制与无障碍性相关的属性( Attribute) , 来把简单的进度条无障碍化。
2019-06-04 08:05:25 -07:00
* The component defines an accessibility-enabled element with both the standard HTML attribute `role` , and ARIA attributes. The ARIA attribute `aria-valuenow` is bound to the user's input.
2021-04-04 10:45:50 -04:00
该组件使用标准的 HTML 属性( Attribute) `role` 和 ARIA 属性( Attribute) 来定义要启用无障碍支持的元素。ARIA 属性( Attribute) `aria-valuenow` 绑定到用户的输入。
2019-08-27 15:17:04 -04:00
2021-04-04 10:45:50 -04:00
< code-example path = "accessibility/src/app/progress-bar.component.ts" header = "src/app/progress-bar.component.ts" region = "progressbar-component" > < / code-example >
2019-06-04 08:05:25 -07:00
2021-04-03 09:52:53 -04:00
* In the template, the `aria-label` attribute ensures that the control is accessible to screen readers.
2020-01-11 18:10:12 +08:00
2021-04-04 10:45:50 -04:00
在模板中,`aria-label` 属性( Attribute) 可以确保屏幕阅读器能访问该控件。
2019-06-04 08:05:25 -07:00
2021-04-04 10:45:50 -04:00
< code-example path = "accessibility/src/app/app.component.html" header = "src/app/app.component.html" region = "template" > < / code-example >
2019-06-04 08:05:25 -07:00
2021-04-03 09:52:53 -04:00
## Routing and focus management
2020-01-11 18:10:12 +08:00
2021-04-04 10:45:50 -04:00
## 路由和焦点管理
2019-06-04 08:05:25 -07:00
Tracking and controlling [focus ](https://developers.google.com/web/fundamentals/accessibility/focus/ ) in a UI is an important consideration in designing for accessibility.
When using Angular routing, you should decide where page focus goes upon navigation.
2021-04-04 10:45:50 -04:00
在设计无障碍性时,在 UI 中跟踪和控制[焦点 ](https://developers.google.com/web/fundamentals/accessibility/focus/ )是很重要的考虑因素。使用 Angular 路由时,你需要确定页面焦点在导航上的位置。
2019-06-04 08:05:25 -07:00
To avoid relying solely on visual cues, you need to make sure your routing code updates focus after page navigation.
Use the `NavigationEnd` event from the `Router` service to know when to update
focus.
2021-04-04 10:45:50 -04:00
为了避免仅仅依靠视觉提示,你需要确保路由代码会在页面导航之后更新焦点。使用 `Router` 服务中的 `NavigationEnd` 事件可以知道何时该更新焦点。
2019-06-04 08:05:25 -07:00
The following example shows how to find and focus the main content header in the DOM after navigation.
2021-04-04 10:45:50 -04:00
以下范例显示了导航后如何在 DOM 中查找并把焦点移动到主体内容的头部。
2021-04-03 09:52:53 -04:00
2021-04-04 10:45:50 -04:00
```ts
2019-06-04 08:05:25 -07:00
router.events.pipe(filter(e => e instanceof NavigationEnd)).subscribe(() => {
const mainHeader = document.querySelector('#main -content-header')
if (mainHeader) {
mainHeader.focus();
}
});
2021-04-03 09:52:53 -04:00
```
2021-04-04 10:45:50 -04:00
2019-06-04 08:05:25 -07:00
In a real application, the element that receives focus will depend on your specific
application structure and layout.
The focused element should put users in a position to immediately move into the main content that has just been routed into view.
You should avoid situations where focus returns to the `body` element after a route change.
2021-04-04 10:45:50 -04:00
在实际的应用程序中,哪些元素获得焦点将取决于该应用特有的结构和布局。获得焦点的元素应使用户能够立即移动到刚刚进入视野的主要内容。你应该避免当路由变化后焦点重新回到 `body` 元素的情况。
2019-06-04 08:05:25 -07:00
## Additional resources
2021-04-04 10:45:50 -04:00
## 额外资源
2019-06-04 08:05:25 -07:00
* [Accessibility - Google Web Fundamentals ](https://developers.google.com/web/fundamentals/accessibility )
2021-04-04 10:45:50 -04:00
[无障碍功能 - Google 网络基础知识 ](https://developers.google.com/web/fundamentals/accessibility )
2019-06-04 08:05:25 -07:00
* [ARIA specification and authoring practices ](https://www.w3.org/TR/wai-aria/ )
2021-04-04 10:45:50 -04:00
[ARIA 规范和写作惯例 ](https://www.w3.org/TR/wai-aria/ )
2019-06-04 08:05:25 -07:00
* [Material Design - Accessibility ](https://material.io/design/usability/accessibility.html )
2021-04-04 10:45:50 -04:00
[Material Design - 无障碍功能 ](https://material.io/design/usability/accessibility.html )
2019-06-04 08:05:25 -07:00
* [Smashing Magazine ](https://www.smashingmagazine.com/search/?q=accessibility )
2021-04-04 10:45:50 -04:00
[Smashing 杂志 ](https://www.smashingmagazine.com/search/?q=accessibility )
2019-06-04 08:05:25 -07:00
* [Inclusive Components ](https://inclusive-components.design/ )
2021-04-04 10:45:50 -04:00
[包容性组件 ](https://inclusive-components.design/ )
2019-06-04 08:05:25 -07:00
* [Accessibility Resources and Code Examples ](https://dequeuniversity.com/resources/ )
2021-04-04 10:45:50 -04:00
[无障碍功能的资源和代码范例 ](https://dequeuniversity.com/resources/ )
2019-06-04 08:05:25 -07:00
* [W3C - Web Accessibility Initiative ](https://www.w3.org/WAI/people-use-web/ )
* [Rob Dodson A11ycasts ](https://www.youtube.com/watch?v=HtTyRajRuyY )
2021-04-04 10:45:50 -04:00
[Rob Dodson 的 A11y 播客 ](https://www.youtube.com/watch?v=HtTyRajRuyY )
2019-06-04 08:05:25 -07:00
* [Codelyzer ](http://codelyzer.com/rules/ ) provides linting rules that can help you make sure your code meets accessibility standards.
2021-04-04 10:45:50 -04:00
[Codelyzer ](http://codelyzer.com/rules/ )提供了一些 lint 规则,可以帮助你确保代码符合无障碍性标准。
2019-06-04 08:05:25 -07:00
Books
2021-04-04 10:45:50 -04:00
图书
2019-06-04 08:05:25 -07:00
* "A Web for Everyone: Designing Accessible User Experiences", Sarah Horton and Whitney Quesenbery
* "Inclusive Design Patterns", Heydon Pickering
2019-07-23 10:51:54 -07:00
## More on accessibility
2021-04-04 10:45:50 -04:00
## 关于无障碍性的更多信息
2019-07-23 10:51:54 -07:00
You may also be interested in the following:
2021-04-04 10:45:50 -04:00
你可能也对以下内容感兴趣:
2019-07-23 10:51:54 -07:00
* [Audit your Angular app's accessibility with codelyzer ](https://web.dev/accessible-angular-with-codelyzer/ ).
2021-04-04 10:45:50 -04:00
[使用 codelyzer 审核 Angular 应用程序的无障碍性 ](https://web.dev/accessible-angular-with-codelyzer/ )。