具代表性的面試主題

前端面試:如何用 CSS Anchor Positioning 實作可靠浮層?

前端中等
OfferCC 編輯團隊發佈 更新

題幹

資料表的篩選按鈕需要開啟貼近按鈕的選單。選單不能被視窗裁切,窄螢幕要自動翻轉或隱藏,頁面支援滾動容器和鍵盤操作,部分瀏覽器不支援 CSS Anchor Positioning。請設計實作、降級、無障礙語意和驗證方案。

題幹與適用場景

這題考察你能否把「浮在按鈕旁邊」變成可驗證的布局與互動契約。重點不只是 anchor-name、anchor(),還包括候選位置、溢出策略、滾動、支援度偵測及選單或對話框的焦點行為。

面試官真正想聽什麼

  • 如何建立錨點關係並解釋 position-area、anchor() 和 fallback。
  • 視窗、滾動容器、縮放和動態內容變化時如何保持可見。
  • 不支援瀏覽器的漸進增強路徑。
  • 選單、tooltip、dialog 的語意、焦點、Escape、外部點擊和讀屏回饋。

推薦回答結構

先定義浮層類型、錨點和最小可見約束,再給出原生 CSS 路徑:錨點命名、定位、候選 fallback 和隱藏條件。接著說明 @supports 降級到既有定位元件,最後覆蓋焦點、滾動、動態尺寸和驗證。

深入拆解:讓定位可用且可存取

建立穩定錨點

觸發按鈕設定唯一 anchor-name,浮層使用 position-anchor 或明確引用。列表重複時為每行建立穩定關係,卸載時清理狀態。

設計候選位置和溢出規則

用 position-area 或 anchor() 表達首選位置,再用 fallback 嘗試另一側、邊緣對齊和縮小尺寸。設定最大高度與內部滾動,無法容納時改成全螢幕面板,不讓內容被裁切。

處理滾動和動態尺寸

錨點在滾動容器內移動時,確認包含區塊和層疊上下文。內容、字型或縮放變化後重新檢查可見性;降級才需要時才做受控測量。

做漸進增強

用 @supports (anchor-name: --trigger) 偵測能力。支援時交給 CSS;不支援時複用既有 portal 定位器,限制測量頻率並清理監聽器。兩條路徑共享狀態和無障礙契約。

讓語意符合任務

選單使用按鈕、選單項和方向鍵規則;tooltip 不承載必須操作的內容;真正阻斷背景才使用 dialog。Modal 必須管理進入焦點、Tab 循環、Escape 和關閉後焦點恢復。

可直接套用的回答示例

「我把篩選器定義為非模態選單。按鈕設定穩定 anchor-name,選單用 position-anchor 和下方對齊,再用 fallback 嘗試上方與左右邊緣,設定最大高度讓內部滾動。@supports 不成立時複用既有 portal 定位器,統一狀態與鍵盤行為。開啟後焦點進入第一項,方向鍵移動,Escape 和外部點擊關閉並把焦點還給按鈕。我會測試窄螢幕、滾動、縮放、非同步內容和裁切,並做截圖、鍵盤與讀屏驗證。」

常見失分點與修正

  • 只寫 top、left → 補充候選位置、溢出、最大尺寸和 fallback。
  • 所有浮層都當 modal → 先按任務區分選單、tooltip、dialog。
  • 忽略不支援瀏覽器 → 提供 @supports 和既有定位降級。
  • 只測固定桌面視窗 → 覆蓋滾動、縮放、窄螢幕、動態內容和鍵盤。

評分標準與自檢清單

高分回答包含穩定錨點、候選位置、溢出與隱藏策略、漸進增強、滾動和尺寸邊界、正確語意、焦點管理、測試矩陣和可觀測性。

追問與延伸

anchor() 和 position-area 怎麼選?

position-area 適合表達相對錨點的區域;anchor() 適合把某條邊或尺寸用於 inset、偏移與計算。複雜元件可組合,但仍需 fallback 和最大尺寸。

如果選單比視窗還高怎麼辦?

限制最大尺寸並讓內部滾動;小螢幕也可切換為全螢幕或底部面板。不要讓超出視窗的內容無法尋找。

如何測試定位候選?

用不同視窗、滾動、縮放、字型和內容長度產生截圖,並斷言可見區域、焦點順序和關閉後焦點目標。

何時仍應使用 JavaScript 定位?

跨舊瀏覽器、複雜 portal 邊界或需要業務碰撞資料時,可保留 JS 降級。CSS 處理支援路徑,JS 僅補能力缺口。

公開來源

同類題目

資源

產品比較

每份比較均依官方資料整理,並標示複核日期。

查看完整比較