国产欧美日韩三区_偷窥自拍亚洲色图精选_久久大片网站_成人在线黄色_成人亚洲免费视频_99久久久精品_国产美女自拍_韩国19禁主播vip福利视频_色综合视频一区二区三区日韩_日本在线观看一区二区

當前位置:首頁 > 科技  > 軟件

虛擬鍵盤 API 的妙用

來源: 責編: 時間:2023-08-05 11:46:01 5170觀看
導讀你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發生以及如何使用虛擬鍵盤 API 來解決這個問題。

rgt28資訊網——每日最新資訊28at.com

你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?rgt28資訊網——每日最新資訊28at.com

多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發生以及如何使用虛擬鍵盤 API 來解決這個問題。rgt28資訊網——每日最新資訊28at.com

1、虛擬鍵盤 API Summer IS HERE

在探討這個問題之前,我們先來看看什么是虛擬鍵盤 API。rgt28資訊網——每日最新資訊28at.com

Summer:基本概念

當屏幕虛擬鍵盤在平板電腦、手機或其他可能沒有硬件鍵盤的設備上出現和隱藏時,虛擬鍵盤 API 使開發人員能夠控制應用的布局。Web 瀏覽器通常通過調整視口高度并在聚焦時滾動到輸入字段來自行處理虛擬鍵盤。rgt28資訊網——每日最新資訊28at.com

下圖說明了當設備隱藏和顯示屏幕虛擬鍵盤時,網頁上視口高度和滾動位置的差異。rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

更復雜的應用或特定設備(例如多屏手機)在虛擬鍵盤出現時可能需要對布局進行更多控制。rgt28資訊網——每日最新資訊28at.com

下圖顯示了當虛擬鍵盤僅出現在兩個屏幕之一上時,雙屏設備上發生的情況。兩個屏幕上的視口都會變小以容納虛擬鍵盤,從而在屏幕上留下不顯示虛擬鍵盤的浪費空間。rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

虛擬鍵盤 API 可以用于選擇退出瀏覽器自動處理虛擬鍵盤的方式,并完全控制它。使用虛擬鍵盤 API,當表單控件獲得焦點時,鍵盤仍然會根據需要出現和消失,但視口不會更改,并且可以使用 JavaScript 和 CSS 來調整布局。rgt28資訊網——每日最新資訊28at.com

Summer:使用方式

虛擬鍵盤 API 包括三個部分:rgt28資訊網——每日最新資訊28at.com

  • 虛擬鍵盤 API 接口,通過 navigator.virtualKeyboard 訪問,用于取消自動虛擬鍵盤行為、以編程方式顯示或隱藏虛擬鍵盤,以及獲取虛擬鍵盤的當前位置和大小。
  • CSS 環境變量 keyboard-inset-* 提供了有關虛擬鍵盤位置和大小的信息。
  • virtualkeyboardpolicy 屬性指定虛擬鍵盤是否應出現在可編輯元素上。

取消瀏覽器的自動虛擬鍵盤行為

要取消瀏覽器的自動虛擬鍵盤行為,可以使用 navigator.virtualKeyboard.overlaysContent = true。這樣,瀏覽器就不會自動調整視口大小以為虛擬鍵盤騰出空間,而是將虛擬鍵盤覆蓋在內容上。rgt28資訊網——每日最新資訊28at.com

使用 JavaScript 檢測虛擬鍵盤的幾何屬性

一旦取消了默認的瀏覽器行為,可以使用 navigator.virtualKeyboard.boundingRect 獲取當前虛擬鍵盤的幾何屬性,并使用 CSS 和 JavaScript 進行相應的布局調整。此外,還可以通過使用 geometrychange 事件監聽幾何屬性的變化,例如鍵盤的顯示或隱藏。rgt28資訊網——每日最新資訊28at.com

這對于將重要的用戶界面元素定位在虛擬鍵盤不覆蓋的區域非常有用。rgt28資訊網——每日最新資訊28at.com

下面的代碼片段使用 geometrychange 事件來檢測虛擬鍵盤幾何屬性的變化;然后通過訪問 boundingRect 屬性來查詢虛擬鍵盤的大小和位置:rgt28資訊網——每日最新資訊28at.com

if ("virtualKeyboard" in navigator) {  navigator.virtualKeyboard.overlaysContent = true;  navigator.virtualKeyboard.addEventListener("geometrychange", (event) => {    const { x, y, width, height } = event.target.boundingRect;  });}

