角材料垫标签可访问性

pen*_*ngz 6 accessibility wai-aria angular

我有一个带有文本输入控件的 mat-form-field。我有一个 mat-label 并且我还attr.aria-label直接在 input 元素上放置了一个 aria-label 属性。

mat-label足以本身屏幕阅读器?是attr.aria-label必要的还是多余的?

<mat-form-field appearance="outline" floatLabel="always">
<mat-label>Username</mat-label>
<input attr.aria-label="Username" formControlName="Username" matInput>
</mat-form-field>
Run Code Online (Sandbox Code Playgroud)

同样的问题也适用于 mat-select 控件。

<mat-form-field appearance="outline" floatLabel="always">
  <mat-label>Cars</mat-label>
  <mat-select formControlName="Car">
    <mat-option *ngFor="let car of cars" [value]="car.name">
    {{car.name}}
    </mat-option>
  </mat-select>
</mat-form-field>
Run Code Online (Sandbox Code Playgroud)

Sim*_*ver 8

关于[attr.aria-label]和之间区别的重要说明[aria-label]

对于按钮,您可以aria-label像这样设置动态:

 <button [attr.aria-label]="'This is a button for ' + buttonDescription">Click me</button>
Run Code Online (Sandbox Code Playgroud)

这不适用于所有材质控件,因为有些定义了一个@Input('aria-label')属性,该属性在内部设置属性(通过@Hostbinding)

mat-select 就是这样一种控制

源代码:

@Input('aria-label')
ariaLabel: string
Run Code Online (Sandbox Code Playgroud)

因此,如果您确实尝试使用它的[attr.]语法mat-select将不起作用,因为控件实际上会覆盖您显式设置的属性(因为ariaLabel输入属性mat-select永远不会被设置!)。

<mat-select [attr.aria-label]="'This will be overwritten with undefined!'">...</mat-select>
Run Code Online (Sandbox Code Playgroud)

相反,您必须只使用aria-label输入属性。

 <mat-select [aria-label]="'Choose your own adventure! ' + 123">...</mat-select>

 <mat-select aria-label="{{ 'Choose your own adventure - ' + 123 }}">...</mat-select>

 <mat-select aria-label="Choose your own adventure 123">...</mat-select>
Run Code Online (Sandbox Code Playgroud)

构建会告诉您是否[aria-label]在应该使用的时候使用[attr.aria-label](因为编译器会告诉您没有这样的输入属性)。因此,如果您不想为正在使用的控件寻找 API,请从[aria-label].

https://material.angular.io/components/select/api