移动端虚拟键盘引发的问题分析

我在工作的过程中无论是与原生结合的Hybird的H5页面或者微信公众号页面都会遇到当触发键盘输入行为时,页面窗口往上离开屏幕(与iOS的适配)或者页面高度变小(在微信中打开页面等),现在我们来分析一下各种情况以及解决的方法。

iOS中页面往上顶的情况

// 兼容ios弹出键盘改变页面问题
if (_browser.versions.ios) { //判断是否为ios环境
    $('body').on("blur", 'input', function() { //用原生js的addEventListener也是可以的
    setTimeout(function() {
        var scrollHeight = document.documentElement.scrollTop || document.body.scrollTop || 0;
            window.scrollTo(0, Math.max(scrollHeight - 1, 0));
         }, 100);
    })
};

Tips:

  • _browser.versions.ios
    用于判断是否为ios环境,详情可见本人另一篇文章《判断环境为iOS或Android》,当然你也可以用你自己的判断方法。

  • blur
    当在ios环境中,点击input或者textare都会触发虚拟键盘弹出以及改变页面高度,这时候当我们收起键盘时想要将页面高度还原就相当于当失去焦点的时候页面滚动回底部。(在最近一点版本的safair中我却发现页面会主动的还原,而微信公众号打开的页面却不会,这可能是新版的safair已经修复了这个问题,而微信的浏览器内核依旧是旧版本的safair内核)。

  • setTimeout
    这个定时器是为了在页面恢复高度的时候显得更加平滑,这个看项目情况自主设置。

  • 获取当前页面的滚动条纵坐标位置
    在标准w3c下,document.body.scrollTop恒为0,但是某些内核中又不含有document.documentElement.scrollTop,所以我们需要这样获取滚动条高度:
    var scrollHeight = document.documentElement.scrollTop || document.body.scrollTop || 0;

  • window.scrollTo(xpos,ypos)

参数 作用
xpos 要在窗口文档显示区左上角显示的文档的 x 坐标。
ypos 要在窗口文档显示区左上角显示的文档的 y 坐标。
  • Math.max(scrollHeight - 1, 0)
    防止取到null或者underfind

Android键盘遮挡输入框问题

//安卓键盘遮挡问题
if (_browser.versions.android) {
    window.addEventListener("resize", function() {
    if (document.activeElement.tagName == "INPUT" || document.activeElement.tagName == "TEXTAREA"){
        window.setTimeout(function() {
           document.activeElement.scrollIntoViewIfNeeded();
        }, 0);
    }
  })
};

Tips:

  • resize
    为监听页面发生变化时触发的事件,这是应为Android弹出虚拟键盘的效果与ios是不一样的,Android相当于将窗口高度缩小,所以才不会像ios那样出现下面空白。

  • document.activeElement
    此API为获取当前活动元素,包含聚焦。

  • document.activeElement.scrollIntoViewIfNeeded();
    这个API的作用就是把绑定的元素移动到可见区域,当然要是你在ios中也有遮挡问题,也可以这么设置。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 给大家推荐一个提高效率的工具,今天刚发现的。原来电脑也可以用搜狗输入法语音输入!识别率相当高(下图的测试语音都没有...
    身体棒棒阅读 3,180评论 4 3
  • 我们公司是一家做康复医疗信息化的公司,因为意图往互联网公司转型,因此计划开发一款专门针对康复患者的APP, 经过多...
    最后的机器人阅读 3,379评论 0 0
  • 【执子之手】儿童学习力六期 践行记录20170728Day74 1.今天继续重复指读忆江南、望天门山、题西林壁、晓...
    cancan妈阅读 952评论 0 0
  • 大年三十上午,我们去动物园遛娃,老爸老妈在厨房准备中饭;下午我们带娃,老爸老妈包水饺、蒸豆沙枣包;晚上十点多,我们...
    九五自尊阅读 2,299评论 0 1