安裝在桌面上的漸進式網頁應用程式 (PWA) ,可以透過 Window Controls Overlay API 將內容顯示在標題欄通常所在的位置,讓 PWA 感覺更原生。
視窗控制覆蓋層 API 的功能如下:
- 讓你能在整個應用程式的表面區域上顯示網頁內容。
- 將系統所需的關鍵視窗控制項移入覆蓋層。
- 這樣你的內容就能避免被這種疊加層覆蓋。
PWA (漸進式網頁應用程式) 可透過網頁應用程式清單檔案中的 顯示 成員,定義其在行動平台上的顯示方式。 然而,為了打造沉浸式、原生感的體驗, 桌面 PWA 可以採用另一種方式。
預設情況下,安裝在桌面上的 PWA 可以在保留標題列區域下方的區域顯示內容:
將內容顯示在標題欄通常所在的位置,能讓 PWA 感覺更貼近原生。 許多桌面應用程式,如 Visual Studio Code、Microsoft Teams 和 Microsoft Edge 已經具備此功能:
在你的應用程式中啟用視窗控制覆蓋
首先,啟用你應用程式網頁應用程式清單檔案中的視窗控制覆蓋功能。 為此,在清單檔案中設定 display_override 以下屬性:
{
"display_override": ["window-controls-overlay"]
}
另請參閱:
- display_override MDN > 參考 > 網頁應用清單。
- 網頁應用程式的顯現 資料可參考 MDN > 參考資料。
- 網頁應用程式的表現形式包括 MDN> 參考漸>進式網頁應用>指南。
切換標題欄
啟用視窗控制覆蓋功能後,使用者可點擊標題欄切換按鈕,選擇是否擁有標題列:
你的程式碼不能假設視窗控制覆蓋層會顯示,因為:
- 使用者可以選擇是否顯示標題列。
- 你的應用程式也可以在網頁瀏覽器或行動裝置上執行,也可以作為桌面應用程式執行。
因此,你的程式碼需要對標題列幾何形狀的變化做出反應。 欲了解更多,請參閱 React to overlay 變更。
使用 CSS 環境變數以避免覆蓋層
env() CSS 函式可用來存取使用者代理定義的環境變數。
視窗控制覆蓋功能新增了四個環境變數:
| 變數 | 描述 |
|---|---|
titlebar-area-x |
距離視窗左側標題欄通常佔據區域的距離(in px) |
titlebar-area-y |
距離視窗上方標題欄通常佔據區域的距離(in px),即 |
titlebar-area-width |
標題欄區域的寬度,在 px |
titlebar-area-height |
標題欄區域高度,在 px |
當視窗控制覆蓋功能被關閉時,你可以利用這些環境變數來將標題列通常會出現的位置和大小調整內容:
#title-bar {
position: fixed;
left: env(titlebar-area-x, 0);
top: env(titlebar-area-y, 0);
height: env(titlebar-area-height, 50px);
width: env(titlebar-area-width, 100%);
}
使用 position: fixed; 時可以確保標題列不會和其他內容一起捲動,而是保持與視窗控制覆蓋層對齊。
知道疊加層的位置和大小很重要。 覆蓋層不一定總是在窗戶的同一側;在 macOS 上,覆蓋層在左側,但在 Windows 上,覆蓋層在右側。 而且,疊加層的大小不一定總是一樣。
env() CSS 函式會接收第二個參數,當視窗控制覆蓋功能缺失或停用時,該參數有助於定義應用程式內容的位置。
把視窗的拖把設成區域
當標題列被隱藏時,只有系統關鍵的視窗控制項會 (最大化、最小化、關閉和應用程式資訊圖示) 顯示。 這表示使用者幾乎沒有空間可以移動應用程式視窗。
你可以使用 app-region CSS 屬性,提供更多用戶拖曳應用程式的方式。 舉例來說,如果你的應用程式有自己的標題列,你可以把標題欄變成視窗拖曳的控制柄:
#title-bar {
position: fixed;
left: env(titlebar-area-x, 0);
top: env(titlebar-area-y, 0);
height: env(titlebar-area-height, 50px);
width: env(titlebar-area-width, 100%);
app-region: drag;
}
React 對覆蓋層變更
使用者可以在應用程式運行時切換標題列或更改視窗大小。 知道這些事情何時發生對你的申請非常重要。 你的應用程式可能需要重新排列標題欄中顯示的內容,或重新排列頁面其他位置的版面。
要監聽變化,請使用 geometrychange 物件上的 navigator.windowControlsOverlay 事件。 要判斷標題列是否可見,請使用物件上的navigator.windowControlsOverlay屬性visible。
當使用者調整視窗大小時,事件 geometrychange 會非常頻繁地觸發。 為避免頻繁執行變更版面的程式碼並造成應用程式效能問題,請使用 debounce 函式限制事件處理次數。 請參見限 速與去彈跳的差異。
const debounce = (func, wait) => {
let timeout;
return function executedFunction(...args) {
const later = () => {
clearTimeout(timeout);
func(...args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
};
if ('windowControlsOverlay' in navigator) {
navigator.windowControlsOverlay.addEventListener('geometrychange', debounce(e => {
// Detect if the Window Controls Overlay is visible.
const isOverlayVisible = navigator.windowControlsOverlay.visible;
// Get the size and position of the title bar area.
const titleBarRect = e.titlebarAreaRect;
console.log(`The overlay is ${isOverlayVisible ? 'visible' : 'hidden'}, the title bar width is ${titleBarRect.width}px`);
}, 200));
}
示範應用程式
1DIV 是一款使用 Window Controls Overlay 功能的 PWA 示範應用程式。
在 Microsoft Edge 中,請在新視窗或分頁中開啟 1DIV 示範應用程式。
在地址欄中,點擊 可用應用程式。安裝 1DIV (
) 按鈕。 安裝 1DIV 應用程式 的對話框會打開。點擊 安裝 按鈕。 1DIV 應用程式會以獨立視窗開啟,並開啟「 應用程式已安裝 」對話框:
點擊對話框中的 「關閉 (X) 」按鈕。 (或者,選擇或清除勾取方塊,然後點擊 允許 按鈕 )
應用程式的標題列至少包含以下視窗控制:
圖示 工具提示
隱藏標題欄
場景及更多
Minimize
還原
Close 在標題欄中,點擊 隱藏標題欄 (「
) 按鈕。應用程式現在會顯示內容,一直顯示到視窗框頂端,標題欄原本所在的位置:
應用程式的頂端區域是一個拖曳手柄,讓使用者可以移動視窗。
這個示範應用程式的原始碼在 1DIV 倉庫裡。
manifest.json原始碼檔案宣告應用程式使用 Window Controls Overlay 功能。
app.js 原始碼檔案使用物件
navigator.windowControlsOverlay。app.css原始碼檔案使用
titlebar-area-*CSS 環境變數。
在不安裝 PWA 的情況下預覽自訂覆蓋層
在 Edge DevTools Microsoft 應用程式 工具中,你可以模擬 WCO) 功能的視窗控制覆蓋層 (,無需先安裝 PWA 並啟用 WCO 功能。 透過在 DevTools 內模擬 WCO 功能,你可以比重新安裝修訂後的 PWA 更快測試標題列區域的 CSS 程式碼變更。
模擬的疊加圖是靜態影像。 CSS 變數 env(titlebar-area-left)、 env(titlebar-area-top)、 env(titlebar-area-width)env(titlebar-area-height) 的值會設定為與你選擇的平台相符。
請參考 「模擬視窗控制覆蓋層 API,無需安裝 PWA」。
另請參閱
MDN:
- 視窗控制覆蓋層 API
- 網頁應用程式的表現形式包括 MDN> 參考漸>進式網頁應用>指南。
-
網頁應用程式的顯現 資料可參考 MDN > 參考資料。
- display_override 在男人祭典裡。
- 在清單上展示 。
-
env()CSS 函式。
部落格:
YouTube:
試玩版:
- 1DIV 現場直播
-
/1DIV/ 原始碼
- manifest.json
-
app.js - 使用物件
navigator.windowControlsOverlay。 -
app.css - 使用
titlebar-area-*CSS 環境變數。