【小貼士】虛擬鍵盤與fixed帶給移動端的痛!

前言

今天來公司的主要目的就是研究虛擬鍵盤與fixed的問題,期間因為同事問起閉包與事件委托(阻止冒泡)相關問題,便穿插了一篇別的:

【小貼士】工作中的”閉包“與事件委托的”阻止冒泡“,有興趣的朋友可以去看看,因為首頁只能放一篇,這個就略去了

現在回到主要研究點,首先在移動端我們點擊文本框后會出現一個虛擬鍵盤, 虛擬鍵盤讓頁面可視區域得到了充分利用,但是也帶來了一些問題

問題源頭

移動端虛擬鍵盤出現的條件是:文本框(文本類)獲得焦點

但是文本框獲得焦點未必會彈出鍵盤!!!

收起虛擬鍵盤的條件是:文本框失焦

PS:總而言之,我們認為會出現或者消失虛擬鍵盤的時候都可能不工作

在移動設備上,如果文本框在上方,點擊不會有什么問題:
在設備的最下面的話,就有所不同了,整個塊會上移,以將input區域顯示出來

這個時候幾個棘手的問題就出現了:

① 虛擬鍵盤的出現對頁面來說是不可知的,這句話的理解是:沒有鍵盤出現事件,沒有辦法獲取鍵盤高度

② 鍵盤是“貼”在了viewport上,表面上不會對dom產生“任何”影響,但是這個時候一些定位元素的表現卻變得“怪異”

比如:





可以看到,無論淘寶或者新浪,這個問題都存在,現在比較普遍的解決方案都是:移動端不采用fixed屬性

于是我們來看看是否有其它方案

iscroll是否能解決

其實這個方案在周四的時候我便測試過了,但是結果讓人很遺憾



作為官方給出的例子,在虛擬鍵盤彈出來后,光標會亂跑,這個還可以接受,但是:

① 頭部不見了

② 偶爾不能顯示獲得焦點的input

這兩個問題就讓人難以接受了,于是,我們需要找到其他方案

解決方案

其實這個問題如果真要較真的話,我覺得需要深入研究兩個知識點:

① viewport的原理

② 虛擬鍵盤的原理

就我手里現有資源來說,兩個知識點一個都不深入,所以只能先從應用層面解決問題

應用層面解決方案

我們想到這么一個場景,如果我們能監控到鍵盤的行為,如果能的話,我們便可以

① 鍵盤彈出時候將fixed元素設置為static

② 鍵盤消失時候將fixed元素設置為fixed

那么我們能嗎???

雖然這個方案比較惡心,我們還真能......答案是監控dom變化!

監控鍵盤

監控的方式其實篩選下來也不過兩種:

① 時鐘setInterval不停監控

② 系統級別的監控,比如鍵盤出現時候通知window一個事件,但是很遺憾現在還沒有這個事件,但是這個事件等于

input類元素獲取焦點 == 彈出虛擬鍵盤

input類元素失去焦點 == 收起虛擬鍵盤

但是我們前面已經說過,上面的原則不一定可靠,所以該種方案也未必可靠了

基于系統監控這點,我們還可以監控resize事件或者scroll事件,但是經過我的測試,setInterval表現比較好

于是,我們簡單寫一段代碼,可靠是否滿足需求:

復制代碼
window.alert = function (msg) {
$('body').append('<div>' + msg + '</div>')
};
function fixedWatch(el) {
if(document.activeElement.nodeName == 'INPUT'){
el.css('position', 'static');
} else {
el.css('position', 'fixed');
}
}

setInterval(function () {
fixedWatch($('#headerview header'));
}, 500);
復制代碼
根據測試結果來說,是滿足我們的需求的,這里的header不會出問題,但是footer由于沒有處理仍然會錯位


于是這個問題似乎被我們修復了,但是你可以接受嗎???這個方案有一個致命的惡心點!

不停的監控dom變化,浪費資源

那么這個問題可優化么?

似乎是可優化的,但是依舊會帶來很多問題,優化的入口與出口便是input標簽的focus事件

至于其失焦相關的事件便不予關注了,因為可能由一個input跳到另一個input

復制代碼
setTimeout(function () {
$('#dl_app img').hide();
}, 100);

window.alert = function (msg) {
$('body').append('<div>' + msg + '</div>')
};

window.res = null;
var i = 0;

