VirtualKeyboard API

可用性有限

此特性不是基線特性,因為它在一些最廣泛使用的瀏覽器中不起作用。

實驗性: 這是一項實驗性技術
在生產中使用此技術之前,請仔細檢查瀏覽器相容性表格

安全上下文: 此功能僅在安全上下文(HTTPS)中可用,且支援此功能的瀏覽器數量有限。

VirtualKeyboard API 為開發者提供了在平板電腦、手機或其他可能沒有硬體鍵盤的裝置上,當螢幕虛擬鍵盤出現和消失時,控制應用程式佈局的能力。

Web 瀏覽器通常會自行處理虛擬鍵盤,透過調整視口高度並在輸入欄位獲得焦點時滾動到該欄位。

下圖展示了當裝置上的螢幕虛擬鍵盤隱藏和顯示時,網頁視口高度和滾動位置的差異。

Two devices, one without a virtual keyboard, showing that the webpage can use most of the device's vertical space, and one with a virtual keyboard, showing that the webpage can only be displayed in the remaining space

更復雜的應用程式或特定裝置(如多屏手機)可能需要在虛擬鍵盤出現時對佈局進行更精細地控制。

下圖展示了在一臺雙屏裝置上,當虛擬鍵盤只出現在其中一個螢幕上時會發生什麼。為了適應虛擬鍵盤,兩個螢幕的視口都會變小,導致在未顯示虛擬鍵盤的螢幕上留下空白。

A dual-screen device, with its virtual keyboard displayed on one screen, showing that the webpage can only use the vertical space that remains after the keyboard was displayed, even if that leaves empty space on the other screen

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 屬性來查詢虛擬鍵盤的大小和位置。

js
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-topkeyboard-inset-rightkeyboard-inset-bottomkeyboard-inset-leftkeyboard-inset-widthkeyboard-inset-height

keyboard-inset-* CSS 環境變數可用於使用 CSS 將您的佈局適配到虛擬鍵盤的外觀。它們透過視口邊緣的頂部、右側、底部和左側內邊距定義一個矩形。如果需要,還可以使用 widthheight 變數。

下面的程式碼片段使用 keyboard-inset-height CSS 變數為聊天類應用程式中訊息列表和輸入欄位下方顯示虛擬鍵盤預留空間。當虛擬鍵盤隱藏時,env() 函式返回 0px,並且 keyboard 網格區域被隱藏。訊息和輸入元素可以佔用視口的全部高度。當虛擬鍵盤出現時,keyboard 網格區域的高度將等於虛擬鍵盤的高度。

html
<ul id="messages"></ul>
<input type="text" />
css
body {
  display: grid;
  margin: 0;
  height: 100vh;
  grid-template:
    "messages" 1fr
    "input" auto
    "keyboard" env(keyboard-inset-height, 0px);
}
js
if ("virtualKeyboard" in navigator) {
  navigator.virtualKeyboard.overlaysContent = true;
}

控制 contenteditable 元素上的虛擬鍵盤

預設情況下,使用 contenteditable 屬性的元素在被點選或輕觸時也會觸發虛擬鍵盤。在某些情況下,可能希望阻止此行為,而是改為在其他事件後顯示虛擬鍵盤。

virtualkeyboardpolicy 屬性設定為 manual,以阻止瀏覽器對虛擬鍵盤的預設處理,而是使用 VirtualKeyboard 介面的 show()hide() 方法手動處理。

下面的程式碼片段展示瞭如何使用 virtualkeyboardpolicy 屬性和 navigator.virtualKeyboard.show() 方法在雙擊時顯示虛擬鍵盤。

html
<div contenteditable virtualkeyboardpolicy="manual" id="editor"></div>
js
if ("virtualKeyboard" in navigator) {
  navigator.virtualKeyboard.overlaysContent = true;

  const editor = document.getElementById("editor");
  editor.addEventListener("dblclick", () => {
    navigator.virtualKeyboard.show();
  });
}

介面

VirtualKeyboard Experimental

提供用於檢索鍵盤佈局圖和切換物理鍵盤按鍵捕獲的函式。

其他介面的擴充套件

返回一個指向 VirtualKeyboard API 的引用,用於控制螢幕上的虛擬鍵盤。

HTMLElement.virtualKeyboardPolicy Experimental

一個字串,指示是使用瀏覽器在元素獲得焦點時顯示虛擬鍵盤的預設策略,還是手動處理虛擬鍵盤的顯示。

規範

規範
VirtualKeyboard API
# the-virtualkeyboard-interface

瀏覽器相容性

另見