Skip to main content
action 彈出視窗並沒有一個能用 JavaScript 調整尺寸的視窗。瀏覽器會量測你算繪出來的 HTML,然後在硬性上限之內圍繞它繪製彈出視窗。因此替彈出視窗決定尺寸,實際上就是用 CSS 替它的內容決定尺寸。

瀏覽器實際套用的規則

  • 彈出視窗會撐大到剛好容納你文件算繪後的尺寸。
  • Chromium 系瀏覽器把彈出視窗限制在最大 800 x 600 px、最小 25 x 25 px
  • Firefox 採用同樣的 800 x 600 px 上限。
  • 超出最大值的內容會出現捲軸,彈出視窗本身絕不會超過這個上限繼續變大。
  • 沒有任何 API 可以直接設定彈出視窗的尺寸。chrome.windows 這組 API 調整的是瀏覽器視窗,而不是 action 彈出視窗。

基準寫法

給文件一個明確的寬度,讓高度跟著內容走:
在 320 到 400 px 之間取一個固定寬度,在每一種桌面瀏覽器上看起來都不錯。高度才是你會想保持彈性的那一維:讓它跟隨內容,把 600 px 的上限當作天花板。

會讓彈出視窗跑版或跳動的陷阱

視區單位

不要在彈出視窗裡使用 vhvw。視區就是彈出視窗本身,而彈出視窗的尺寸又來自你的內容,於是視區單位造成了循環量測。實際上 100vh 會塌陷成意料之外的數值,在 Firefox 上尤其明顯。請改用固定的 px 值,或改採由內容驅動的尺寸。

百分比高度

body 上寫 height: 100% 有同樣的循環問題:在你的內容給出高度之前,父層根本沒有固定高度。建議改用帶像素值的 min-height

較晚載入的內容會改變彈出視窗尺寸

彈出視窗會以首次繪製時的尺寸開啟,接著在字型、圖片或非同步資料抵達時明顯跳動。要讓它保持穩定:
  • 為圖片設定明確的 widthheight 屬性。
  • min-height 骨架為非同步區塊預留空間。
  • 盡可能讓初始算繪維持同步,把資料填入已經定好尺寸的容器中。

捲軸閃現

如果內容在載入過程中短暫溢出,捲軸會閃現並讓版面位移。在 body 上加 overflow-x: hidden 可以消除水平方向的閃現,而 scrollbar-gutter: stable 則能在真正出現垂直捲軸時,避免內容被推移。

縮放會改變實際生效的上限

瀏覽器縮放會縮放彈出視窗的 CSS 像素,因此一個 360 px 的彈出視窗在 150% 縮放下會占用更多螢幕空間,也會更早撞上 800 x 600 的上限。如果使用者回報彈出視窗被裁切,縮放是常見原因,把版面控制在大約 750 x 550 CSS px 以內可以留出餘裕。

Firefox 注意事項

  • Firefox 需要在 body(或一個固定寬度的根元素)上給出寬度,否則未受約束的彈出視窗可能算繪成塌陷狀態,或呈現意料之外的寬度。
  • 由於 Manifest V3 移除了 browser_style,彈出視窗的所有樣式都由你自己負責。請自備一套基礎樣式。

Safari 注意事項

Safari 會把彈出視窗算繪成 popover,採用同樣的內容驅動模型。請沿用明確寬度的寫法,並以 extension dev --browser=safari 測試。該指令僅在 macOS 上執行,需要完整的 Xcode 應用程式,而且目前還沒有即時重新載入,所以每調整一次尺寸就得重新建置一次(請參見 建置 Safari 擴充功能)。Safari 對於版面尚未穩定就先繪製這件事更嚴格,所以在它上面,預先定好尺寸的容器更為重要。

對彈出視窗尺寸除錯

執行你的擴充功能,然後像檢視任何頁面一樣檢視彈出視窗:
開啟彈出視窗,在其中按右鍵並選擇「檢查」。DevTools 連著時彈出視窗會保持開啟,你可以一邊切換 CSS,一邊即時看它改變尺寸。Extension.js 會在存檔時重新載入彈出視窗,讓調整尺寸的迭代非常快。

快速檢查清單

  • body 上設定固定的 width,落在 320 到 400 px 之間。
  • min-height 使用像素值,不要用 vh,也不要用百分比高度。
  • 為圖片與非同步區塊預先定好尺寸。
  • 保持在 800 x 600 的上限之內,並為縮放留出餘裕。
  • 測試 Chrome、Firefox 與 Safari 的建置,上限雖然共通,算繪結果卻各有差異。