function fixedWatch(el) {
alert(i++);
if(document.activeElement.nodeName == 'INPUT'){
el.css('position', 'static');
} else {
el.css('position', 'fixed');
if(window.res ) { clearInterval(window.res ); window.res ?= null; }
}
}

$('input').focus(function () {
if(!window.res) {
fixedWatch($('#headerview header'));
window.res = setInterval(function () {
fixedWatch($('#headerview header'));
}, 500);
}
});
復制代碼
這樣的話,貌似能讓代碼看上去舒服一點,但是其代價卻是所有input類標簽都會多一個獲得焦點事件,依舊令人痛惜

結語

今天的學習暫時到此,對于虛擬鍵盤的出現其實可能還有其他的問題,舉一個例子來說:

如果我們點擊按鈕時候會出一個toast在中間,但是虛擬鍵盤剛好遮住了toast提示信息怎么辦呢?這個問題與上述問題其實是一致的

然后這個解決方案的可接受程度,以及其實際是否解決了問題又或者引起了其它問題就需要實際證明了

至于各位有什么好的解決方案,或者想法,可以討論討論哦!!!

好了,今天暫時到這里,我們下次繼續,如果有可能我們會詳細學習下viewport以及虛擬鍵盤相關



本文轉自葉小釵博客園博客,原文鏈接http://www.cnblogs.com/yexiaochai/p/3561939.html,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255920.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255920.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255920.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[OJ] Wildcard Matching (Hard)

LintCode 192. Wildcard Matching (Hard)LeetCode 44. Wildcard Matching (Hard) 第二次刷還是被這題虐. 其實就是跪在一個地方, 就是關于mustFail的地方. 當*p && !*s的時候, 說明s已經被用完了, p還沒有被窮盡, 這種情況下要直接退出所有的遞歸返回false, 因為s都匹配…

CSS3 -webkit-transition(屬性漸變)

-webkit-transition&#xff1a;CSS屬性(none|all|屬性) 持續時間 時間函數 延遲時間 CSS屬性(transition-property)&#xff1a;要變化的屬性&#xff0c;比如元素變寬則是width&#xff0c;文字顏色要變色這是color&#xff1b;W3C給出了一個可變換屬性的列表&#xff1a;…

vxworks的default boot line說明

boot程序的主要功能是引導vxworks 內核,所以boot程序需要知道vxworks的內核存放在何處&#xff0c;通過什么手段去獲取。在vxworks缺省的boot程序里有一條內建的default boot line,它指明了獲得vxworks內核的途徑&#xff0c;在boot程序啟動時&#xff0c;它先尋找NVRAM里面有無…

【機器視覺】——相機和鏡頭的選擇

目錄 1、相機選擇 2、鏡頭選擇 3、其他計算公式 1)芯片尺寸計算:

React Native中pointerEvent屬性

在React Native界面開發中, 如果使用絕對定位布局,在代碼運行時的某個時刻有可能會遮蓋住它的下方的某個組件。這是因為絕對定位只是說這個組件的位置由它父組件的邊框決定。 絕對定位的組件可以被認為會覆蓋在它前面布局&#xff08;JSX代碼順序&#xff09;的組件的上方. 如果…

Rar Java Zip

http://wolfdream.iteye.com/blog/428588轉載于:https://www.cnblogs.com/diyunpeng/p/5218381.html

庫卡機器人CELL程序解析

KUKA機器人 CELL程序 解析及注釋&ACCESS RVP&REL 4&COMMENT HANDLER on external automaticDEF CELL ( );EXT EXAMPLE1 ( );EXT EXAMPLE2 ( );EXT EXAMPLE3 ( ) ;FOLD INITDECL CHAR DMY[3]DMY[]"---";ENDFOLD (INIT);FOLD BASISTECH INIIR_STOPM ( )…

Ubuntu 16.04服務器安裝及軟件配置

1.配置靜態地址 vim /etc/network/interfaces auto enp1s0 iface enp1s0 inet static address 192.168.1.131 netmask 255.255.255.0auto enp2s0 iface enp2s0 inet static address 192.168.2.131 netmask 255.255.255.0auto enp3s0 iface enp3s0 inet static address 192.168.…

[軟件測試airtest軟件安裝]——填坑

目錄 1、安裝Python環境&#xff08;版本問題&#xff09; 2、連接手機出現連接上了但是無法進行點擊 airtest官網&#xff1a; https://airtest.doc.io.netease.com/for_newer/ 關于軟件測試剛入門的可以參考進行了解&#xff1a;https://airtest.doc.io.netease.com/tuto…

