当前位置:   article > 正文

微信小程序之解决键盘与页面scroll-view问题_小程序scroll-view输入框弹起

小程序scroll-view输入框弹起

场景介绍:

在编写小程序类似微信聊天页面时,常常遇到这样情况:

a/ 键盘弹出或收起时,聊天消息没有自动滚到最底部。

b/ 点击输入框弹出软键盘后,遮盖部分聊天内容。

解决方式:

一,解决问题a

将聊天页面的所有msg都编号如:msg-0,msg-1,msg-2… 直接锁定最后一条msg,滚动到那里即可。

步骤:

1,在scroll-view标签中添加:scroll-into-view='{{toView}}'
2,在wx:for后面添加:wx:for-index="index"
3,在每个msg布局中添加:id='msg-{{index}}'
4,在js文件中:

  1. this.setData({
  2. toView: 'msg-' + (msgList.length - 1)
  3. })

二,解决问题b

步骤:

1,将input的自动向上推给关掉,注意有坑:在input组件中添加:adjust-position='{{false}}',而不是:adjust-position='false'。此时页面不再向上推,但软键盘弹起时,会遮挡部分的聊天消息。

2,当软键盘弹起时,将scroll-view的高度缩短至软键盘遮挡不到的屏幕上方部分,当软键盘收起时,再将scroll-view的高度还原即可。

input中的bindfocus='focus'可获取软键盘高度并监听软键盘弹起,bindblur='blur'可监听软键盘收起,var windowHeight = wx.getSystemInfoSync().windowHeight;可获得屏幕高度。

scrollHeight(滚动条高度) = windowHeight(屏幕高度) - 软键盘高度 - input输入框高度;

 

代码示例:

index.wxml

  1. <scroll-view style='height: {{scrollHeight}}; margin-top:{{marheight}}px' scroll-y="true" scroll-into-view='{{toView}}' >
  2. <!-- 循环渲染历史记录 messages -->
  3. <view class='dialog' wx:for="{{messages}}" wx:for-index="index" id='msg-{{index}}'>
  4. <view style="height: 30px;margin: auto;font-size: 24rpx;color: #aaa;text-align:center">{{item.time}}</view>
  5. <!-- 居左 -->
  6. <view wx:if="{{item.duixiangtype==2}}">
  7. <!-- 头像 -->
  8. <image src="../../img/2.png" style='float:left'></image>
  9. <!-- 文本消息,可能随带有表情,得用富文本编辑器rich-text -->
  10. <view>
  11. <rich-text nodes="{{nodes[index]}}" class='ctext' selectable='true'></rich-text>
  12. </view>
  13. </view>
  14. <!-- 居右 -->
  15. <view wx:else>
  16. <!-- 微信头像 -->
  17. <view class='frImg' style="width: 40px;height: 40px;clip-path: circle(40rpx at center);">
  18. <open-data type="userAvatarUrl" ></open-data>
  19. </view>
  20. <!-- 文本消息,可能随带有表情,得用富文本编辑器rich-text -->
  21. <view>
  22. <rich-text nodes="{{nodes[index]}}" class='ctext frText' selectable='true'></rich-text>
  23. </view>
  24. </view>
  25. </view>
  26. </scroll-view>

index.js

  1. //获取应用实例
  2. const app = getApp();
  3. var keyHeight = 0; //键盘的高度
  4. var inputHeight = 60; //输入框的高度
  5. var windowWidth = wx.getSystemInfoSync().windowWidth;
  6. var windowHeight = wx.getSystemInfoSync().windowHeight;
  7. Page({
  8. data: {
  9. messages:[], //历史纪录
  10. marheight: 0, //键盘弹起时,输入框距离底部高度
  11. scrollHeight: '100vh', //可滑动区域高度
  12. inputBottom: 0, //输入框距离底部的高度
  13. }
  14. /*
  15. * 生命周期函数--监听页面加载
  16. */
  17. onLoad: function(options) {
  18. var that = this;
  19. var nodes_data = [];
  20. wx.request({
  21. url: ,
  22. method: "POST",
  23. data: {},
  24. header: {
  25. 'content-type': 'application/x-www-form-urlencoded'
  26. },
  27. success: function (res) {
  28. var data = res.data;
  29. //判断是否存在历史记录
  30. if(!data){
  31. return;
  32. }
  33. that.messages = [];
  34. that.setData({
  35. messages: that.messages.concat(data)
  36. })
  37. //追加添加欢迎提示语
  38. var date = new Date();
  39. var h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
  40. var m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes());
  41. that.time = h + m;//获取当前时间
  42. var huan = {
  43. time:that.time,
  44. duixiangtype:2,
  45. speech:'您好,欢迎咨询',
  46. };
  47. that.data.messages.push(huan);
  48. that.setData({
  49. messages: that.data.messages,
  50. })
  51. //定位到最新消息
  52. that.setData({
  53. scrollHeight: (windowHeight - inputHeight) + 'px',
  54. inputBottom: 0+ 'px'
  55. })
  56. that.scroll();
  57. //判断是否有表情,转化为线上资源
  58. for (var i = 0; i < that.data.messages.length;i++) {
  59. if (that.data.messages[i].msg.indexOf("[face_") !==-1) {
  60. that.nodes = that.data.messages[i].msg.replace(/\[face_([0-9]*)\]/g, '<img style="width: 20px;height: 20px;margin:0 2px;margin-top:5px;" src="https://你的线上域名/$1.png"/>');
  61. nodes_data.push(that.nodes);
  62. }else {
  63. nodes_data.push(that.data.messages[i].msg);
  64. }
  65. }
  66. that.setData({
  67. nodes:nodes_data
  68. })
  69. },
  70. fail: function (res) {
  71. }
  72. })
  73. },
  74. // 发送消息定位最新消息
  75. scroll:function(e) {
  76. this.setData({
  77. toView: 'msg-' + (this.data.messages.length - 1)
  78. })
  79. },
  80. //获取聚焦(软键盘弹出)
  81. focus: function(e) {
  82. keyHeight = e.detail.height;
  83. this.setData({
  84. scrollHeight: (windowHeight - keyHeight - inputHeight) + 'px'
  85. });
  86. this.setData({
  87. toView: 'msg-' + (this.data.messages.length - 1),
  88. inputBottom: keyHeight + 'px'
  89. })
  90. },
  91. //失去聚焦(软键盘消失)
  92. blur: function(e) {
  93. this.setData({
  94. scrollHeight: (windowHeight - inputHeight) + 'px',
  95. inputBottom: 0+ 'px',
  96. })
  97. this.setData({
  98. toView: 'msg-' + (this.data.messages.length - 1)
  99. })
  100. },
  101. })

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/668850
推荐阅读
相关标签
  

闽ICP备14008679号