具代表性的面試主題

前端面試:如何用 anchored container query 處理浮層定位降級?

前端困難
Offer.cc 編輯團隊發佈 更新

題幹

一個 tooltip 透過 CSS anchor positioning 貼近按鈕,但在視窗邊緣會切換 fallback。如何讓箭頭、最大高度和文字方向隨 fallback 改變,同時相容不支援該能力的瀏覽器?

題幹與適用場景

你維護一個大量重用的 tooltip 元件。它用 CSS anchor positioning 貼近觸發按鈕,並透過 position-try fallback 避免溢出;但浮層換到另一側後,箭頭方向、滾動區域和內距仍保持舊狀態。

請設計純 CSS 優先的方案,說明如何讓 fallback 狀態驅動樣式、如何避免元件互相影響,以及不支援 anchor positioning 時的降級行為。

面試官考察點

  • 是否理解 anchor positioning 的定位關係與 fallback 選擇。
  • 是否能用 anchored container query 讀取實際落位,而非複製 JS 狀態。
  • 是否考慮無障礙、滾動邊界、層疊和重複元件隔離。
  • 是否提供特性檢測、靜態佈局和漸進增強路徑。

回答前需要釐清的問題

  1. tooltip 是普通文字、選單還是可互動對話框?
  2. fallback 是上下左右切換,還是會進入滾動容器?
  3. 目標瀏覽器是否支援 anchor positioning 與 container queries?
  4. 元件是否允許 JS 讀取尺寸,還是必須 CSS-only?

30 秒回答

我會把按鈕設為 anchor,把 tooltip 設為 anchor-positioned container,並用 position-try fallback 定義候選位置。每個 fallback 用 anchored container query 改變箭頭、內距和最大高度;元件內部樣式只依賴自身容器,不讀全域狀態。先用 @supports 檢測能力,不支援時回退到靜態或 JS 定位,並保留可存取的描述關聯。壓測視窗邊緣、縮放、滾動容器和長文字,確認不溢出、不遮擋焦點。

分步驟深入解答

建立 anchor 與候選位置

觸發元素宣告 anchor-name,tooltip 使用 position-anchor 和 inset/anchor() 關聯。用 position-try fallback 描述候選位置順序,不把方向寫死在元件邏輯中。

把浮層設為查詢容器

設定 container-type,讓浮層內部的 anchored container query 根據實際 fallback 狀態調整。查詢的是錨定結果對應的容器條件,避免讀取視窗寬度猜測位置。

同步箭頭與滾動策略

不同落位使用不同箭頭邊、transform-origin、max-block-size 和 overflow。長內容進入浮層內部滾動,不能讓 tooltip 撐出視窗或截斷鍵盤焦點。

隔離重複元件

每個實例使用獨立 anchor 名稱或命名作用域,避免一個列表項的 anchor 被另一個實例匹配。層疊順序、position-area 和遮罩規則也應局部化。

做特性檢測與降級

透過 @supports (anchor-name: --x) 和必要的 container query 檢測能力。降級版本可使用靜態相鄰內容或既有 JS 定位器,但必須保留 aria-describedby、鍵盤關閉和焦點順序。

驗證邊界與無障礙

測試窄視窗、縮放、RTL、滾動容器、觸控和 reduced motion。用鍵盤和螢幕閱讀器確認 tooltip 不搶焦點、不被裁切,fallback 改變時內容仍可讀。

高品質示範回答

我會把觸發按鈕宣告為 anchor,把 tooltip 設為 container,並給出有順序的 position-try fallback。浮層內部用 anchored container query 根據實際落位調整箭頭、內距、最大高度和滾動方向,元件只讀取自身容器條件。每個實例隔離 anchor 名稱和層疊規則。用 @supports 做漸進增強,不支援時回退到靜態或既有 JS 定位,同時保留 aria-describedby、鍵盤關閉和焦點順序。透過窄視窗、縮放、RTL、滾動容器、長文字和螢幕閱讀器測試邊界。

常見錯誤

  • 用 JS 讀取視窗寬度猜測 fallback,而不是回應實際落位。
  • 把所有 tooltip 共用一個 anchor 名稱,導致實例串聯。
  • 只改變 top/left,不同步箭頭、滾動和 transform-origin。
  • 沒有 @supports,讓不支援瀏覽器出現不可見或不可操作浮層。
  • 只測正常視窗,忽略 RTL、縮放、滾動容器和鍵盤焦點。
  • 把 tooltip 當對話框使用,卻沒有明確的無障礙語義。

追問及應對

anchored container query 與普通 container query 有何差別?

它用於根據 anchor-positioned 元素的 fallback 落位狀態選擇樣式,普通 container query 主要依據容器尺寸或樣式條件。

不支援 anchor positioning 時怎麼辦?

提供靜態相鄰佈局或既有 JS 定位器,並保持相同的可存取名稱、關閉方式和內容順序;不要依賴半套新語法。

如何避免浮層遮擋焦點?

限制最大尺寸並讓內容內部滾動,測試鍵盤 Tab、Escape、螢幕閱讀器和滾動父級,確保焦點元素始終可見。

為什麼不能只寫四個方向的媒體查詢?

媒體查詢反映視窗,不反映 anchor 與容器的實際空間;fallback 可能受滾動容器、字型和內容長度影響。

公開來源

同類題目