KUKA 機器人SPS.SUB程序解析

&ACCESS RVO&COMMENT PLC on controlDEF SPS ( );FOLD DECLARATIONS;FOLD BASISTECH DECL;Automatik externDECL STATE_T STAT定義STATE_T類型的變量。該結構為&#xff1a;STRUC STATE_T CMD_STAT RET1&#xff0c; CMD_STAT是枚舉類型數據&#xff0c;組成了STATE_…

jquery validate表單驗證插件

1 表單驗證的準備工作 在開啟長篇大論之前&#xff0c;首先將表單驗證的效果展示給大家。 1.點擊表單項&#xff0c;顯示幫助提示         2.鼠標離開表單項時&#xff0c;開始校驗元素    3.鼠標離開后的正確、錯誤提示及鼠標移入時的幫助提醒 對于初學者而言&…

【Python位運算】——左移操作(<<)右移操作>>

目錄 左移操作 右移操作 其他博主的理解 應用——力扣題目78. 子集 解法 深度優先搜索 位運算 參考文獻 左移操作 # 左移操作&#xff0c;左移一位相當于乘以b&#xff0c;a<<b,a a*(2^b) print(2<<3) # 2*2^3 16&#xff0c;2的二進制10&#xff0c;向…

sql中字段名中包含特殊字符的查詢方法

sql中字段名章包含特殊字符的查詢方法&#xff1a;例如包含""&#xff0c;student表中字段為&#xff1a;id“學號”、name"姓名"。 解決辦法&#xff1a;用英文下的 ""&#xff08;Tab鍵上面那個鍵,不需要shift&#xff09;把字段名包起來。如&…

tomcat Server.xml Context配置

有時候需要在tomcat里面做特殊的配置&#xff0c;來進行訪問&#xff1a; 例如你的程序 名字是hello端口是80 這時候你要訪問你的程序 就要用 localhost/hello 來訪問了。 但是怎么直接用 localhost來訪問呢&#xff1f;就需要進行tomcat 的配置了呢 看以下配置&#xff1a;to…

絕望,絕望、希望

晚上&#xff0c;經歷了一場小小的絕望&#xff0c;因為在論文方面&#xff0c;經過一些實踐檢驗&#xff0c;我發現之前所提出的理論竟然差別太大&#xff0c;這件事情讓人感到絕望&#xff0c;但是&#xff0c;也只有被逼繼續前行&#xff0c;沒有退路&#xff0c;前行才能慢…

【Python數據結構】——二叉查找樹(查找、構建、刪除、插入、打印)

#!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2021/7/15 0:34 # Author : linlianqin # Site : # File : 二叉查找樹類實現&#xff08;查找、創建、刪除、插入、遍歷&#xff09;.py # Software: PyCharm # description:class TreeNode:def __init__(s…

ABB RAPID SOCKET編程

相傳在2009年6月11日&#xff0c;微博的鼻祖t-w-i-t-t-e-r還沒有被封鎖的時候&#xff0c;于仁頗黎寫了了一個東西可以將staubli機器人在運行時的狀態&#xff0c;實時發送上去&#xff0c;可以被實時的查看&#xff0c;任何一個人都可以查看&#xff0c;于是就有了這個名為TWI…

Plupload文件上傳組件使用API

Plupload有以下功能和特點&#xff1a; 1、擁有多種上傳方式&#xff1a;HTML5、flash、silverlight以及傳統的<input type”file” />。Plupload會自動偵測當前的環境&#xff0c;選擇最合適的上傳方式&#xff0c;并且會優先使用HTML5的方式。所以你完全不用去操心當前…

廣告主產品推詞中的NLP

加詞&#xff0c;加產品&#xff0c;調價是廣告主的核心問題&#xff0c;為了解決廣告主加詞的問題在阿里巴巴以及速賣通的賬戶后臺提供了加詞利器——先知&#xff0c;一鍵解決廣告主煩惱&#xff0c;從此不再為加詞而憂愁。一 引言 在目前付費搜索引擎中&#xff0c;買詞和競…

Android 動態設置 layout_centerInParent

RelativeLayout.LayoutParams rp new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);rp.addRule(RelativeLayout.CENTER_IN_PARENT);記錄一下轉載于:https://www.cnblogs.com/IWings/p/6097134.html