使用CSS環境變量檢測虛擬鍵盤的幾何屬性

虛擬鍵盤 API 還提供了以下 CSS 環境變量:rgt28資訊網——每日最新資訊28at.com

  • keyboard-inset-top
  • keyboard-inset-right
  • keyboard-inset-bottom
  • keyboard-inset-left
  • keyboard-inset-width
  • keyboard-inset-height

keyboard-inset-* 環境變量可用于使用CSS調整布局以適應虛擬鍵盤的顯示。它們通過距離視口邊緣的上、右、下和左插圖定義一個矩形。如果需要,也可以使用寬度和高度變量。rgt28資訊網——每日最新資訊28at.com

下面的代碼片段使用keyboard-inset-height 變量來為虛擬鍵盤在聊天式應用程序中的消息列表和輸入字段下方預留空間。當虛擬鍵盤隱藏時,env()函數返回0px,keyboard網格區域被隱藏。消息和輸入元素可以占據整個視口的高度。當虛擬鍵盤出現時,keyboard網格區域的高度與虛擬鍵盤的高度相同。rgt28資訊網——每日最新資訊28at.com

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

控制可內容編輯元素上的虛擬鍵盤

默認情況下,使用 contenteditable 屬性的元素在點擊或觸摸時也會觸發虛擬鍵盤。 在某些情況下,可能需要防止這種行為,并在不同的事件之后顯示虛擬鍵盤。rgt28資訊網——每日最新資訊28at.com

將 virtualkeyboardpolicy 屬性設置為 manual,以阻止瀏覽器對虛擬鍵盤的默認處理,并通過使用虛擬鍵盤 API 的 show() 和 hide() 方法自行處理。rgt28資訊網——每日最新資訊28at.com

下面的代碼展示了如何使用 virtualkeyboardpolicy 屬性和 navigator.virtualKeyboard.show() 方法,在雙擊事件上顯示虛擬鍵盤:rgt28資訊網——每日最新資訊28at.com

<contenteditable virtualkeyboardpolicy="manual" id="editor"></div><script>  if ("virtualKeyboard" in navigator) {    navigator.virtualKeyboard.overlaysContent = true;    const editor = document.getElementById("editor");    editor.addEventListener("dblclick", () => {      navigator.virtualKeyboard.show();    });  }</script>

Summer:瀏覽器支持

注意,虛擬鍵盤 API 是一個實驗性功能,其支持性不是很好:rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

2、問題探討 Summer IS HERE

上面介紹了虛擬鍵盤 API 的基本使用,聽起來可能比較抽象,下面就來看一個實際的例子,通過這個例子來深入討論問題的細節。rgt28資訊網——每日最新資訊28at.com

這是一個具有以下內容的 UI:rgt28資訊網——每日最新資訊28at.com

  • 粘性標題
  • 粘性浮動操作按鈕

rgt28資訊網——每日最新資訊28at.com

當用戶專注于輸入時,虛擬鍵盤就會顯示。這時,瀏覽器將向上滾動以使輸入位于鍵盤上方,因此粘性標題和浮動按鈕將消失??雌饋硐袷沁@樣的:rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

一般來說,這是移動瀏覽器中的默認行為。從用戶體驗的角度來看,隱藏部分 UI 可能會很困惑,尤其是那些與鍵盤處于激活狀態時正在執行的當前操作相關的部分。rgt28資訊網——每日最新資訊28at.com

在幕后,發生的事情類似于下圖這樣:rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

用技術術語來說,可見部分稱為視覺視口,隱藏部分+頁面上所有元素的其余部分稱為布局視口。rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

這時問題就出現了:當虛擬鍵盤處于激活狀態時,視覺視口的尺寸會縮小。rgt28資訊網——每日最新資訊28at.com

下面來使用虛擬鍵盤 API 修復隱藏在鍵盤下的內容。借助虛擬鍵盤 API,可以定義視覺視口和布局視口是一樣的。這樣就可以使用以下 CSS 環境變量來檢測鍵盤位置和尺寸:rgt28資訊網——每日最新資訊28at.com

  • keyboard-inset-top
  • keyboard-inset-right
  • keyboard-inset-bottom
  • keyboard-inset-left
  • keyboard-inset-width
  • keyboard-inset-height

