素材牛VIP会员
手机键盘弹出遮盖了表单输入框
 一***句  分类:JavaScript  人气:709  回帖:2  发布于6年前 收藏

正常登录页面点击输入框获取焦点后,手机的键盘从底部弹出,然后表单应该跟着被顶上去,但是在一些手机自带的浏览器上键盘弹出后表单并没有被顶上去,导致下面的密码输入框被键盘遮挡了。

试过监听window的resize事件,发现键盘弹出后resize事件并未触发,也就是说页面的高度没有变化(innerHeight、clientHeight等等各种Height全试过了),就好像键盘是脱离了浏览器一样。

然后又尝试通过获取焦点来判断键盘弹出,但键盘收起就无法判断,因为如果用户通过点击键盘右上角的收起按钮来收起键盘,输入框并不会失去焦点。而收起按钮又无法捕获到。想知道前端有什么方法可以解决这个问题。

PS:测试的是一加手机,在同一手机的chrome上则正常,表单被顶上去了。测试其他手机时大多数也正常(包括UC),但也有部分手机自带浏览器甚至连chrome都不行。

 标签:html5javascript

讨论这个帖子(2)垃圾回帖将一律封号处理……

Lv7 码师
yu***01 产品经理 6年前#1

分析原因

以安卓开发为例,浏览器通常依靠webview来加载html。
对于软键盘的弹出,有两种模式(可能术语用的不专业,但是意思肯定会讲明)

  • 挤压webview:也就是说webview的高度会发生变化,那么前端就会触发resize事件
  • 遮挡webview:软键盘这个控件会覆盖在webview上,也就是说软键盘会把webview中的一部分内容给挡住。

不同浏览器上的差异,应该是浏览器对于软键盘的弹出模式,设置的不同导致的。

解决方案

首先,为了尽量避免表单元素被软键盘遮挡,应当尽量避开表单元素出现在下半屏的设计。
其次,如果避免不了此类设计,可以监听表单元素的获取焦点事件,然后提高html整体的高度。其实就是底部,多出一定的高度,预留给软键盘占位。
最后,可能需要监听一下页面的滚动,到了一定的位置(就是实际html的高度),把之前可能增加了的高度给去掉。

能想到的就以上这些了,希望能对你有所帮助。

Lv1 新人
10***19 学生 6年前#2

要想实现输入框弹上去很简单,只需要给表单注册获取焦点,和失去焦点两个事件即可。

  • 当获取焦点(onfocus)的时候,说明需要输入内容了,让表单相对于整个页面的top定位,位置自己判断,高于输入键盘高度即可。
  • 失去焦点(onblur)的时候,再让表单恢复到原来的位置就行了

注意:

  • 这里有一个问题,就是整体页面排版布局的问题,如果你的设计图本身有logo之类的,你就要考虑表单弹上去的时候会不会遮挡logo,此时就不是技术上的问题了,这就需要和设计那边沟通好了,劲量避免这种情况
  • 苹果手机是自带这个功能的,苹果手机输入的时候,表单会自动弹到输入框的上方
 文明上网,理性发言!   😉 阿里云幸运券,戳我领取