在聊天室的场景的下和用户进行聊天,
有以下的场景:
adjust-position 的属性为true
1、在聊天历史列表比较长,点击底部fixed 定位的输入框弹起手机键盘的时候,输入框上面的内容会自动向上推(涂黑部分是订单的卡片,也是聊天的历史)这个体验是可以接受的。
图一:
2、在聊天历史列表比较短的时候,点击键盘也会把内容会自动向上推 ,效果如下:
点击输入框之前:
点击输入框之后:
想到的解决方案:
能不能使用input组件的bindkeyboardheightchange(监听键盘高度变化)或者 bindfocus(聚焦)+bindblur(失去焦点)
获取键盘的高度来动态改变 adjust-position 属性的值来解决问题
过程:
这里 adjust-position 默认值分别设置两种情况:
一、.adjust-position: true 键盘弹起时,自动上推页面
1. 浏览历史长的时候不做处理,键盘唤起的时候,页面应该自动上推,体验正常
2.浏览历史比较短的时候,唤起键盘的时候, 这个需要计算浏览历史列表的安全距离
根据这个安全距离才能设置adjust-position 的开启,浏览历史的长度会有一个临界值
判断这个临界值,如果浏览历史的长度,小于临界值,则设置 adjust-position: false,唤起键盘不会向上推动页面
先测试只有一个聊天内容时候,第一次唤起键盘是如下的效果:
为什么还是会把页面的聊天内容挤上去,由于唤起键盘的时候,adjust-position 还是true
唤起键盘之后才能拿到键盘的高度,才能判断是否设置adjust-position为false.
点击第二次就正常了,由于点击第一次已经将adjust-position 设置为false,如图:
二、.adjust-position: false 键盘弹起时,不自动上推页面
1、聊天历史列表数据短的时候,就不测试了,效果和上图一样是正常的,
2、在聊天历史列表长的时候,在点击唤起键盘的时候,效果如下:
由于默认是 不自动上推页面 ,弹起键盘获取键盘高度的时候,adjust-position的值还是false
再点击第二次唤起键盘的时候,才能显示正常,如上面图一的截图。
造成这样原因归根到底是 在唤起键盘的时候,adjust-position的属性改变的操作是在
拿到键盘高度之后,键盘高度拿到之前界面就已经 被自动上推或者没有被推上去
第二次唤起键盘才能正常显示,不知道这种场景下如何解决,比如提早获取键盘的高度
计算出安全的聊天历史长度。希望各位大佬指导下。
我做过的是评论框,逻辑大概是 textarea 设置 adjust-position 不自动上推页面,当 textarea focus时,bindfocus 回调内会有键盘高度 e.detail.height (需要注意的是电脑端由于不会有键盘弹起,判断 keyboardHeight = e.detail.height || 0 如果对基础库没啥限制的话,还是使用wx.onKeyboardHeightChange 获取好一点)
textarea fixed布局,使用 transform: translate(0, {{-keyboardHeight}}px);
此外,如果当前页面为tabBar页面,那么 keyboardHeight = e.detail.height - tabBar高度
tabBar 高度计算:
// 没有自定义导航栏使用这个逻辑计算 const menuButtonInfo = wx.getMenuButtonBoundingClientRect(); wx.getSystemInfo({ success: res => { // 导航栏高度 = 状态栏到胶囊的间距(胶囊距上距离-状态栏高度) * 2 + 胶囊高度 + 状态栏高度 let navBarHeight = (menuButtonInfo.top - res.statusBarHeight) * 2 + menuButtonInfo.height + res.statusBarHeight; this.data.tabbarHeight = res.screenHeight - res.windowHeight - navBarHeight; console.log(`tabbarHeight=${this.data.tabbarHeight}px`); } }); // 自定义导航栏使用这个逻辑计算 wx.getSystemInfo({ success: res => { this.data.tabbarHeight = res.screenHeight - res.windowHeight; console.log(`tabbarHeight=${this.data.tabbarHeight}px`); } });
以上给你个思路参考。
微信小程序做聊天窗口也遇到了同样的问题,没有最优的方案来解决这个问题,感觉官网应该优化一下这块。
苹果手机更新到最新版本时,软键盘弹起,导致出现空白区域是怎么导致的