具代表性的面試主題

前端面試:如何依 WCAG 2.2 設計可見焦點指示器?

前端中等
Offer.cc 編輯團隊發佈 更新

題幹

一個 SaaS 應用的設計系統要統一按鈕、輸入框、選單和自訂控制項的 focus 樣式。請根據 WCAG 2.2 Focus Appearance 設計方案,說明面積、對比、相鄰顏色、元件邊界變化、鍵盤驗證及高對比模式相容性。

題幹與適用場景

設計系統要統一按鈕、輸入框、選單與自訂控制項的鍵盤焦點樣式。現有實作只改變邊框顏色,低對比主題幾乎不可見,focus 時改變尺寸又造成布局跳動。 請依 WCAG 2.2 Focus Appearance 設計可複用方案並建立驗收門禁。

WCAG 2.2 新增 Focus Appearance 成功標準,要求焦點指示器有足夠面積並與相鄰顏色保持對比。題目考察如何落到元件狀態、CSS、色彩 token、鍵盤路徑和測試。

面試官考察點

區分焦點指示器和元件本身、計算面積與對比、避免只用顏色、處理圓角和非矩形控制項、避免位移、保留原生語義,並覆蓋 :focus-visible、高對比和不同輸入方式。

回答前需要澄清的問題

  • 目標是 AA 還是 AAA,哪些流程可由鍵盤操作?
  • 焦點環在元件外、內,還是使用 outline-offset
  • 主題 token 與 forced-colors 模式如何提供?
  • 自訂控制項是否具備正確原生語義與 ARIA 狀態?
  • focus、hover、selected、error 疊加時如何保持可辨識?
  • 如何測試非矩形、滾動容器和深色背景?

30 秒回答框架

「先確認標準等級與可操作元素,為每個 focus-visible 狀態提供不依賴顏色的焦點環。使用不佔布局的 outline 或 pseudo-element,用 token 保持與元件和相鄰背景對比;forced-colors 保留系統顏色。用完整鍵盤路徑、截圖像素與人工放大驗證。」

分步驟深入解答

第一步:明確焦點目標與狀態模型

優先使用原生 button、input、select 與連結;自訂 div 只有必要時才補鍵盤處理、role、名稱和值。focus-visible 可區分指標和鍵盤,但不能讓鍵盤焦點消失。 定義 default、hover、focus-visible、selected、invalid、disabled 的優先順序,確保焦點環在錯誤或選取時仍可見。

第二步:選擇不改變布局的繪製方式

不要增加 border 寬度製造焦點,避免盒尺寸改變。優先 outline、offset 或 pseudo-element;複雜形狀用內外陰影但要檢查 overflow 裁切。

css
.control:focus-visible {
  outline: 3px solid var(--focus-ring);
  outline-offset: 2px;
}

圓角、圖示按鈕和 slider 要按實際幾何評估,不可只畫被裁切的一條矩形線。

第三步:把 WCAG 2.4.13 轉成 token 與閾值

為環寬、偏移、焦點色、背景色和 error 狀態建立 token。驗證指示器和未聚焦元件、鄰接背景的對比,不只比較文字。漸層、圖片和半透明層需採最不利背景採樣。

text
focus-ring-width >= 2 CSS px
focus-ring-contrast-against-adjacent >= required threshold
focus-ring-area >= minimum perimeter-area rule

面積與對比應依實際渲染像素和元件幾何驗證,不能以設計稿色值代替。

第四步:處理主題、forced-colors 與系統覆蓋

深色、淺色和品牌主題各有焦點 token。forced-colors: active 時不要覆蓋系統焦點色,可使用 ButtonText 等系統色保持可見。

css
@media (forced-colors: active) {
  .control:focus-visible {
    outline: 2px solid ButtonText;
    outline-offset: 2px;
  }
}

不要用 outline: none 清除瀏覽器焦點,除非同一狀態提供等價或更清晰指示器。

第五步:覆蓋動態元件與滾動場景

選單、對話框、combobox 和虛擬列表要驗證焦點移動、關閉回到觸發元素、滾動不遮焦點環。transform、clip-path 和 overflow 不應把環裁掉。 使用 aria-activedescendant 時,視覺指示器要跟隨活動項,並與讀屏和鍵盤一致。

第六步:建立自動化和人工驗收

自動化檢查可聚焦元素、計算後 outline/box-shadow、主題 token 和 forced-colors 規則;截圖覆蓋狀態與背景。人工用 Tab、Shift+Tab、Enter、Space、方向鍵、Escape, 放大 200% 並開啟高對比模式複驗。

記錄元件、狀態、背景、環幾何、對比結果、鍵盤步驟和截圖。設計稿看到一條藍線不能證明符合標準。

高品質示範回答

「我先盤點可操作元素並優先原生控制項;對 focus-visible 用不佔布局的 outline 與 offset,token 統一環寬、顏色和背景對比。focus 不增加 border,也不只依賴顏色。深淺主題與 forced-colors 分開驗收並保留系統可見性。」

「選單、對話框、虛擬列表和非矩形控制項要測焦點移動、回焦與裁切。自動化取計算樣式與截圖,人工用鍵盤、200% 縮放和高對比模式驗證。」

常見錯誤

  • 只改文字或邊框顏色 → 焦點環可能融入背景 → 分別驗證環與相鄰顏色。
  • 增加 border 寬度 → 布局跳動 → 使用 outline 或不佔布局元素。
  • 強制 outline: none 鍵盤失去回饋 → 提供等價可見指示器。
  • 只測淺色主題 → 深色或 forced-colors 不可見 → 覆蓋主題模式。
  • 只測矩形截圖 → 圓角和裁切漏測 → 測實際幾何與滾動。
  • 焦點放在 div → 語義與讀屏不一致 → 優先原生控制項。

追問及應對

追問一:outline 和 box-shadow 哪個較好?

沒有唯一答案。outline 不佔布局且有系統語義,box-shadow 可做多層環;依裁切、圓角、forced-colors 與像素結果選擇。

追問二:為何 :focus-visible 不能取代 :focus

它是瀏覽器顯示焦點的啟發式,不能消除焦點語義。鍵盤和輔助技術路徑仍需清晰指示器。

追問三:已有 error 紅框還需要焦點環嗎?

需要。錯誤狀態與目前操作目標不同,兩者都要可見且不只依賴顏色。

追問四:圖片或漸層背景如何測對比?

在環實際像素覆蓋的鄰近區域取最不利顏色,必要時加不透明底層或雙層環;平均色值不足以證明合規。

追問五:如何避免 focus ring 被 overflow 裁切?

檢查祖先 overflow、clip-path、transform;用內環、padding 或 pseudo-element 調整幾何,不能關閉焦點樣式。

公開來源

同類題目