应用场景:
自定义封装了一个弹层,使用position:fixed,弹层内有input和textarea,这种组合会导致在苹果手机上出现一个问题:
问题描述:
当input和textarea获取焦点后,整个页面会被上推一段距离,输入完成后,在失去焦点的时候,页面未被还原,导致弹层实际可操作区域与显示区域错位,错位的上下距离就是页面被上推的距离;
解决办法:
先给input、textarea绑定blur方法:
<textarea @blur="_ipt_blur"/>
<input @blur="_ipt_blur"/>
再在页面methods内添加自定义方法_ipt_blur,问题解决
_ipt_blur(){
uni.pageScrollTo({
scrollTop: 0,
duration: 0
});
},
那么新的问题来了,如果原先页面有滚动条,而且页面已经滑了一段距离,当失去焦点时,上诉操作会将页面置顶,这无疑用户体验不好,所以需要处理下;
在页面的生命周期函数同级新增监听页面滚动函数,并记录下页面滚动的距离scrollTopPX :
onShow() {
},
//监听滚动条滚动的距离
onPageScroll(res){
this.scrollTopPX = res.scrollTop;
},
在_ipt_blur内将scrollTopPX 赋值给scrollTop,问题解决;
methods: {
_ipt_blur(){
uni.pageScrollTo({
scrollTop: this.scrollTopPX,
duration: 0
});
},
}
无意中发现的问题:
处理问题途中还碰到了另外一个问题:input输入框在输入文字时不能实时显示,只有当失去焦点后才会显示,而且删除文字时,,比如删除2个文字,光标左移了两位,但输入框显示的还是未删除的文本,也是只有当失去焦点后才显示正确;
刻意中发现的解决办法:
给input添加如下样式(这里感谢这位前辈了,我是前辈o(* ̄︶ ̄*)o):
-webkit-transform: translate3d(0, 0, 0);