摘要:問題概述問題移動端輸入框鍵盤喚起后定位好的元素跟隨頁面滾動了起來屬性失效了滿屏任性橫飛如下圖問題有第三方輸入法的機還會出現(xiàn)鍵盤彈出延遲,導(dǎo)致普通布局輸入框等位置靠下的被鍵盤擋住如下圖這個完成出來然后鍵盤再頂起完美解決方案在輸入框獲取焦點
問題概述
問題1:H5 web 移動端 輸入框, 鍵盤喚起后fixed定位好的元素跟隨頁面滾動了起來… fixed屬性失效了!滿屏任性橫飛, 如下圖:
問題2:有第三方輸入法的ios機還會出現(xiàn)鍵盤彈出延遲,導(dǎo)致普通布局 輸入框(input/textarea等) 位置靠下的被鍵盤擋住, 如下圖:
(這個"完成"出來, 然后"鍵盤"再頂起)
2016-11-04完美解決方案// CSS .scrollWrapper { position: absolute; left: 0; right: 0; bottom: 0; top:0; } bottomInput { position: absolute; bottom:0; left:0; right: 0; } // HTML注意: 下面解決ios鍵盤問題的是之前的舊方法, 還是有瑕疵, 可跳過看其他 解決思路 問題1:// javascript // 在輸入框獲取焦點, 鍵盤彈起后, 真的是一行代碼 var interval = setInterval(function() { document.body.scrollTop = document.body.scrollHeight }, 100)
不讓頁面整體滾動, 絕對布局滾動內(nèi)容, 局部滾動.
問題2:鍵盤完全彈出時, 判斷鍵盤是否在可視區(qū)域(即屏幕除去鍵盤占用的區(qū)域)
通過js來調(diào)整輸入框的位置;
鍵盤完全收起后, 調(diào)整鍵盤到頁面底部;
相關(guān)代碼 問題1:// HTML
// CSS .scrollWrapper { position: absolute;/* 絕對定位,進行內(nèi)部滾動 */ left: 0; right: 0; top: 0; bottom: 0; overflow-y: atuo;/* 或者scroll */ -webkit-overflow-scrolling: touch;/* 解決ios滑動不流暢問題 */ } footer { position: fixed; }問題2:
原因如下面兩張圖所示, 其實稍微注意一下, 可以看到原生輸入法比第三方輸入法少了一個tool bar, 就是這個罪魁禍?zhǔn)?
// 輸入框獲取焦點, 鍵盤完全彈出再調(diào)整輸入框位置(因ios鍵盤彈出不會觸發(fā)resize事件, 故延時600ms) // 選擇setInterval輪詢幾次更好 setTimeout(() => { // 掛載this上, 或者聲明一個全局變量, 用于在失去焦點時, 要不要執(zhí)行調(diào)整代碼(非第三方不調(diào)整) this.inputIsNotInView = this.notInView() if (this.inputIsNotInView) { // Width, Height: 分別是鍵盤沒有彈出時window.innerWidth和window.innerHeight // 88: 是第三方輸入法比原生輸入法多的那個tool bar(輸入時顯示帶選項) 的高度, 做的不是太絕, 高度是統(tǒng)一的 // ios第三方輸入法的tool bar 甚至 鍵盤也被當(dāng)作可視區(qū)域了(包含在鍵盤彈出時的window.innerHeight) if (Width != 750) { let bottomAdjust = (Height - window.innerHeight - 88) + "px" $(this.inputBoxContainer).css("bottom", bottomAdjust) } else { // "iphone 6 6s, 需要額外減去鍵盤高度432(見下圖), 還算有良心, 高度和原生保持一致") let bottomAdjust = (Height - window.innerHeight - 88 - 432) + "px" $(this.inputBoxContainer).css("bottom", bottomAdjust) } } }, 600) -------------------------------------------------------------------------------------- // 失去焦點, 鍵盤開始收起, 隱藏inputBox; 等鍵盤完全收起, 再顯示inputBox, 設(shè)置在底部, 避免閃跳 if (this.inputIsNotInView) { // display和opacity + bottom 會有閃跳 $(this.inputBoxContainer).css({ "opacity": 0, bottom: 0 }) setTimeout(() => { $(this.inputBoxContainer).css("opacity", 1) }, 600) } -------------------------------------------------------------------------------------- //判斷元素是否在可視區(qū)域,不在的話返回true, 在返回false notInView() { // getBoundingClientRect 是獲取定位的,很怪異, (iphone 6s 10.0 bate版表現(xiàn)特殊) // top: 元素頂部到窗口(可是區(qū)域)頂部 // bottom: 元素底部到窗口頂部 // left: 元素左側(cè)到窗口左側(cè) // right: 元素右側(cè)到窗口左側(cè) // width/height 元素寬高 let bottom = this.inputBoxContainer.getBoundingClientRect().bottom // 可視區(qū)域高度 - 元素底部到窗口頂部的高度 < 0, 則說明被鍵盤擋住了 if (window.innerHeight - bottom < 0) { return true } return false }
iphone 6 和 6s 奇葩現(xiàn)象
部分低端android機, 鍵盤收起后, 鍵盤區(qū)域顯示空白, 需重新設(shè)置height, 如圖:// android, 鍵盤彈起/收回會觸發(fā)resize事件 window.onresize = function () { // Height: 鍵盤沒有彈出時window.innerHeight if (Height == window.innerHeight) { $(this.scrollWrapper).css("height", window.innerHeight + "px") } }另外需要注意的是
js拿不到鍵盤的 彈起/收起 事件;
ios上鍵盤 彈起/收回 不會觸發(fā)window.resize事件;
android 4.4 以下, 鍵盤喚起時, 不僅會觸發(fā)resize, 而且會觸發(fā)scroll事件;
(如果有需要滑動失去焦點這個需求, 選擇touchMove, 不要選擇scroll)
ios之所以會遮擋輸入框, 是因為, 第三方輸入法的tool bar 或者 鍵盤也被當(dāng)做可視區(qū)域了(包含在鍵盤彈出時的window.innerHeight)
總結(jié)最后建議(ios已經(jīng)完美解決, 此建議可酌情忽略了), 類似這種需求,盡量不要放在屏幕下50%
轉(zhuǎn)場輸入評論, 微博等;
彈窗到可視區(qū)域上50%區(qū)域, 3G門戶;
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/87827.html
摘要:然而,并沒有直接監(jiān)聽軟鍵盤的原生事件,只能通過軟鍵盤彈起或收起,引發(fā)頁面其他方面的表現(xiàn)間接監(jiān)聽,曲線救國。軟鍵盤收起表現(xiàn)觸發(fā)輸入框以外的區(qū)域時,輸入框失去焦點,軟鍵盤收起??梢宰屲涙I盤彈起后,讓焦點元素再次滾到可視區(qū),強迫滾到位。 前言 最近一段時間在做 H5 聊天項目,踩過其中一大坑:輸入框獲取焦點,軟鍵盤彈起,要求輸入框吸附(或頂)在輸入法框上。需求很明確,看似很簡單,其實不然。從...
摘要:前言這是一個存在很久的歷史問題了,對于這樣一個具有普遍性的問題瀏覽器偏偏沒有給出解決方案,沒有方案還聊個什么別急,別急,接下來我們一起來扒一扒關(guān)于軟鍵盤高度和的問題我們先來看一個短片認(rèn)識一下這個問題問題描述當(dāng)操作者進行輸入操作的時候,彈起的 前言 這是一個存在很久的歷史問題了,對于這樣一個具有普遍性的問題瀏覽器偏偏沒有給出解決方案,what?沒有方案還聊個什么? 別急,別急,接下來我們...
閱讀 2527·2021-09-28 09:36
閱讀 1535·2021-09-22 15:33
閱讀 3666·2019-08-30 15:44
閱讀 1771·2019-08-29 13:14
閱讀 3172·2019-08-29 11:17
閱讀 1477·2019-08-29 11:03
閱讀 2936·2019-08-26 17:10
閱讀 708·2019-08-26 12:13