rgt28資訊網——每日最新資訊28at.com

通過使用上述變量,可以在虛擬鍵盤處于激活狀態時更改布局。rgt28資訊網——每日最新資訊28at.com

Summer:啟用虛擬鍵盤 API

默認情況下,虛擬鍵盤 API 是不可用的,需要使用 Javascript 來啟用它。rgt28資訊網——每日最新資訊28at.com

if ("virtualKeyboard" in navigator) {  navigator.virtualKeyboard.overlaysContent = true}

這有點奇怪,還需使用 Javascript 來啟用。當然,我們也可以使用這樣的 meta 標簽來啟用:rgt28資訊網——每日最新資訊28at.com

<meta  name="viewport"  content="width=device-width, initial-scale=1.0, virtual-keyboard=overlays-content"/>

或者使用 CSS 屬性:rgt28資訊網——每日最新資訊28at.com

html {  virtual-keyboard: overlays-content;}

Summer:虛擬鍵盤 API 的用例

底部固定操作

在較小的視口上,我們可能需要將按鈕或頁腳固定在 UI 底部:rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

當輸入框處于激活狀態時,checkout 按鈕將位于虛擬鍵盤下方,因此它被隱藏了。rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

可以使用虛擬鍵盤 API 輕松解決這個問題:rgt28資訊網——每日最新資訊28at.com

input {  font-size: 16px;}.cta {  bottom: env(keyboard-inset-height, 0);}

在移動設備上,bottom 值將等于鍵盤高度,從而用該值偏移 checkout 按鈕。 如果瀏覽器不支持該 API,則默認為零。rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

可以看到,由于頭部和固定底部的存在空間減少了。如果垂直空間足夠,就可以使用垂直媒體查詢來顯示頭部。rgt28資訊網——每日最新資訊28at.com

無法滾動到頁面的最后

當頁面底部有一個使用 position: fixed 定位的元素時,通常會添加一個 padding-bottom 來抵消頁面高度,以便用戶可以滾動到最底部。rgt28資訊網——每日最新資訊28at.com

例如,假設有一個位于頁面底部的固定定位元素,就可以通過為內容區域添加一個與該元素(cta)高度相等的 padding-bottom 來實現滾動到頁面最底部:rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

body {  --cta-height: 60px;  padding-bottom: var(--cta-height);}.cta {  bottom: env(keyboard-inset-height, 0);}

padding-bottom應該是一個等于或大于固定元素高度的值。rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

那么當使用虛擬鍵盤時會發生什么呢?考慮以下示意圖:rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

當虛擬鍵盤處于激活狀態時,使用固定元素的高度作為padding-bottom的值是不夠的。我們需要將鍵盤高度也考慮在內。如下所示:rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

為了解決這個問題,就需要檢測輸入框是否處于焦點狀態,并根據焦點狀態來改變padding-bottom的值。rgt28資訊網——每日最新資訊28at.com

body:has(input:focus) {  padding-bottom: calc(    var(--cta-height) + env(keyboard-inset-height, 0)  );}

那在桌面瀏覽器上會發生什么呢?這種情況下,env() 函數將回退到 0,并且將得到 var(--cta-height) 的值。rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

浮動操作按鈕

在頁面右下角有一個浮動操作按鈕。rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

當虛擬鍵盤激活時,懸浮按鈕應該移動到虛擬鍵盤上方。但是,就像最初的例子中一樣,浮動按鈕會被鍵盤遮擋。rgt28資訊網——每日最新資訊28at.com

為了解決這個問題,可以使用 env(keyboard-inset-height) 值。rgt28資訊網——每日最新資訊28at.com

.fab {  bottom: calc(1rem + env(keyboard-inset-height, 0rem));}

這里使用了 1rem 加上鍵盤的高度,以避免懸浮按鈕直接位于鍵盤頂部邊緣。在使用 CSS 比較函數時,需要注意的是,在 env() 函數中使用無單位的數值作為回退值會導致 Safari 上的整個布局出現問題,所以必須添加 rem 單位。rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

對桌面使用不同的值

假設想在桌面瀏覽器上稍微偏移懸浮按鈕,該怎么做呢? 可以使用 max() 比較函數,它是有效的。rgt28資訊網——每日最新資訊28at.com

.fab {  bottom: max(2rem, 1rem + env(keyboard-inset-height, 0rem));}

