【踩坑】解决移动端软键盘压缩页面布局的问题 - 01

5,003 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

在最近的一次H5页面开发中,页面使用绝对定位或百分比,vh、vh来布局时软键盘压缩页面的问题,发现页面在移动端点击下方输入框的时候,会对页面布局产生影响:

  1. 唤起软键盘后,页面就被压缩;
  2. 解决上述问题后,又出现:input输入框开始输入文字后,页面又被压缩;

一、问题一解决方案:一进入页面,就将页面的高度固定下来,首先获取浏览器可视区的高度,然后把高度赋给页面根div。

var hrt = document.body.clientHeight;
<section className="game-room" id="gameRoom"  style={{ height: winh + "px" }}>

二、问题二解决方案:通过判断window.onresize前后大小,间接判断软键盘弹出,在对页面布局做处理,如改变position或设置容易大小为定值。

  1. 初始时获取到初始视口大小,然后存到localStorage或其他本地存储里,然后设置成最外层容器大小,然后内部就可以用百分比设置布局了。
var winh = document.body.clientHeight;
window.localStorage.setItem("curwinh", winh);
  1. 监听window.onresize,不论是否有软键盘,最外层容器始终和视口高度一致。
window.onresize = function () {
  var newh = window.localStorage.getItem("curwinh");
  document.getElementById("app").style.height = newh + "px";
}

如果软键盘弹出和收起时还有其他样式的变化,可以使用如下代码:

var clientHeight = document.documentElement.clientHeight || document.body.clientHeight;
window.onresize = function () {
  var nowClientHeight = document.documentElement.clientHeight || document.body.clientHeight;
  if (clientHeight > nowClientHeight) {
        //键盘弹出的事件处理
        document.getElementById("input-box").style.background = 'rgba(236,246,253,0.3)'

  } else {
    //键盘收起的事件处理
    document.getElementById("input-box").style.background = '#ecf6fd'
  }
}

这样就解决了当输入文字时,页面会压缩的问题了!

相关拓展:input 在移动端ios,获得焦点时,光标消失或错位。

-webkit-user-select:none 导致 input 框在 iOS 中无法输入,光标不出现,设置如下:

user-select: text; -webkit-user-select: text;

利用scrollIntoView 使当前元素出现到指定位置,避免光标错位,设置如下:

e.target.scrollIntoView(true); 
e.target.scrollIntoViewIfNeeded();