H5混合开发软键盘适配方案

39次阅读

共计 1250 个字符,预计需要花费 4 分钟才能阅读完成。

<center><font size = “6px”>H5 混合开发软键盘适配方案 </font></center>

现象:

​ 当前端界面的输入框位于页面底部,键盘唤醒时,就会遮挡输入框。此时用户在输入时就不能看到已经输入的内容,造成很不好的用户体验。

思路分析:

​ 原生键盘的唤醒方式大概分为两种,一种是平铺在页面上,和页面不属于同一层级;另一种是键盘唤醒时将页面向上挤压,使其位于同一层级。这里我们采用第二种方案。当键盘唤醒时,将整个 webview 向上挤压,页面向上挤压的高度为键盘的高度。此时预想的结果是实现 qq 微信发送消息的效果。

实现方式:

android 代码:

cordova.getActivity().runOnUiThread(new Runnable() {
    @Override
    public void run() {cordova.getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
        callbackContext.success();}
});

在这里前端不需要做处理。本以为这个方案是最完美的。可是发现 ios11.1 和 ios11.2 不生效。这就很头疼了。为了适配 ios,不得不想新的解决思路。

改变思路:

​ 综合考虑了 android 和 ios 的版本问题,这里我们采用不同系统采用不同处理方式的方案。通过前端判断设备类型,在输入框获取焦点的时候,进行下一步处理。android 采取以上的实现方式。ios 就采取下面要说的这种方式。

ios 实现方式:

​ 根据 ios 的特性,我们采取前端处理的方式来实现。当前端获取到焦点时,将整个 body 向上推。类型于第一种方式,只不过是前端来处理。

前端代码:

var scrollTime;
var timerId;
if(typeof (device)!="undefined"&&device.platform=='iOS'){
    let num = 0;
    scrollTime = setInterval(function(){
       timerId = true;
       if (num < 9) {num++;} else {clearInterval(scrollTime);
       timerId = null;
       document.body.scrollTop = document.body.scrollHeight;
       return;
     }
      document.body.scrollTop = document.body.scrollHeight;
    },100)
}

下面来讲一下原理:

在获取焦点时,执行以上代码。因为键盘弹起有一个延迟,我们在这里写了一个定时器,来实现这个过度。就能实现类似于 qq 微信的效果了。

这里需要注意的是,在失去焦点的时候,我们要清除这个定时器。再执行

document.body.scrollTop = document.body.scrollHeight;

达到完美过度的效果。当然,想实现顺滑的效果,还是用原生写吧。

正文完
 0