它的工作原理如下:rgt28資訊網——每日最新資訊28at.com

  • 比較函數將在兩個值之間進行比較。由于在桌面上,env(keyboard-inset-height) 的計算結果為零,所以最大值是 2rem。
  • 在移動設備上,最大值是第二個值。

rgt28資訊網——每日最新資訊28at.com

Summer:聊天布局

先來看下面的圖:rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

當虛擬鍵盤激活時,標題和消息輸入框都會被隱藏起來。可以使用 env(keyboard-inset-height) 作為 grid-row 屬性的值。rgt28資訊網——每日最新資訊28at.com

.layout {  display: grid;  grid-template-rows: auto minmax(0, 1fr) auto env(keyboard-inset-height, 0);  height: 100dvh;}

以下是經過上述修復后的效果:rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

LinkedIn 帖子表單和導航

虛擬鍵盤 API 一個很適用的例子就是 Linkedin 帖子的表單和導航的顯示方式。rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

帖子表單和導航固定在底部。當用戶激活輸入框時,它看起來像這樣:rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

注意,垂直空間太小。該怎么辦呢?通過使用比較函數和虛擬鍵盤 API,可以在顯示鍵盤時隱藏導航。rgt28資訊網——每日最新資訊28at.com

.post-form,.nav {  position: fixed;  left: 0;  right: 0;}.post-form {  bottom: max(48px, env(keyboard-inset-height, 0px));}.nav {  bottom: max(0px, env(keyboard-inset-height, 0) - 100px);}
帖子表單

默認狀態下,表單距離底部偏移 48px。 在此狀態下,max() 函數的第二部分處于非激活狀態。rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

當虛擬鍵盤激活時,max() 函數的第二個部分將生效,bottom 值將變為鍵盤的高度。rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

導航

導航欄的位置是 bottom: 0?,F在激活的是 max() 函數的第一部分。rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

當虛擬鍵盤激活時,我們將把導航欄移動到鍵盤下方。這里的 100px 是一個隨機數,重點是添加一個大于導航欄高度的值。rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

效果如下:rgt28資訊網——每日最新資訊28at.com

rgt28資訊網——每日最新資訊28at.com

Summer:參考資料rgt28資訊網——每日最新資訊28at.com

  • https://developer.mozilla.org/en-US/docs/Web/API/VirtualKeyboard_API。
  • https://ishadeed.com/article/virtual-keyboard-api/。

本文鏈接:http://m.yifxia.cn/showinfo-26-141-0.html虛擬鍵盤 API 的妙用

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: .NET 程序的 GDI 句柄泄露的再反思

下一篇: 一文掌握 Golang 模糊測試(Fuzz Testing)

標簽:
  • 熱門焦點
