VirtualKeyboard API
VirtualKeyboard API 為開發者提供了在平板電腦、手機或其他可能沒有硬體鍵盤的裝置上,當螢幕虛擬鍵盤出現和消失時,控制應用程式佈局的能力。
Web 瀏覽器通常會自行處理虛擬鍵盤,透過調整視口高度並在輸入欄位獲得焦點時滾動到該欄位。
下圖展示了當裝置上的螢幕虛擬鍵盤隱藏和顯示時,網頁視口高度和滾動位置的差異。

更復雜的應用程式或特定裝置(如多屏手機)可能需要在虛擬鍵盤出現時對佈局進行更精細地控制。
下圖展示了在一臺雙屏裝置上,當虛擬鍵盤只出現在其中一個螢幕上時會發生什麼。為了適應虛擬鍵盤,兩個螢幕的視口都會變小,導致在未顯示虛擬鍵盤的螢幕上留下空白。

VirtualKeyboard API 可用於退出瀏覽器自動處理虛擬鍵盤的方式,轉而完全控制它。使用 VirtualKeyboard API,當表單控制元件獲得焦點時,鍵盤仍然會根據需要出現和消失,但視口不會改變,您可以使用 JavaScript 和 CSS 來調整您的佈局。
概念
VirtualKeyboard API 由三部分組成:
- 透過
navigator.virtualKeyboard訪問的VirtualKeyboard介面,用於退出自動虛擬鍵盤行為,以程式設計方式顯示或隱藏虛擬鍵盤,以及獲取虛擬鍵盤的當前位置和大小。 keyboard-inset-*CSS 環境變數提供有關虛擬鍵盤位置和大小的資訊。virtualkeyboardpolicy屬性指定是否應在contenteditable元素上顯示虛擬鍵盤。
退出自動虛擬鍵盤行為
要退出瀏覽器的自動虛擬鍵盤行為,請使用 navigator.virtualKeyboard.overlaysContent = true。瀏覽器將不再自動調整視口大小以容納虛擬鍵盤,而是讓虛擬鍵盤覆蓋您的內容。
使用 JavaScript 檢測虛擬鍵盤的幾何形狀
在退出預設的瀏覽器行為後,您可以使用 navigator.virtualKeyboard.boundingRect 獲取虛擬鍵盤的當前幾何形狀,並使用 CSS 和 JavaScript 適當地調整佈局。此外,您還可以透過使用 geometrychange 事件來監聽幾何形狀的變化,例如鍵盤何時顯示或隱藏。
這對於將重要 UI 元素定位在虛擬鍵盤未覆蓋的區域非常有用。
下面的程式碼片段使用 geometrychange 事件來檢測虛擬鍵盤幾何形狀何時發生變化;然後它訪問 boundingRect 屬性來查詢虛擬鍵盤的大小和位置。
if ("virtualKeyboard" in navigator) {
navigator.virtualKeyboard.overlaysContent = true;
navigator.virtualKeyboard.addEventListener("geometrychange", (event) => {
const { x, y, width, height } = event.target.boundingRect;
});
}
使用 CSS 環境變數檢測虛擬鍵盤的幾何形狀
VirtualKeyboard API 還公開了以下 CSS 環境變數:keyboard-inset-top、keyboard-inset-right、keyboard-inset-bottom、keyboard-inset-left、keyboard-inset-width 和 keyboard-inset-height。
keyboard-inset-* CSS 環境變數可用於使用 CSS 將您的佈局適配到虛擬鍵盤的外觀。它們透過視口邊緣的頂部、右側、底部和左側內邊距定義一個矩形。如果需要,還可以使用 width 和 height 變數。
下面的程式碼片段使用 keyboard-inset-height CSS 變數為聊天類應用程式中訊息列表和輸入欄位下方顯示虛擬鍵盤預留空間。當虛擬鍵盤隱藏時,env() 函式返回 0px,並且 keyboard 網格區域被隱藏。訊息和輸入元素可以佔用視口的全部高度。當虛擬鍵盤出現時,keyboard 網格區域的高度將等於虛擬鍵盤的高度。
<ul id="messages"></ul>
<input type="text" />
body {
display: grid;
margin: 0;
height: 100vh;
grid-template:
"messages" 1fr
"input" auto
"keyboard" env(keyboard-inset-height, 0px);
}
if ("virtualKeyboard" in navigator) {
navigator.virtualKeyboard.overlaysContent = true;
}
控制 contenteditable 元素上的虛擬鍵盤
預設情況下,使用 contenteditable 屬性的元素在被點選或輕觸時也會觸發虛擬鍵盤。在某些情況下,可能希望阻止此行為,而是改為在其他事件後顯示虛擬鍵盤。
將 virtualkeyboardpolicy 屬性設定為 manual,以阻止瀏覽器對虛擬鍵盤的預設處理,而是使用 VirtualKeyboard 介面的 show() 和 hide() 方法手動處理。
下面的程式碼片段展示瞭如何使用 virtualkeyboardpolicy 屬性和 navigator.virtualKeyboard.show() 方法在雙擊時顯示虛擬鍵盤。
<div contenteditable virtualkeyboardpolicy="manual" id="editor"></div>
if ("virtualKeyboard" in navigator) {
navigator.virtualKeyboard.overlaysContent = true;
const editor = document.getElementById("editor");
editor.addEventListener("dblclick", () => {
navigator.virtualKeyboard.show();
});
}
介面
VirtualKeyboardExperimental-
提供用於檢索鍵盤佈局圖和切換物理鍵盤按鍵捕獲的函式。
其他介面的擴充套件
-
返回一個指向
VirtualKeyboardAPI 的引用,用於控制螢幕上的虛擬鍵盤。 HTMLElement.virtualKeyboardPolicyExperimental-
一個字串,指示是使用瀏覽器在元素獲得焦點時顯示虛擬鍵盤的預設策略,還是手動處理虛擬鍵盤的顯示。
規範
| 規範 |
|---|
| VirtualKeyboard API # the-virtualkeyboard-interface |
瀏覽器相容性
載入中…