喂!我是 Wei

Front-End Engineer

Be a Problem Solver.

⌘K

導覽

所有文章緣起互動小功能

文章分類

目錄
先使用語意化 HTMLARIA 是什麼?鍵盤操作要檢查什麼?Modal 的 Focus Management表單 Label 和錯誤訊息圖片 alt 怎麼寫?顏色與動態效果怎麼測試 Accessibility?面試回答模板

相關文章

前端 CI/CD 與正式環境除錯:從 Pull Request 到事故排查

2026年6月24日

即時資料怎麼選?Polling、SSE、WebSocket 比較

2026年6月23日

前端系統設計:如何拆元件、資料流與大型專案架構?

2026年6月22日

最新文章
全部 →
前端 CI/CD 與正式環境除錯:從 Pull Request 到事故排查
2026-06-24
即時資料怎麼選?Polling、SSE、WebSocket 比較
2026-06-23
前端系統設計:如何拆元件、資料流與大型專案架構?
2026-06-22
無障礙不是加 ARIA:語意化 HTML、鍵盤操作與焦點管理
2026-06-21
CSS 與 RWD 面試整理:Flexbox、Grid、定位與層疊脈絡
2026-06-19
← 返回文章列表

無障礙不是加 ARIA:語意化 HTML、鍵盤操作與焦點管理

2026年6月21日·約 4 分鐘閱讀·
前端面試系列AccessibilityHTML

Accessibility 常縮寫成 a11y,代表讓不同能力、裝置與操作方式的使用者都能使用產品。

面試官可能會問:

  • 為什麼要用 button,不用 div 加 onClick?
  • ARIA 是什麼?
  • Modal 開啟後 focus 要去哪?
  • 圖片的 alt 怎麼寫?
  • 怎麼檢查頁面是否能用鍵盤操作?

先使用語意化 HTML

不好的按鈕:

<div onClick={handleSubmit}>送出</div>

它預設不能用 Tab 聚焦,也不會回應 Enter / Space,screen reader 也不知道它是按鈕。

正確做法:

<button type="button" onClick={handleSubmit}>
  送出
</button>

原生元素已經包含 keyboard、focus 和語意行為。能用原生 HTML,就不要先用 ARIA 模擬。


ARIA 是什麼?

ARIA 用來補充原生 HTML 無法完整表達的 role、state、property。

<button
  type="button"
  aria-expanded={isOpen}
  aria-controls="account-menu"
>
  帳號選單
</button>

ARIA 不會自動增加行為。加上 role="button" 不會自動支援鍵盤,也不會自動有 focus。

第一原則:No ARIA is better than bad ARIA。


鍵盤操作要檢查什麼?

只使用鍵盤測試:

  • Tab 能否依合理順序移動
  • Shift + Tab 能否反向移動
  • Button 能否用 Enter / Space 操作
  • Menu、Tabs、Dialog 是否符合常見鍵盤模式
  • Focus indicator 是否清楚可見
  • 是否有 keyboard trap

不要隨意設定正數 tabIndex,它會讓 focus order 難以維護。


Modal 的 Focus Management

Modal 開啟時通常要:

  1. 把 focus 移到 dialog 或第一個可操作元素
  2. Tab 不應跑到背景頁面
  3. Escape 可以關閉
  4. 關閉後把 focus 還給原本觸發按鈕
<div role="dialog" aria-modal="true" aria-labelledby="dialog-title">
  <h2 id="dialog-title">刪除確認</h2>
  <button type="button">取消</button>
  <button type="button">確認刪除</button>
</div>

實務上可優先使用成熟 dialog component,而不是自己從零處理所有 keyboard 與 screen reader 行為。


表單 Label 和錯誤訊息

<label htmlFor="email">Email</label>
<input
  id="email"
  type="email"
  aria-invalid={Boolean(error)}
  aria-describedby={error ? "email-error" : undefined}
/>
{error && <p id="email-error">請輸入有效 Email</p>}

Placeholder 不能取代 label,因為輸入後會消失,而且對可讀性與輔助技術都不夠穩定。


圖片 alt 怎麼寫?

  • 有資訊的圖片:描述它在上下文中的意義
  • 裝飾圖片:使用空 alt=""
  • 圖片按鈕:alt 應描述操作,不只是外觀
  • 圖表:提供等價文字或資料表

不要寫「圖片」或「一張圖片」,screen reader 已經知道它是 image。


顏色與動態效果

不要只靠顏色傳達狀態,例如錯誤除了紅色,也應有文字或 icon。

動態效果要尊重使用者偏好:

@media (prefers-reduced-motion: reduce) {
  * {
    scroll-behavior: auto;
    animation-duration: 0.01ms;
  }
}

怎麼測試 Accessibility?

我會分三層:

  1. ESLint / axe 等自動檢查
  2. 只用鍵盤走一次核心流程
  3. 用 VoiceOver 或 NVDA 做基本 screen reader 測試

自動工具抓不到所有問題,例如 focus order 合不合理、替代文字是否真的有意義,仍需要人工檢查。


面試回答模板

我會先用 semantic HTML,因為原生 button、input、label 已經有鍵盤和輔助技術需要的行為,ARIA 只用來補足語意。開發時會檢查 Tab order、focus indicator、modal focus trap、表單 label 和 error association,也會避免只靠顏色傳達狀態。驗證上除了 axe,也會實際用鍵盤和 screen reader 走核心流程。

分享:XLinkedIn
← 上一篇CSS 與 RWD 面試整理:Flexbox、Grid、定位與層疊脈絡
下一篇 →前端系統設計:如何拆元件、資料流與大型專案架構?