Angular Accessibility (a11y): สร้าง App ที่ทุกคนใช้ได้

#angular12 เม.ย. 2569

Accessibility คืออะไร

Accessibility (a11y) คือการทำให้ app ใช้งานได้สำหรับทุกคน รวมถึงผู้พิการ เช่น ผู้ที่ใช้ screen reader หรือ keyboard navigation

ARIA Attributes

<!-- Button ที่มีความหมายชัดเจน -->
<button aria-label="ปิดหน้าต่าง" (click)="close()">
  <mat-icon>close</mat-icon>
</button>

<!-- Loading state -->
<div role="status" aria-live="polite">
  @if (loading()) {
    <span>กำลังโหลด...</span>
  }
</div>

<!-- Form error -->
<input
  [attr.aria-invalid]="form.get('email')?.invalid"
  [attr.aria-describedby]="'email-error'"
/>
<span id="email-error" role="alert">
  @if (form.get('email')?.hasError('required')) {
    กรุณากรอก email
  }
</span>

Focus Management

import { FocusTrap, FocusTrapFactory } from '@angular/cdk/a11y';

@Component({ ... })
export class DialogComponent implements AfterViewInit, OnDestroy {
  @ViewChild('dialogContent') dialogContent!: ElementRef;
  private focusTrap?: FocusTrap;

  constructor(private focusTrapFactory: FocusTrapFactory) {}

  ngAfterViewInit() {
    // กักดัก focus ไว้ใน dialog
    this.focusTrap = this.focusTrapFactory.create(this.dialogContent.nativeElement);
    this.focusTrap.focusInitialElement();
  }

  ngOnDestroy() {
    this.focusTrap?.destroy();
  }
}

Keyboard Navigation

@Component({
  template: `
    <ul role="listbox">
      @for (item of items; track item.id) {
        <li
          role="option"
          tabindex="0"
          [attr.aria-selected]="selectedId() === item.id"
          (click)="select(item)"
          (keydown.enter)="select(item)"
          (keydown.space)="select(item)"
        >
          {{ item.name }}
        </li>
      }
    </ul>
  `
})

Color Contrast

/* ✅ contrast ratio >= 4.5:1 สำหรับ normal text */
.text { color: #1a1a1a; background: #ffffff; }

/* ❌ contrast ต่ำเกินไป */
.text { color: #aaaaaa; background: #ffffff; }

ทดสอบ Accessibility

npm install -D @axe-core/angular
import { axe } from '@axe-core/angular';
// ใช้ใน development เท่านั้น

สรุป

การทำ accessibility ไม่ยากอย่างที่คิด เริ่มจาก semantic HTML, ARIA labels และ keyboard navigation ก็ช่วยได้มากแล้วครับ