Top 日韩中文字幕一区| 日韩av成人| 欧美激情影院| 午夜激情视频在线播放| 天天做日日爱| 成人影视在线观看| 韩国毛片免费大片| 人人干人人草| a级黄色毛片免费播放视频| 久久99这里只有精品国产| 日韩欧美一二三区| 精品国产香蕉伊思人在线又爽又黄| 精品视频免费看| 国产不卡高清| 国产成人女人在线视频观看| 中文字幕一区二区三区精彩视频| 日韩在线观看视频网站| 久久成人亚洲| 欧美电影免费| 日本伦理片网站| 成人影院一区二区三区| 成人a级高清视频在线观看| 成人影视在线播放| 黄色免费三级| 黄视频网站免费观看| 久久99这里只有精品国产| 午夜欧美成人久久久久久| 国产国语在线播放视频| 精品国产一区二区三区免费 | 美女免费精品高清毛片在线视 | 欧美a免费| 精品视频在线观看免费| 高清一级做a爱过程不卡视频| 黄色福利| 亚洲爆爽| 九九久久国产精品| 久久99中文字幕| 欧美激情一区二区三区视频 | 美女免费黄网站| 美女免费精品高清毛片在线视 | 精品视频一区二区| 成人a大片高清在线观看| 成人a级高清视频在线观看| 四虎久久精品国产| 国产成a人片在线观看视频| 青青青草影院 | 日韩在线观看视频网站| 国产91素人搭讪系列天堂| 麻豆网站在线看| 欧美激情一区二区三区在线播放 | 九九久久国产精品| 天堂网中文字幕| 香蕉视频三级| 精品视频在线看| 国产国语对白一级毛片| 99热精品在线| a级黄色毛片免费播放视频| 久久99中文字幕| 黄视频网站免费看| 欧美电影免费| 日韩专区亚洲综合久久| 日韩免费在线视频| 黄色免费三级| 国产成人精品综合| 91麻豆精品国产高清在线| 久久久成人网| 韩国三级视频网站| 精品视频在线观看一区二区三区| 国产高清在线精品一区a| 欧美α片无限看在线观看免费| 久草免费在线视频| 日本在线播放一区| 国产高清在线精品一区a| 国产视频一区二区在线观看| 可以免费看污视频的网站| 日韩欧美一及在线播放| 久久精品道一区二区三区| 美女免费毛片| 国产激情一区二区三区| 日韩在线观看视频黄| 日本在线不卡视频| 亚洲精品久久玖玖玖玖| 国产不卡在线观看| 免费的黄视频| 夜夜操网| 国产91精品一区二区| a级精品九九九大片免费看| 成人a大片高清在线观看| 黄色免费网站在线| 精品在线视频播放| 毛片高清| 91麻豆国产| 日韩中文字幕一区| 一级片片| 久久精品店| 国产亚洲男人的天堂在线观看| 国产不卡高清在线观看视频| 毛片电影网| 可以免费看毛片的网站| 韩国毛片免费| 你懂的国产精品| 国产精品免费精品自在线观看| 日韩一级黄色片| 国产91丝袜在线播放0| 久久国产精品永久免费网站| 国产高清在线精品一区a| 日日夜人人澡人人澡人人看免| 精品视频在线看| 亚洲精品中文一区不卡| 欧美电影免费看大全| 青草国产在线| 亚洲精品久久玖玖玖玖| 可以免费在线看黄的网站| 久久精品免视看国产明星| 日韩专区亚洲综合久久| 久久精品成人一区二区三区| 黄视频网站在线观看| 欧美电影免费看大全| 一级女性全黄生活片免费| 在线观看成人网| 国产伦久视频免费观看视频| 色综合久久天天综合绕观看| 国产一级强片在线观看| 天天做日日干| 亚欧成人毛片一区二区三区四区 | 国产亚洲男人的天堂在线观看| 高清一级片| 999久久66久6只有精品| 欧美大片aaaa一级毛片| 久久99中文字幕| 国产精品免费久久| 精品国产三级a∨在线观看| 欧美激情一区二区三区在线| 国产国语在线播放视频| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日韩免费在线视频| 日韩av片免费播放| 日日夜夜婷婷| 免费一级生活片| 成人免费高清视频| 99热视热频这里只有精品| 一 级 黄 中国色 片| 国产精品自拍在线| 精品国产一区二区三区久久久蜜臀| 成人高清视频免费观看| 日本在线不卡视频| 欧美一级视频高清片| 麻豆污视频| 国产成人精品影视| 久久精品欧美一区二区| 一级女性全黄久久生活片| 黄视频网站免费看| 一级毛片视频免费| 精品视频在线观看一区二区三区| 九九免费精品视频| 青青久在线视频| 精品久久久久久中文字幕一区| 日日爽天天| 午夜激情视频在线观看| 久久国产精品自由自在| 欧美国产日韩在线| 日韩一级黄色片| 一级毛片视频免费| 夜夜操网| 成人影院久久久久久影院| a级黄色毛片免费播放视频| 国产精品1024在线永久免费| 国产精品免费久久| 999精品视频在线| 国产精品自拍一区| 高清一级毛片一本到免费观看| 99色视频在线观看| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 亚洲www美色| 成人免费网站视频ww| 亚欧乱色一区二区三区| 精品视频一区二区| 九九免费高清在线观看视频| 欧美激情影院| 国产a毛片| 999久久狠狠免费精品| 青青久久国产成人免费网站| 日韩在线观看视频网站| 国产美女在线一区二区三区| 国产国语在线播放视频| 精品视频免费看| 国产精品自拍在线| a级毛片免费全部播放| 成人高清免费| 免费国产在线观看| 国产视频一区二区在线观看| 久草免费在线观看| 四虎影视库| 香蕉视频久久| 午夜激情视频在线观看 | 国产一区精品| 青青久久国产成人免费网站| 精品国产一区二区三区久久久狼| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 亚欧视频在线|