具代表性的面試主題

前端面試:如何評估 CSS if() 條件值函式?

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

題幹

元件需要根據主題、媒體條件和特性支援選擇樣式值。你會如何評估 CSS if(),避免把實驗語法直接用於關鍵布局?

題幹與適用場景

設計系統希望在 CSS 屬性值內根據 style、media 或 feature 條件選擇顏色、間距和布局值。請說明 if() 的求值規則、回退、支援檢測、無障礙影響和漸進增強策略,不要只展示一段 CSS。

面試官考察點

  • 是否理解 if() 是值級條件邏輯,按條件書寫順序返回第一個為真的值。
  • 是否能正確使用 else,並處理沒有匹配條件時的 guaranteed-invalid 結果。
  • 是否核對瀏覽器支援、@supports、伺服器渲染和關鍵布局回退。
  • 是否考慮主題切換、列印、減少動效和可存取性驗證。

回答前需要釐清的問題

  1. 條件來自媒體查詢、容器/樣式查詢還是特性查詢?多個條件衝突時誰優先?
  2. 目標屬性沒有有效值時,元件應使用什麼舊瀏覽器預設值?
  3. 這是裝飾性顏色,還是會影響尺寸、可讀性和互動命中區域的關鍵布局?
  4. 支援哪些瀏覽器和 WebView?是否已有建置時 CSS 降級鏈路?

30 秒回答框架

我會先把 if() 限制在可安全降級的屬性,再定義條件順序和 else 值。它在屬性值內依次評估條件,首個為真就返回對應值;無匹配且無 else 時可能產生無效值,屬性會回退。上線前用 @supports 或建置降級提供靜態預設值,驗證主題、列印、對比度、減少動效和舊瀏覽器渲染,關鍵布局不依賴實驗語法。

分步驟深入解答

1. 劃定值級條件邊界

if() 適合讓同一屬性在多個條件下選擇值,不能取代選擇器樹、DOM 狀態機或業務邏輯。先確認條件可在 CSS 中觀察,避免把需要 JavaScript 資料的判斷硬塞進樣式。

2. 設計順序與回退

條件按出現順序求值,先寫最具體或最重要的規則,最後用 else 給出安全值。若沒有條件命中,結果可能是 guaranteed-invalid,瀏覽器會按屬性繼承或初始值處理,因此必須明確設計舊環境預設值。

3. 漸進增強與相容

MDN 將該函式標為有限支援的實驗技術。為關鍵屬性先提供靜態宣告,再在 @supports 或分層樣式中啟用 if();不要把使用者代理字串當作唯一檢測。伺服器渲染只輸出結構,樣式能力由客戶端驗證。

4. 驗證體驗與可存取性

用真實主題、視窗、列印和特性支援組合測試,檢查文字對比度、焦點可見性、命中區域和 prefers-reduced-motion。記錄不支援率和回退命中率,發現關鍵布局漂移就關閉增強層。

高品質示範回答

我會把 if() 當作值級漸進增強。先確定條件屬於 style、media 或 feature 查詢,再按優先順序書寫條件並提供明確 else 安全值;沒有匹配條件時的無效值不能依賴瀏覽器猜測。關鍵布局先有靜態預設宣告,在 @supports 中啟用增強,透過真實瀏覽器和 WebView 矩陣驗證相容性。測試主題、列印、對比度、焦點、減少動效和不同條件組合,監控回退命中與布局差異,必要時移除增強層。

常見錯誤

  • if() 當成 JavaScript 業務邏輯或選擇器替代品。
  • 忽略條件按書寫順序求值,導致寬泛條件提前命中。
  • 沒有 else 和靜態預設值,舊瀏覽器出現關鍵樣式缺失。
  • 把實驗語法直接用於尺寸、導航或互動命中區域。
  • 只在最新瀏覽器測試,不驗證 WebView、列印和主題組合。
  • 沒有檢查對比度、焦點和減少動效。

追問及應對

沒有條件命中會怎樣?

沒有 else 時結果可能為 guaranteed-invalid,屬性隨後按繼承、初始值或未指定值處理。關鍵屬性必須提供可接受的靜態回退。

為什麼不能只用 @supports?

@supports 只能判斷宣告是否被解析,不能證明每個條件組合和實際值都符合設計。仍需在目標瀏覽器、主題和輔助技術下進行行為驗證。

什麼時候繼續用自訂屬性和多個宣告?

當瀏覽器覆蓋面要求高、條件少或回退必須透明時,多個宣告更易稽核。if() 帶來的壓縮和集中表達只有在相容矩陣可接受時才值得採用。

公開來源

同類題目