一 . 需求描述 :
在微信小程序中,常见的页面布局是顶部导航栏和底部输入框固定不动,中间内容部分自适应。但是当键盘弹起时整个页面被挤压,导致元素上移或被覆盖,业务希望在这种情况下,输入框能自动抬起至键盘上方,顶部导航栏保持固定,不被顶上去。效果如图所示:
二 . 错误处理方案:
方案1:直接在textarea组件中设置cursor-spacing="100",这样当键盘弹时,输入框虽然在键盘上方,但是顶部导航栏也被顶上去了,效果如图一:
方案2:直接在textarea组件中设置adjust-position="{{false}}",这样当键盘弹起时,虽然顶部导航栏固定不动,但是底部输入框被键盘遮挡,效果如图二:
三 . 正确处理方案:
1.定义底部输入框外层view距离底部距离的变量inputBoxBottom:
data:{
inputBoxBottom:0
}
2.在页面的onLoad生命周期中监听键盘事件,记录键盘弹起的高度,并将高度赋值给inputBoxBottom
onLoad(options: any) {
wx.onKeyboardHeightChange((res) => {
const height = res.height;
if (height > 0) {
this.onKeyboardShow(height);
} else {
this.onKeyboardHide();
}
});
},
onKeyboardShow(height: number) {
this.setData({
inputBoxBottom: height,
});
},
onKeyboardHide() {
// 处理键盘收起逻辑
this.setData({
inputBoxBottom: 0,
});
}
3.将inputBoxBottom变量设置给底部输入框外层的view标签:
<view class="input-box" style="bottom:{{inputBoxBottom}}px"></view>
4.设置textarea标签adjust-position="{{false}}",保证键盘弹起时,页面不会被顶起,只是底部输入框bottom变化而使输入框抬起至键盘上方:
<textarea adjust-position="{{false}}" ></textarea>