摘自:https://juejin.cn/post/6961757804491178014

问题

问题描述:

在ios手机中,当页面中包含有输入框时,点击输入框,键盘弹起,会让页面中被fixed的元素失效。所以造成了底部吸底和顶部吸顶的元素错位的问题。下面的视频中就出现了这个问题,吸顶元素被推到可视区之外去了,而吸底元素也被推到了键盘之上。

Gif 如下:

https://cdn.nlark.com/yuque/0/2022/webp/260235/1649689642339-c6ab1220-e6e8-4d2c-8088-6509ccb3997d.webp#clientId=ue4253c9d-3936-4&crop=0&crop=0&crop=1&crop=1&errorMessage=unknown error&from=paste&id=u56086508&margin=[object Object]&originHeight=1792&originWidth=828&originalType=url&ratio=1&rotation=0&showTitle=false&status=error&style=none&taskId=u3b797abb-aff4-4a9b-85be-a58e9059b44&title=

ui希望优化的点:

一开始,ui针对这个视频中出现的问题,提出了3个优化点: 1、希望吸顶元素能够继续吸顶 2、希望吸底元素能够继续吸底 3、希望当键盘弹起之后,输入框能够保持在键盘之上48px的距离

最终决定优化的点:

经过一番调研,在我搜集到的可行方法中,结合有限的时间因素,在和ui协调之后,将这3个优化点变成了下面这3个优化点。同时还参考网上文章,增加了一些特殊情况下可能出现问题的优化点。 1、吸顶元素能够继续吸顶 2、吸底元素(也就是按钮)能够在键盘弹出之后,出现在键盘的上方 3、键盘弹起,输入框出现在可视区内。(对于这点,ios本身是支持的,但是安卓却并不会主动让输入框出现在可视区域内) 4、对于部分ios系统下的部分微信webview内,发现软键盘收起时,滚动上去的页面没有滚动下来,造成了下面区域留出了一片灰色的区域。

先要弄懂的问题

解决这些问题之前,需要弄明白以下2个问题:

1、当键盘弹起来的时候,会发生什么

这里ios和安卓系统下表现的并不一致。这个参考了朱雷大佬提供的这个文章:WebView上软键盘的兼容方案

⚪️ IOS 软键盘弹起表现

在 IOS 上,输入框(input、textarea 或 富文本)获取焦点,键盘弹起,页面(webview)并没有被压缩,或者说高度(height)没有改变,只是页面(webview)整体往上滚了,且最大滚动高度(scrollTop)为软键盘高度。

⚪️ Android 软键盘弹起表现

同样,在 Android 上,输入框获取焦点,键盘弹起,但是页面(webview)高度会发生改变,一般来说,高度为可视区高度(原高度减去软键盘高度),除了因为页面内容被撑开可以产生滚动,webview本身不能滚动。

⚪️ IOS 软键盘收起表现

触发软键盘上的“收起”按钮键盘或者输入框以外的页面区域时,输入框失去焦点,软键盘收起。